编译原理

编译原理之词法分析程序的设计与实现

夙愿已清 提交于 2019-11-30 21:15:08
一、程序要求(以python为例)。 1.词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 2.程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 3.单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0 二、代码实现(以python为例)。    1.词法分析程序。 1 import re 2 3 strs = "if sum >= 1000 then x : x - 1;#"+" " 4 5 types = {'begin':1, 6 'if':2, 7 'then':3, 8 'while':4, 9 'do':5, 10

编译原理作业4

我的未来我决定 提交于 2019-11-30 15:05:58
1. 梳理第二章的内容,写一篇理解与总结。 答:通过第二章的学习,我学习了文法的直观概念、符号和符号串、文法和语言的形式定义、文法的类型、上下文无关文法及其语法树、句型的分析等重点知识。 总结: 1、语言是一个记号系统,完整的定义包括语法和语义两方面。 2、语法是一组说明语言的规则,文法是用来阐明这些语法规则的一个重要形式工具。 3、语义包括静态语义和动态语义,阐明语义要比语法困难的多。 2.尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则) 整数n n :: = 1 | 2 | ..... | 9 | 0 标识符i i :: = <字母> | {<字母> | <数字 >} 表达式e ::=[+|-]<项>{<加减运算符><项>} 条件语句 ::=if<条件>then<语句> 赋值语句 ::=<id>:=<表达式> 复合语句 ::=begin<语句>{;<语句>}end 函数 ::= <类型说明><函数名><复合语句> 来源: https://www.cnblogs.com/cnw834575008/p/11583461.html

编译原理随堂作业四—文法和语言知识梳理

久未见 提交于 2019-11-30 15:05:19
1.梳理第二章的内容,写一篇理解与总结。 第二章,我们学习了文法和语言 1)首先,我们得先了解一下文法的概念。类似于平常说的汉语,也都是有语法的。简单一句“我是大学生”,就包含了主语、谓语、和宾语,用EBNF来表示的话就是如下这样    <句子>::=<主语>|<谓语>   <主语>::=<代词>|<名词>   <代词>::=我|你|他|它   <名词>::=教师|大学生|.....   <谓语>::=<动词>|<直接宾语>   <动词>::=是|学习.....   <直接宾语>::=<代词>|<名词> 一个句子的成分有很多,符合上述规则的句子才能成为结构合法的句子。这种规则和对语言的描述我们称之为文法 2)规则 规则也称重写规则、产生式或生成式。举个栗子,比如有一个规则A-->a,则称它是一条关于A的产生式。在这块便要提到文法四元组 先定义一个文法G为文法四元组(V N ,V T ,P,S),其中 V N 为非终结符集;V T 为终结符集;P为规则或产生式的集合;S称作识别符或开始符。V N ,V T ,P是非空有穷集! 举个例子 给定一个文法G=(V N ,V T ,P,S),V N ={S},V T ={0,1},P={S-->0S1,S-->01},S为开始符号 S可以接下去产生0S1,0S1可以接着产生00S11,可以接着生成下去的S就是非终结的、 而当S--

编译原理第四次作业

淺唱寂寞╮ 提交于 2019-11-30 15:04:54
1. 梳理第二章的内容,写一篇理解与总结 在第二章学习主要学习了语法规则,以下为总结的本章的一些词语解释 最左推导:如果在推导的任何一步@=>B,其中@、B是句型,都是对@中的最左非终结符进行替换,则称这种推导为最左推导。 最右推导:与最左推导相反。 语法树:推导的图形表示,又称推导树。 二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义。含有二义性句子的文法是二义性的文法。有些语言,根本就不存在无二义性的文法,这样的语言称为二义性的语言。 短语:一棵子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的短语。 直接短语:分析树中只有父子两代的子树的所有叶结点自左至右排列起来,形成此句型相对于该子树根的直接短语。 句柄:分析树中最左边的那棵只有父子两代的子树的所有叶结点自左至右排列起来,就是该句型的句柄。 规则:形如α→β或α::=β的(α,β)有序对,其中α称为规则的左部,β称作规则的右部。这里使用的符号→(::=)读作“定义为”。例如A→a读作“A定义为a”。也把它说成是一条关于A的规则(产生式)。 句型:对于文法G=(V T ,V N ,S,φ),如果S=>@,则称@是当前文法的一个句型。 句子:仅含有终结符号的句型是文法的一个句子。 语言:文法G产生的所有句子组成的集合是文法G所定义的语言。 0型文法:0型文法(PSG): α∈(V N ∪V T

绪论(编译原理知识点总结)

久未见 提交于 2019-11-30 14:58:09
低级语言:   机器语言、汇编语言 高级语言:   不依赖具体机器、但也得翻译(编译)成机器语言、Fortran第一个高级语言 翻译:   指将某种语言的源程序 逻辑等价 转换为另一种语言——目标语言程序 编译:   高级语言一次性转化为低级语言程序( 全文翻译 ) 解释:   高级语言每一句执行出结果再执行下一句( 口译 ) 语言类型:   编译型(C、C++、Pascal、Delphi):生成目标程序     效率高、依赖编译器、跨平台性差   解释型(BASIC、UNIX Shell、网络浏览器(HTML...))     效率低、跨平台性好   特殊型(Java)     先编译较低级字节码程序,再编译成机器语言 解释和编译的主要区别:   1、 解释不产生目标代码,边解释边执行,类似口译     编译产生可执行的目标代码,而后运行,类似全文翻译   2、 解释程序跨平台性好而编译程序不好   3、 解释程序运行效率低而编译程序效率高   4、 解释程序可随时修改代码,立刻生效,直接运行看效果      而编译程序都要重新编译,生成机器码文件 高级语言程序编译过程   输入:源程序  输出:目标程序   五个阶段:     词法分析     语法分析     语义分析以及生成中间代码     中间代码优化     目标代码生成 词法分析   任务

编译原理 四

瘦欲@ 提交于 2019-11-30 12:33:53
1. 梳理第二章的内容,写一篇理解与总结。 当我们要描述一种语言时,需要给出这种语言的所有句子,当句子的数目是有限可数时,就要都列出来;当句子 是一个无穷集,也就是无限不可数时,就要给出可以表示它们的结构的描述方法或者说,句子的组成规则。这种 规则就是文法。 从形式上用于描述和规定结构的称为文法(或者说语法) 一、文法的定义: 文法G定义为一个四元组(VN,VT,P,S),其中, VN为非终结符集合,VT终结符集合;P是产生式结合;S称为识别符或开始符号,也是一个非终结符,至少要在一 条产生式的左边出现。 出现了几个名词,终结符、非终结符、产生式、识别符/开始符号等。下面具体聊聊这些名词和文法的定义。 VN是非终结符集合,非终结符N指的是可以被拆分的字符或串,它采取递归定义:一个非终结符是由终结符和至少 一个非终结符组成的串,相对应的,终结符就是不可拆分的,语言中要用到的字符。所以VN中所存储的是所有的 非终结符,VT中存储的是所有的终结符。 简单点讲:终结符就是推导到终结符时,不可再推导下去;而非终结符可以继续推导下去。 集合P存储的是所有的产生式。那什么是产生式呢?产生式就是推导规则。比方说 a→b 就是一条规则,即一条产 生式,可以通过 a 推导出 b。 对照前面说的非终结符和终结符,就应该可以理解,在产生式左边的只能是非终结符,因为终结符不能再推导下 去

[编译原理-词法分析(二)] 使用状态转换图识别词法单元

自闭症网瘾萝莉.ら 提交于 2019-11-30 12:33:13
前言 一个小Demo, 用于分析的源文件比较简单, 主要的部分都有, 扩展比较容易. 将正则表达式表示的模式构造为状态转换图. 在本文中只列举状态转换图. 双缓冲区(代码中的Buffer类): https://my.oschina.net/u/3107416/blog/3110834 数字的状态转换 保留字和ID的状态转换 运算符的状态转换 用于分析的源文件 结果 前情提要 一、词素模式 二、打印Token 三、StateTransition类 四、StateTransition的构造与析构函数 五、StateTransition普通函数的实现 六、运算符的状态转换 七、数字的状态转换 八、保留字和ID的状态转换 九、空格, 制表符, 换行符设置 十、调用 正文 将使用<~> 标记来自哪个文件 一、词素模式 <~Token.h> namespace Lexical_Analysis { enum Tag { RESERVE_WORD = 256, ID, METHOD, RELOP, NUM, }; enum RelopTag { LT, // < LE, // <= EQ, // = NE, // <> GT, // > GE, // >= }; enum ReserveWordTag { INT, IF, ELSE, THEN }; class Token { public:

编译原理:文法和语言总结与梳理

為{幸葍}努か 提交于 2019-11-30 12:03:56
1. 梳理第二章的内容,写一篇理解与总结。 一、 对程序设计语言的描述从语法、语义和语用三个因素考虑: 语法:对语言结构的定义; 语义:语言的含义; 语用:从使用的角度描述语言。 形式语言理论是编译的理论基础。 二、 字母表:元素的非空有穷集合; 符号/字符:字母表中的元素; 符号串:符号的有穷序列。 三、 符号串运算: 符号串的连接:εx=xε=x; 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A; 符号串的幂运算:x=abc,x^2=abcabc; 集合的幂运算 正闭包A+与闭包A*:A*={ε}∪A+ 四、 形式语言:字母表上按照某种规则构成的所有符号串的集合,其不考虑语义。描述形式语言的方式有两种: 枚举——当语言为有穷集合时; 文法——描述了无穷集合的语言。 五、 文法:G=(Vn,Vt,P,S) 规则P:也称为产生式,是一个符号与一个符号串的有序对(A,β)   A→β   i. 一组规则定义了一个语言的语法结构;   ii. 规则中出现的符号分为终结符号和非终结符号 b) Vn为非终结符(non-terminate); c) Vt为终结符(terminate); d) S为非终结符号,称为文法的开始符号/识别符号,至少要在一条规则的左部出现。 六、 推导:推导的依据是规则 a) 直接推导:仅使用一次规则; b) 推导:至少使用一次规则; c)

面试官: 聊一聊Babel

你。 提交于 2019-11-30 09:34:09
点击关注本 公众号 获取文档最新更新,并可以领取配套于本指南的 《前端面试手册》 以及 最标准的简历模板 . 前言 Babel 是现代 JavaScript 语法转换器,几乎在任何现代前端项目中都能看到他的身影,其背后的原理对于大部分开发者还属于黑盒,不过 Babel 作为一个工具真的有了解背后原理的必要吗? 如果只是 Babel 可能真没有必要,问题是其背后的原理在我们开发中应用过于广泛了,包括不限于: eslint jshint stylelint css-in-js prettier jsx vue-template uglify-js postcss less 等等等等,从模板到代码检测,从混淆压缩到代码转换,甚至编辑器的代码高亮都与之息息相关. 如果有兴趣就可以搞一些黑魔法: 前端工程师可以用编译原理做什么? 前置 Babel 大概分为三大部分: 解析: 将代码(其实就是字符串)转换成 AST( 抽象语法树) 转换: 访问 AST 的节点进行变换操作生成新的 AST 生成: 以新的 AST 为基础生成代码 我们主要通过打造一个微型 babel 来了解 babel 的基本原理,这个微型 babel 的功能很单一也很鸡肋,但是依然有400行代码,其实现细节与 babel 并不相同,因为我们省去了很多额外的验证和信息解析,因为单单一个兼容现代 JavaScript 语法的

编译原理随堂作业三——语法树,短语,直接短语,句柄

跟風遠走 提交于 2019-11-30 09:27:07
1.已知文法: S->a|^|(T) T->T,S|S 分析句型(T,(^,a)),求全部的短语、直接短语和句柄。 该题语法树如下: 全部短语:^ , a , ^,a ,(^,a), T,(^,a), (T,(^,a)) 直接短语:^ , a 句柄: ^ 2.构造上下文无关文法,描述语言: {anbn|n>=0} {ambn|m>=n>=0} {(ab)n|n>=0} {ambn|m,n>=1} 1.G(S):S--->aSb | ab 2.G(S):S--->aSb | ab | aS | a 3.G(S):S--->(ab) | (ab)S 4.:G(S):S--->ab | aSb | Sb | aS 3.如果if语句的方法: stmt ->if expr then stmt | if expr then stmt else stmt | other 句子if E1 then if E2 then S1 else S2是否有两棵不同的语法树?说明了什么? 有两颗不同的语法树,具体如下图所示。说明了if语句具有文法二义性 S->a|^|(T) T->T,S|S 分析句型(T,(^,a)),求全部的短语、直接短语和句柄。 该题语法树如下: 全部短语:^ , a , ^,a ,(^,a), T,(^,a), (T,(^,a)) 直接短语:^ , a 句柄: ^ 2