410 likes | 592 Views
编译原理 —— 第三章. 第 3 章 词法分析. 编译过程的第一步是进行词法分析,该任务是由词法分析程序来完成的。 词法分析程序又称为词法分析器或扫描器,是编译程序的基本子过程之一。. 1. 《 编译原理 》 冶金工业出版社. 编译原理 —— 第三章. 本章首先讨论用手工方式设计并实现词法分析程序,主要内容有:词法分析程序的功能、正规文法及其状态图、词法分析程序的设计与实现。然后介绍词法分析程序的自动生成,其内容为:正规表达式和有穷自动机、词法分析程序的自动生成系统。. 2. 《 编译原理 》 冶金工业出版社. 编译原理 —— 第三章.
E N D
编译原理——第三章 第3章 词法分析 编译过程的第一步是进行词法分析,该任务是由词法分析程序来完成的。 词法分析程序又称为词法分析器或扫描器,是编译程序的基本子过程之一。 1 《编译原理》 冶金工业出版社
编译原理——第三章 本章首先讨论用手工方式设计并实现词法分析程序,主要内容有:词法分析程序的功能、正规文法及其状态图、词法分析程序的设计与实现。然后介绍词法分析程序的自动生成,其内容为:正规表达式和有穷自动机、词法分析程序的自动生成系统。 2 《编译原理》 冶金工业出版社
编译原理——第三章 3.1 词法分析器的作用 词法分析器与语法分析器之间的交互 3 《编译原理》 冶金工业出版社
编译原理——第三章 词法分析器是编译器中读入源程序的部分,因此它还可以完成一些相关的辅助任务。一个任务是滤掉源程序中的注释、空格、制表符、换行符等;另一个任务是使编译器能将发现的错误信息与源程序的出错位置联系起来。 4 《编译原理》 冶金工业出版社
编译原理——第三章 3.1.1 词法分析中的问题 把编译过程中的分析阶段划分为词法分析和语法分析的原因如下: (1)简化编译器的设计可能是最重要的考虑。 (2)提高编译器的效率。 (3)增强编译器的可移植性。 5 《编译原理》 冶金工业出版社
编译原理——第三章 3.1.2 记号、模式、词素 6 《编译原理》 冶金工业出版社
编译原理——第三章 3.1.3 记号的属性 如果一个模式能匹配的单词符号不止一个,词法分析器必须为记号提供附加的信息。 记号影响语法分析的决策,属性影响语义分析和代码生成。 7 《编译原理》 冶金工业出版社
编译原理——第三章 3.1.4 词法错误 词法分析器可以采用下列可能的错误恢复动作: (1)删除一个多余的字符。 (2)插人一个遗漏的字符。 (3)用一个正确的符号代替一个不正确的符号。 (4)交换两个相邻的字符。 8 《编译原理》 冶金工业出版社
编译原理——第三章 3.1.5 输入缓冲 为了节省存储空间,通常在内存中开辟一个输入缓冲区,先将源程序顺序地分批读入输入缓冲区。 9 《编译原理》 冶金工业出版社
编译原理——第三章 一个分为两半的输入缓冲器 10 《编译原理》 冶金工业出版社
编译原理——第三章 在缓冲器每半之尾都设有结尾标记 11 《编译原理》 冶金工业出版社
编译原理——第三章 3.2 记号的描述 正规表达式是表示模式的一种重要方法,每个模式匹配一个字符串集,因此正规表达式将作为字符串集的名字。 12 《编译原理》 冶金工业出版社
编译原理——第三章 3.2.1 串和语言 字母表上的字符串是该字母表中符号的有穷系列。 语言是给定字母表上的任意一个字符串的集合,这个定义是广义的,像“空集”和仅包含空符号串的集合{}这样的抽象语言也符合此定义。 13 《编译原理》 冶金工业出版社
编译原理——第三章 14 《编译原理》 冶金工业出版社
编译原理——第三章 3.2.2 语言上的运算 (1)语言L和M的合并(union),记作L∪M,定义为: L∪M = {s| s in L or s in M} 此集合读作“所有属于L或属于M的符号串s所组成的集合”。 15 《编译原理》 冶金工业出版社
编译原理——第三章 (2)语言L和M的连接(concatenation),记作LM,定义为: LM = {st| s in L and t in M} 此集合读作“满足s属于L和t属于M的所有符号串st所组成的集合”。 16 《编译原理》 冶金工业出版社
编译原理——第三章 (3)语言L的Kleene闭包,记作L*,定义为: L* = Li = L0+L1+L2+L3+… 17 《编译原理》 冶金工业出版社
编译原理——第三章 (4)语言L的正闭包,记作L+,定义为: L+ = Li = L1+L2+L3+… 18 《编译原理》 冶金工业出版社
编译原理——第三章 3.2.3 正规表达式 一个正规表达式是按照一组定义规则由一些较简单的正规表达式所组成的。 在字母表∑上的正规表达式可用如下规则来定义,其中与每一个规则相联系的是有关正规表达式所表示的语言的详细说明。 (1)和Φ都是∑上的正规表达式,它们所表示的语言分别是{ }(即只含空符号串的集合)和Φ(即空集{})。 19 《编译原理》 冶金工业出版社
编译原理——第三章 (2)如果α是∑内的一个符号,则α是一个正规表达式,它表示的语言是{α},即包含符号串α的集合。 (3)如果r和s分别是表示语言L(r)和L(s)的正规表达式,那么: ① (r)|(s)是一个表示L(r)∪L(s)的正规表达式。 ② (r)(s)是一个表示L(r)L(s)的正规表达式。 ③ (r)*是一个表示(L(r))*的正规表达式。 ④ (r)也是一个表示L(r)的正规表达式。 20 《编译原理》 冶金工业出版社
编译原理——第三章 一个由正规表达式表示的语言称为一个正规集。 21 《编译原理》 冶金工业出版社
编译原理——第三章 如果采用如下的约定,则可把正规表达式中的不必要的括号省略: (1)正规表达式的三个运算符中,一元运算符“*”具有最高的优先级,并且是左结合的。 (2)连接运算具有次优先级,是左结合的。 (3)运算符“|”具有最低的优先级,是左结合的。 22 《编译原理》 冶金工业出版社
编译原理——第三章 23 《编译原理》 冶金工业出版社
编译原理——第三章 3.2.5 缩写表示法 在正规表达式中,某些结构出现频繁,为了方便起见,可以用缩写形式表示它们。 (1)一个或多个实例。一元后缀操作符“+”的意思是“一个或多个实例”。 (2)零个或一个实例。一元后主操作符“?”的意思是“零个或一个实例”。 24 《编译原理》 冶金工业出版社
编译原理——第三章 3.2.6 非正规集 正规表达式不能用于描述均衡或嵌套结构。 重复符号串不能用正规表达式表示,。 正规表达式只能表示固定次数的重复或给定结构的没有指定次数的重复。 25 《编译原理》 冶金工业出版社
编译原理——第三章 3.3 单词符号的识别 (1)关键字的识别。 (2)标识符的识别。 (3)常数的识别。 (4)算符和分界符的识别。 26 《编译原理》 冶金工业出版社
编译原理——第三章 3.3.1 状态转换图 状态转换图描绘语法分析器为得到下一个记号而调用词法分析器时词法分析器要做的动作。 27 《编译原理》 冶金工业出版社
编译原理——第三章 状态转换图的位置用圆圈表示,叫做状态。用双圆圈表示的状态称为接受状态。状态之间用边表示,称为边。由状态s到状态r的边上标记的字符表示使状态s转换到状态r的输入字符。 28 《编译原理》 冶金工业出版社
编译原理——第三章 状态转换图中具有一个标记为开始的状态,这个状态称为初始状态。识别记号时,将从这个状态开始。有些状态可以具有动作,当控制流达到下一个具有动作的状态时,将执行这些动作。当进入一个状态时,需要读下一个输入字符。若存在下一个离开当前状态的边,其标记和读入字符匹配,控制就转到由这条边指向的状态,否则表示失败。 29 《编译原理》 冶金工业出版社
编译原理——第三章 3.4 有穷自动机 有穷自动机是具有离散输入与输出的系统的一种数学模型。 30 《编译原理》 冶金工业出版社
编译原理——第三章 3.4.1 确定型有穷自动机(DFA) 一个确定的有穷自动机M(记作DFA M)是一个五元组: M=(∑,Q,q0,F,σ) 其中: (1)Q是一个有限状态集合。 (2)∑是一个字母表,它的每个元素称为一个输入符号。 (3)q0∈Q,q0为初始状态。 (4)F Ì Q,F称为终结状态集合。 (5)σ是一个从Q×∑到Q的单值映射: σ(q,α)=q’ (q,q’∈Q,α∈∑) 表示当前状态为q,输入符号为α时,自动机将转换到下一个状态q’,q’成为q的一个后继。 31 《编译原理》 冶金工业出版社
编译原理——第三章 若Q=(q1,q2,…,qn),∑=(α1,α2,…,αm),则(σ(qi,αj))n×m)是一个n行m列矩阵,它称为DFA M的状态转换矩阵,或称为转换表。 32 《编译原理》 冶金工业出版社
编译原理——第三章 3.4.2 不确定的有穷自动机(NFA) -转换(-transition)是无需考虑输入串(且无需消耗任何字符)就有可能发生的转换。 33 《编译原理》 冶金工业出版社
编译原理——第三章 非确定有穷自动机M是一个五元组: M=(∑,Q,q0,F,σ) 其中∑,Q,q0,F的意义和DFA的定义一样,而σ是一个从Q×∑到Q的子集的映射,即后继状态有若干个: σ(Qi,α) ={Qj1,Qj2,…,Qjn} 34 《编译原理》 冶金工业出版社
编译原理——第三章 3.4.3 从NFA到DFA的变换 定理:对任何一个NFA M,都存在一个DFA M,使L(M)=L(M)。 35 《编译原理》 冶金工业出版社
编译原理——第三章 变换的算法: 设NFA N = (K,∑,σ,S,F),DFA N' = (K',∑',σ',S',F')。 第一步,如果NFA的全部状态为S1,S2,S3,…,SK,则令DFA的初始状态为: S' = [S1,S2,S3,…,SK] 其中方括号用来表示若干个状态构成的某一状态。 第二步,若对某字符α∈∑,在NFA中有σ(K,a) = {KJ1,KJ2,…,KJn},则令σ'([Ki],a) = [KJ1,KJ2,…,KJn],即[KJ1,KJ2,…,KJn]为DFA当前状态的一个后继状态。 第三步,重复第二步,直到不出现新的状态为止。 第四步,上面所得的所有状态构成DFA的状态集K'。 第五步,在DFA的状态中,凡含有NFA接受状态的状态构成DFA的接受状态集F'。 36 《编译原理》 冶金工业出版社
编译原理——第三章 3.5 词法分析器描述语言 Lex已经广泛地应用于各种语言的词法分析器的描述,这种工具称为Lex编译器,而Lex编译器的输入称为Lex语言。 37 《编译原理》 冶金工业出版社
编译原理——第三章 小结 本章主要介绍了一个编译过程中的第一步:词法分析的一些基本概念。 进行词法分析,首先要弄明白一些基本的概念,如记号、模式、词素、属性、缓冲等等。只有弄明白了这些概念,才能真正地进行词法分析。而词法分析又是为语法分析做准备的,词法分析的输出就是语法分析的输入。编译程序就是这样一环扣一环,完成整个编译的过程。 38 《编译原理》 冶金工业出版社
编译原理——第三章 词法分析涉及到语言的基本运算。一个正规表达式是按照一组定义规则由一些较简单的正规表达式所组成的。正规表达式在编译原理中的作用特别大,一定要将其概念和用法都好好掌握。 39 《编译原理》 冶金工业出版社
编译原理——第三章 可以用直观的方法画出单词符号识别的过程的状态转换图,再通过状态转换图来编写词法分析的代码。为了更好地使用状态转换图构造词法分析程序,为了词法分析程序的自动生成,而且也由于正规文法在语言理论及自动机理论中的奠基作用,编译程序提出了有穷自动机的概念。而有穷自动机又可以分为确定型有穷自动机和非确定型有穷自动机。非确定型有穷自动机可以通过一些算法转换为确定型有穷自动机。 40 《编译原理》 冶金工业出版社
编译原理——第三章 目前有很多基于正规表达式从特定表示法构建词法分析器的工具。本章挑选了其中最有名的Lex来进行讲解和示范使用。 41 《编译原理》 冶金工业出版社