考察重点:
① 词法分析器的输入、输出。
② 用于识别符号的状态转移图的构造。
③ 根据状态转移图实现词法分析器。
考试难点:
① 词法的正规文法表示。
② 词法的正规表达式表示。
③ 状态转移图表示,它们之间的转换。
(1)词法分析器的功能
输入源程序,输出单词符号(token序列)。
即:把构成源程序的字符串转换成“等价的”单词序列。
(2)单词的种类(五大种类)
① 关键字 :基本字,如begin、end、for、do...
② 标识符:用户定义的变量名。
③ 常数:整常数、实常数、布尔常数、字符串常数等
④ 运算符:算术运算符+、-、*、/等;逻辑运算符not、or 与and等;关系运算符=、<>、、、和等
⑤ 分界符:如,、;、(、)...
其中,关键字、运算符和分界符都是程序设计语言预先定义的,数量固定。
而标识符和常数的数量不定。
(3)单词的内部形式
二元组形式:(种别,属性值)
问题:如何存储标识符和常量的属性值?
① 用标识符和常量本身的值表示。
② 用指针表示。
(4)源程序以_______形式存储于外部介质中?
源程序以字符流形式存储于外部介质中。
(5)源程序的输入缓冲与预处理
① 超前搜索:标识符的识别,或双字符运算符(**, <=, <>)。
② 回退:回退操作修正超前搜索。
③ 缓冲区:假定源程序存储在磁盘上,这样每读一个字符就需要访问一次磁盘,效率显然是很低的。一次性从磁盘读取给定大小的部分源程序。
④ 空白字符的剔除:剔除源程序中的无用符号、空格、换行、注释等。
(6)输入缓冲区的两个指针
① 单词开始指针:指向当前识别单词的第一个字符。
② 扫描指针:指向当前读入的字符。
最终,两个指针中间夹着的就是识别出来的单词。这块区域称为工作区(token)。
(7)使用单缓冲区存在的问题
① 缓冲区内容用完后,等待新的输入需要等待。
② 缓冲区尾部可能只包含单词的一部分,载入下一部分程序时,当前缓冲区的内容被覆盖,最坏情况下可识别的单词长度只能为1,而且无法执行超前搜索。
解决方法:使用双缓冲区。
(8)使用双缓冲区存在的问题
双缓冲区超前扫描导致的效率问题(需要进行两次判断,非常浪费时间,效率低下) 。
解决方法:采用带标记缓冲区,即两个缓冲区的末尾处各设置一个“EOF”标志。
如果当前字符是“EOF”,就再判断是否到达缓冲区末尾,将移动向前指针需要的两次测试减少到(N+1)/N。
(9)词法分析阶段的错误处理
① 非法字符检查:维护一个合法字符集合,对于每一个输入字符,判断该字符是否属于该字符集合。
② 单词拼写错误:关键字拼写词法分析阶段无法检测,待语法分析阶段发现错误。
标识符拼写错误,如3b78,处理方法有两种,识别出整数3、标识符b78或者输出错误的标识符 。
③ 不封闭错误检查:影响正常程序分析,对注释或字符串长度加以限制。
④ 重复声明检查:兼顾符号表的查填工作。
⑤ 错误恢复与续编译:词法分析阶段的错误使得编译无法继续进行,需要采取措施使得编译继续下去。
错误校正极其困难。采用 紧急方式恢复(panic-mode recovery):反复删掉剩余输入最前面的字符,直到词法分析器能发现一个正确的单词为止。
(10)词法分析器的位置
将词法分析作为一个单独阶段(词法分析器设计成单独一遍,使程序结构更加清晰),将单词序列以中间文件形式存储,作为语法分析的输入。
优点:
① 简化编译器的设计。
② 提高编译器的效率。
③ 增强编译器的可移植性。
(11)程序设计语言的基本语法单位是什么?
单词 是程序设计语言的 基本语法单位 。
(12)正则文法的定义
正则文法G = (V,T,P,S)中,对任意α->β∈P,α->β均具有形式A->w或A->wB(A->w或A->Bw),其中A,B∈V,w∈T+。 正则文法描述T上的正则语言。
正则文法G=(非终结符集,终结符集,产生式集,开始符号)
(13)正则表达式 与 正则文法 的比较
相同点:① 两者都可以描述单词。 ② 两者能力相同,可以互相转化。即:正则表达式与正则文法等价!(任意一个正则表达式,一定存在与之对应的定义同一语言的正则文法。反之亦然。)
不同点:正则表达式比正则文法更加直观。首选正则表达式来表示正则语言。
(14)一个正则表达式通常称为一个______
一个正则表达式通常称为一个模式,用来描述一系列符合某个句法规则的字符串。
(15)正则表达式r的相应的正则语言记为 _____
正则表达式r的相应的正则语言记为 L(r)。
(16)如果正则表达式r与s表示的语言相同,即L(r)=L(s),则称r与s____,也称r与s____,记作_____。
如果正则表达式r与s表示的语言相同,即L(r)=L(s),则称r与s 等价,也称r与s 相等,记作 r=s;
变式:正规式M和N等价是指_____
正规式M和N等价是指 M和N所识别的语言集相等。
(17)正则表达式中运算符的优先级
()括号 > *(克林闭包) > 连接 > |(或)
括号永远是最高优先级的。
连接其实就是两个语言作笛卡尔积。
(18)正则文法如何转换成等价的正则表达式 ?
专题讨论。
(19)正则表达式如何转换成等价的正则文法 ?
专题讨论。
(20)什么是词法?
词法 : 单词符号的文法,用来描述高级语言中的标识符、常数、运算符、分界符、关键字。
(21)什么是有穷状态自动机?
① 有穷状态自动机是正则语言的另一种等价描述 。
② 有穷状态自动机从语言识别的角度,实现对相应语言的刻画。
③ 有穷状态自动机是具有 离散输入输出的 系统的 数学模型。
④ 有穷状态自动机具有有穷个内部状态(有限个状态),不同状态代表不同意义。
⑤ 系统只需根据当前所处的状态和面临的输入就能确定后继的行为。
⑥ 处理完当前输入后系统的状态将发生变化。
⑦ 具有初始状态(有且只有唯一的一个初始状态),系统在该状态下开始进行某个句子的处理。
⑧ 终止状态集合(可以有多个终止状态),该状态表示到目前为止所读入的字符构成的字符串是语言的一个句子。
(22)有穷自动机的分类(两大类)
① 确定的有穷状态自动机(Deterministic Finite Automaton,DFA)
② 不确定的有穷状态自动机(Non-deterministic Finite Automaton,NFA)
(23)描述程序设计语言中的单词的工具有_____、_____和_____。
描述程序设计语言中的单词的工具有 正则文法 、 正则表达式 、 有穷自动机。
即:正则文法 等价于 正则表达式 等价于 有穷自动机
(24)有穷自动机的物理模型的构成
① 一个输入带。带一系列方格,每个方格存放一个字符;左端开始存放,右端无穷。
② 一个读头。读入字符。
③ 一个有穷状态控制器。该控制器的状态只有有穷多个,控制一个读头,从输入带上输入字符。每输入一个字符,就将读头指向下一个待读入的字符。
(25)有穷自动机的动作由三个节拍构成,分别是____、_____、___。
每个动作由三个节拍构成 (读、改、移):
① 读入字符a;
② 修改状态,[p,a]→q;
③ 读头移动,前进一格。
(26)状态有______功能,_____输入串的部分特征。
状态有 记忆 功能, 记住 输入串的部分特征。
(27) 确定的有穷自动机(DFA)的形式定义
一个确定的有穷自动机 M(记作DFA M)是一个五元组M=(Q,Σ,δ,q0,F)
其中
① Q是一个有穷状态集合。
② Σ是一个字母表,它的每个元素称为输入符号。
③ q0∈Q,q0 称为初始状态。(注意:不是初始状态集,初始状态有且只有唯一的一个)
④ F包含于Q,F称为终止状态集合。(注意:终止状态可以有多个)
⑤ δ(状态转移函数)是一个从Q×Σ到Q的单值映射 。
δ(p,a)=q(p, q∈Q,a∈Σ) 表示当前状态为p,输入符号为a时,自动机将转换到下一个状态q,q称为p的一个后继。
确定的有穷自动机DFA = (有穷状态集,字母表,状态转移函数,初始状态,终止状态集)
(28)确定的有穷自动机(DFA)的三种表示方式
① 转移函数
② 转移矩阵
③ 状态转换图
(29)DFA接收的语言
定义:给定DFA M,M所接收的语言为: L(M)={w|w∈Σ*,且δ(q0,w)∈F}
(30)假设M1和M2都是DFA,如果L(M1)=L(M2),则称M1和M2_____
假设M1和M2都是DFA,如果L(M1)=L(M2),则称M1和M2 等价
(31) 非确定的有穷自动机(NFA)
非确定的有穷自动机M是一个五元组 M=(Q,Σ,δ,q0,F)
其中Q,Σ,q0,F的意义和DFA的定义一样。
δ是一个从Qx(Σ∪{ε})到Q的子集的映射,即δ:QxS->2^Q,其中S= Σ∪{ε}。
类似于DFA,NFA亦可用状态转换图表示,同样也可以定义NFA接受的语言。
(32)每一台非确定型有穷自动机(NFA)都等价于某一台确定型有穷自动机(DFA)。
(33)状态转换图
设M=(Q,∑,δ,q0,F)为一个有穷状态自动机,
满足如下条件的有向图被称为M的状态转换图(transition diagram):
① q∈Q 等价于 q是该有向图中的一个顶点;
② δ(q,a)=p 等价于 图中有一条从顶点q到顶点p的标记为a的弧;
③ q∈F 等价于 标记为q的顶点被用双层圈标出;(终止状态用双层圈表示)
④ 用标有start的箭头指出M的开始状态。
(34)正则表达式 如何 转换为 状态转换图?
专题讨论。
(35)正则文法 如何 转换为 状态转换图?
专题讨论。
(36)有穷状态自动机与单词识别的关系
① 单词的识别过程相当于单词的 拼接过程 ,一个字符一个字符地逐步进行。
② 单词的识别总可以在 有限的步骤 内完成。
③ 单词的识别过程可以看成 有限个状态的变换 ,每个状态反映的是某种识别程度。
④ 有 一个初始状态 和 若干个终止状态 ,其中初始状态表示识别的开始,终止状态表示识别的结束。
(37)状态转换图的实现
方法1:状态矩阵
以状态转换图的各个状态为行
以可能的输入符号为列
给定状态si,输入符号aj那么B[i,j]表示状态si读到字符aj时转向的下一个状态(还包括此时应完成的语义动作)
优势:查询速度快
劣势:占用空间大,无用位置太多
方法2:邻接表
以状态转换图的各个状态为头指针,维护一个元素的链表
每个元素包括两个域,第一个域是可能扫描到的符号,第二个域是当前状态转向的状态及需要执行的语义动作
第i个链表的元素[a/j]表示在状态i读入符号a时转入到状态为j
优势:较节省空间
劣势:访问速度较慢
方法3:混合方法
整合状态矩阵和邻接链表的优势,而克服其劣势,即不但访问速度快,而且占用空间小。
专题讨论。
(38)LEX二义性问题的两条原则
① 最长匹配原则(总是匹配符合规则的最长字符串)
在识别单词过程中,有一字符串。
根据最长匹配原则,应识别为这是一个符合Pk规则的单词,而不是Pj和Pi规则的单词。
② 优先匹配原则(排在前面的规则有限匹配)
如果有一字符串有两条规则可以同时匹配时,那么用规则序列中位于前面的规则相匹配,所以排列在最前面的规则优先权最高。
(39)Lex的功能是根据Lex源程序构造一个词法分析程序, 该词法分析器实质上是一个有穷自动机。
(40)为了提高效率,词法分析器使用 缓冲技术 ,而且在将字符流读入缓冲区时,是经过 剔除注解、无用空白符 等预处理后的结果;
(41)单词的识别相当于 正则语言的识别。
(42)词法的等价描述形式有正则文法、有穷状态自动机、正则表达式,其中有穷状态自动机可以用状态转换图表示;
(43)使用恰当的 形式化描述 ,可以实现词法分析器的 自动生成 ,Lex就是一种自动生成工具。