词法分析1-3
词法分析1
词法分析器的设计
任务
:从左至右逐个字符对源程序进行扫描,产生一个单词符号
词法分析器
:执行词法分析的模块
功能
:输入源程序、输出单词符号
单词符号种类:
基本字:begin,repeat,for
标识符:用来表示各种名字,如变量名,数组名和过程名
常数:各种类型的常数
运算符:+,-,*,/
界符:逗号,分号,括号和空白
输出单词符号表示形式:(单词种别
,单词自身的值
)
单词种别通常由整数编码表示:
词法分析器在编译器中的地位
词法分析器的结构
扫描缓冲区
存放了经过预处理的比较规范的字符串,扫描器在该缓冲区中识别单词符号
扫描器通过起点指示器和搜索指示器扫描
起点指示器
:指向马上要识别的单词的开始的位置
搜索指示器
:从开始位置前进寻找单词结尾
为了防止字字符串未完全扫描到,将扫描区分成两区域,每次预处理程序只处理并送入半个区的字符,两个区互补使用。如果一个半区找不到单词结尾,下一个半区一定能找到。且半区长度一定是程序允许的单词的最大长度
状态转换图
状态转换图是一张有限方向图
结点
代表状态
,用圆圈表示
状态之间用箭头连结,肩头上的标记代表射出结状态下可能出现的输入字符
或字符类
一个状态转换图包含有限个状态
,其中有一个是初态
,至少要一个终态
(用双圈表示)
状态1出发,读入数字字符转入状态2,在状态2,如果继续读入数字字符就会回到状态2,直到读入不是数字的字符(其他字符)转入状态3,双圈代表终态
,星号表示最后读入的字符不属于刚才读入单词需要退回
不必使用超前搜索:
状态转换图实现
不含回路的分叉结点
含回路的状态结点
终态结点
词法分析2
词法分析器功能:输入源程序,输出单词符号
词法分析器设计:
1、对给出程序设计语言的但此规范-单词表
2、对照单词表设计识别该语言所有单词的状态转换图
3、根据状态转换图编写词法分析程序
正规式和正规集
正规式
即是词法规则一种形式化描述,对应的单词集合称为正规集
正规集可以由正规式表示
正规式是表示正规集的一种方法
一个字集合是正规集当且仅当它能用正规式表示
字
(也叫做字符串
):是指字母表中的字符多构成的有穷序列
字符
:字母表中每个元素
ε
\varepsilon
ε 是一个字长度为0且不包含任意字符的字符串
正规式等价性
若两个正规式所表示的正规集相同,则称这两个正规式等价
正规式的性质
确定有限自动机(DFA)
确定有限自动机M是一个五元式
M
M
M={
S
S
S,
∑
\sum
∑,
f
f
f ,
S
0
S_{0}
S0,
F
F
F}
对于字母表中的任何字
α
\alpha
α,若存在一条从初态
到某一终态
的道路,且这条路上所有弧上标记符连成的字
等于
α
\alpha
α,则称
α
\alpha
α为DFA M所识别。所识别字的全体称为L(M)
特殊的
:
A
: q0到q0是一个从初态到终态的通路,通路上的标记所构成的字符串就是
ϵ
\epsilon
ϵ
B:
初态再q0,有无其他状态,永远找不到一条从初态出发到终态的道路,不能完成任何字识别
,识别字的全体就是一个空集
ϕ
\phi
ϕ
非确定有限自动机(NFA)
非确定有限自动机M是一个五元式
M
M
M={
S
S
S,
∑
\sum
∑,
f
f
f ,
S
0
S_{0}
S0,
F
F
F}
不同
1、NFA可以有多个初态
2、弧上标记可以是字母表中一个字
(或者一个正规式、字符)
3、同一个字
可能出现再同状态下射出的多条弧
上
对于字母表中的任何字
α
\alpha
α,若存在一条从初态
到某一终态
的道路,且这条路上所有弧上标记符连成的字
等于
α
\alpha
α(忽略那些标记为
ϵ
\epsilon
ϵ的弧),则称
α
\alpha
α为NFA M所识别。所识别字的全体称为L(M)
DFA和NFA等价性
对于任何两个有限自动机
M
M
M和
M
′
M^{'}
M′,如果L(
M
M
M)=L(
M
′
M^{'}
M′),则称
M
M
M和
M
′
M^{'}
M′等价
对于每个NFA M都会存在一个DFA
M
′
M^{'}
M′,使得L(
M
M
M)=L(
M
′
)
M^{'})
M′)
思路:两者差别
假定
N
F
A
NFA
NFA
M
M
M={
S
S
S,
∑
\sum
∑,
f
f
f ,
S
0
S_{0}
S0,
F
F
F},我们对M的状态图进行改造(NFA->DFA):
1
、引进新的状态结点X和Y,X射到初态,从终态射到Y,消除二者在初始状态的差异,解决唯一性问题
2
、引入新状态,简化弧上标记
3
、子集法,NFA确定化,解决$\epsilon$弧和转换关系
设 I I I是状态集的子集,定义 I I I的 ϵ − \epsilon- ϵ−闭包 ϵ − c l o s u r e ( I ) \epsilon-closure(I) ϵ−closure(I)为
ϵ
−
c
l
o
s
u
r
e
(
I
)
\epsilon-closure(I)
ϵ−closure(I)
=
=
=
I
∪
I\cup
I∪{
s
′
∣
从某个
s
∈
s^{'}|从某个s\in
s′∣从某个s∈
I
I
I出发经过任意条
ϵ
\epsilon
ϵ弧能到达
s
′
s^{'}
s′}
※自身※ 和 ※自身集合中经过空字到达的结合※
设a是字母表中的字符,定义:
I
a
=
ϵ
−
c
l
o
s
u
r
e
(
J
)
I_{a}=\epsilon-closure(J)
Ia=ϵ−closure(J)
其中J是I中某个状态出发经过一条a弧所到达的状态集合
举例
:
确定化
不失一般性,设字母表只包含两个a和b,构造计算状态转换表
将表堪称状态转换矩阵,子集视为一个状态
初态是
ϵ
−
c
l
o
s
u
r
e
(
\epsilon-closure(
ϵ−closure({X}
)
)
),红下划线
终态是含有原终态Y的子集,蓝下划线
确定有限自动机化简
对于DFA M,寻找一个状态数比M少的DFA
M
′
M^{'}
M′,使得L(M)=L(
M
′
M^{'}
M′)
假设s和t为M的两个状态,称s和t等价
:如果从状态s能读出某个字
α
\alpha
α而停止于终态,那么同样,从t出发也能读出
α
\alpha
α而停止于终态
词法分析3
为NFA构造正规式
非确定有限自动机M是一个五元式
M
M
M={
S
S
S,
∑
\sum
∑,
f
f
f ,
S
0
S_{0}
S0,
F
F
F}
加上两个状态X和Y,显然L(M)=L(
M
′
M^{'}
M′)
反复使用下面三条规则,逐步消去结点,直到只剩下X和Y为止
*:用0次或者无限次