. 词法分析
1.1 词法记号及属性
词法记号、模式、词法单元
记号名 词法单元列举 模式的非形式描述
if if 字符i,f
for for 字符f,o,r
relation <,<=,=,... <或<=或=或...
id sum,count,D5 由字母开头的字母数字串
number 3.1,10,2.8 E12 任何数值常数
literal “seg.error” 引号“和”之间任意不含引号本身的字符串
历史上词法定义中的一些问题
---- 忽略空格带来的困难
DO 8 I = 3.75 等同于 DO8I=3.75
DO 8 I = 3,75
---- 关键字不保留
IF THEN THEN THEN=ELSE; ELSE ...
---- 关键字、保留字和标准标识符的区别
保留字是语言预先确定了含义的词法单元
标准标识符也是预先确定了含义的标识符,但程序可以重新声明它的含义
词法记号的属性
position = initial + rate * 60 的记号和属性值:
<id,指向符号表中position条目的指针>
<assign_op>
<id,指向符号表中initial条目的指针>
<add_op>
<id,指向符号表中rate条目的指针>
<mul_op>
<number,整数值60>
词法错误
---- 词法分析器对源程序采取非常局部的观点
---- 例:难以发现下面的错误
fi(a == f(x))....
---- 在实数是“数字串.数字串”格式写,可以发现下面的错误
123.x
---- 紧急方式的错误恢复
删掉当前若干个字符,直到能读出正确的记号
---- 错误修补
进行增、删、替换和交换字符的尝试
1.2 词法记号的描述与识别
串和语言
---- 字母表:符号的有限集合,例如:Σ = {0,1}
---- 串:符号的有穷序列,例如:0100,ε
---- 语言:字母表上的一个串集
{ε,0,00,000,...},{ε},Φ
---- 句子:属于语言的串
串的运算
---- 连接(积) xy, se = es = s
---- 幂 s0为e,si为si-1s(i>0)
语言的运算
---- 并运算:L∪M = {s|s∈L或s∈M}
---- 连接:LM={st|s∈L且t∈M}
----幂运算:L0是{e},Li是Li-1L
---- 闭包:L*=L0∪L1∪L2∪...
---- 正闭包:L+=L1∪L2∪...
正规式:
正规式用来表示简单的语言,叫做正规集
正规式 定义的语言 备注
e {e}
a {a} a∈Σ
(r)|(s) L(r)∪L(s) r和s是正规式
(r)(s) L(r)∪L(s) r和s是正规式
(r)* (L(r))* r是正规式
(r) L(r) r是正规式
((a)(b)*)|(c)可以写成ab*|c,如果按照定义了优先级可以按照这种形式写出。
其他例子:
---- a|b {a,b}
----- (a|b)(a|b) {aa,ab,ba,bb}
----- aa|ab|ba|bb {aa,ab,ba,bb}
---- a* 由字母a构成的所有串集
---- (a|b)* 有a和b构成的所有串集
*表示重复若干次
正规定义
---- 对正规式的命名,使表示简介
?---可以有可以没有,+表示可选择。
ws,white space ,若干个空白符
转换图
1.3 有限自动机
不确定的有限自动机NFA
1.4 确定的有限自动机DFA
NFA到DFA的变化
一种算法示意如下:
例题: