词法分析
词法分析概述
从源程序的第一个字符开始,从左到右扫描源程序,一次读一个字符,根据词法规则将有关字符组合成单词,并识别各类单词,当确定单词类别后,将单词输出。在词法分析过程中还要完成其它任务,如:
- 过滤掉源程序中的注释和空白;
- 记录读入字符的行号,以便发现错误后能报告出错位置;
- 进行预编译工作(对宏进行展开等工作);
- 符号表操作;
- 错误处理等;
词法分析器的输出一般为二元式(class,value)。
class代表它的种类,如标识符、数字、保留字、常数等等,一般用数字表示。
vlaue就是它具体的值。
正规文法与状态转换图
正规文法
回忆一下:
正规文法就是Chomsky分类中的3型文法:
若文法中的规则都具有如下形式:A→ α 或A → B α (左线性)或 A→ α B(右线性)
其中 A,B∈ Vn, α ∈ Vt
规则右部至多含有一个非终结符号。也称线性文法、正则文法或正规文法。
3型文法描述的语言为3型语言(正则语言、正规语言),用L3表示。大多数程序设计语言的单词 (标识符、无符号整数) 的文法都是3型文法。
许多程序设计语言的单词,可以用正规文法来描述。对于这样的语言,使用状态转换图可以设计词法分析程
序(扫描器)。
状态转移图
状态转换图TG(简称状态图或转换图)是一张定义在字母表Σ上的有限方向图。在状态转换图中 :
- 结点代表状态,用圆圈表示;
- 状态之间用有向弧连结;
- 有向弧上的标记(字符)表示在射出结点(有向弧的开始结点)所代表的状态下可能出现的输入符号或符号串。
- 用带有符号“ ⇒ ”的圆圈表示状态转换图的初始状态
- 用◎ 表示终止状态。
例如:
一个状态转换图可用于接受(或识别)一定的符号串。在状态转换图中从初始状态到某一终止状态的序列为路径。对于某一符号串β,在状态转换图中,若存在一条路径产生β,则称状态转换图接受(或识别)该符号串β,否则符号串β不能被接受。
能被状态转换图TG接受的符号串的集合记为L(TG),称为状态转换图所能识别的语言。
正规文法的状态转换图表示
许多程序设计语言的单词可以用正规文法来表示,而对于正则文法所描述的语言又可以用状态转换图来非形式的表示。
对于右线性文法G[S]:U→xV|y V →z,状态转换图的表示方法如下:
1. 用状态表示G[S]中的非终结符,G[S]的开始符号S对应状态转换图的开始状态S;
2. 增加一个新状态Z,作为状态转换图的终止状态;
3. 对于G[S]中形如U→xV的每条产生式,画一条从状态U到状态V的方向弧,弧上的标记为x;
4. 对于G[S]中形如U→y的每条产生式,画一条从状态U到终态Z的方向弧,弧上的标记为y 。
例: 给出与正则文法G[S]等价的状态转换图。
G[A0]:
A0→0A0 | 1A0 | 1A1
A1→1A2
A2→ε
对于左线性文法G[Z]:U→Vx|y V →z,状态转换图的表示方法如下:
1. 用状态表示G[Z]中的非终结符,G[Z]的开始符号Z对应状态转换图的终止状态Z;
2. 增加一个新状态S,作为状态转换图的初始状态;
3. 对于G[Z]中形如U→Vx的每条产生式,画一条从状态V到状态U的方向弧,弧上的标记为x;
4. 对于G[Z]中形如U→y的每条产生式,画一条从初态S到状态U的方向弧,弧上的标记为y 。
例:给出与正规文法G[Z]等价的状态转换图。
G[Z]:
Z→U0 | V1
U→Z1 | 1
V→Z0 | 0
右线性文法状态图的识别过程,是为串w建立一个推导S ⇒ w的过程。
左线性文法状态图的识别过程,是从串w出发的归约过程,最后归约为开始符号S。
正规表达式与有限自动机
正规式和正规集
为了识别正则语言,我们引入了状态转换图和有限自动机,有限自动机所接受的语言正是正规文法产生的语言(正规语言),程序设计语言中的单词也大多是由正规文法产生的。作为单词的语法除了用正规文法描外,我们还可以用一种更有效的工具——正规式加以描述。
采用正规式有以下几个原因:
1. 词法规则简单,无需上下文无关文法那样强有力的表示法,用正规式表示法去理解正被定义的是什么样的符号集合比领会由产生式集合定义的语言更为容易;
2. 借助正规式构造高效的识别程序比上下文无关文法更容易;
3. 可以从某个正规式自动构造识别程序,它识别的正是用该正规式表示的字符串集合中的字符串,从而减轻实现词法分析时工作的单调乏味程度。
多数程序设计语言的单词的语法都能用正规文法来表示。即文法G=( VN , V