第3章 词法分析与有穷自动机(2)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

D
0,1
3.5.3 有穷自动机到正规文法的转换
A
0
B
1
0
0 C 1 1
0,1 从状态转换图可以看出 , 状态D是多余 的,可以去掉,于是得到与M等价的DFA M’的 状态转换图如图所示。 0 0 B A 1 C
D
3.5.3 有穷自动机到正规文法的转换
A
0 0
B
1
C
根据转换规则所求右线性文法为
G=({A,B,C},{0,1}, P, A)其中P为 A→0B | 0 A→0B 或 B→1C | ε B→1C C→0B | 0 C→0B 该自动机所识别的语言为 0(10)*。
单词值
内部字符串 二进制数值 表示
l|d
右图是一张识别前表的 单词符号的状态转换图。 图中, 状态0为初态, 凡带 双圈者均为终态; 状态17是 识别不出单词符号的出错情 况。 l 代表任一字母,d 代 表任一数字。 根据这张转换图,我 们用C语言直接编写出识 别该语言所有单词的词 法分析程序。
0
3.4.6 有穷自动机到正规式的转换
1. 在 M 的转换图上添加两个结点: X 结和Y结。从X结用ε连线连结到M的 所有初态结点,从 M 的所有终态结点 用ε连线连结到 Y 结,从而构成一新的 非确定有穷自动机 M’,它只有一个初 态结 X和一个终态结Y。显然, L(M)=L(M’)。即,这两个NFA是等价 的。
G = (VN ,VT , P , S)
M = (Q , Σ , f , q0 , Z ) M=( VN∪{D}, VT ,f, {Z}, {D}) M=( {Z,A,B,D}, {0,1),f, {Z}, {D})
f =? 根据规则来确定
Z→0A A→0A | 0B B→1A | ε
A→aB (A ,B∈VN ,a∈VT∪{ε}),令 f (A , a)=B A→a(A∈VN ,a∈VT), 令 f (A , a)=D A→ε (A∈VN ), 令A为接受状态 或令 f (A , ε)=D
f(Z,0)=A, f(Z,1)=Φ, f(z, ε)=Φ f(A,0)=A,B, f(A,1)=Φ, f(A, ε)=Φ f(B,0)= Φ, f(B,1)=A, f(B, ε)=D
Z
0
0
ε A 0 B
1
D
其状态图如图(a)或(b)所示。
Z
0
0
ε A 0 B
1
D
(a) 显然,自动机M是非确定的。 它识别的语言就是文法G[Z]所描述的语言, 即L(G[Z])=L(M)=0(0|01)*0。 1 0 A 0 B Z 0
3.6 词法分析程序的编写方法
构造词法分析程序的方法:
第一种方法是用手工方式,即根据识别语言 单词的状态转换图,使用某种高级语言,例 如C语言直接编写词法分析程序。 第二种方法是利用词法分析程序的自动生成工 具 LEX 自动生成词法分析程序,本书附录对 LEX作了简单介绍。 下面以某种简单语言为例,对第一种方法作简 要的介绍。
l|d
Scaner( ) { token=NULL; getch( ); getbc( ); if (letter(ch)) { while(letter(ch) || digit(ch)) { concat( ); getch( ); } retract( ); c=reserve( ); if(c!=10) return(c,token); else return( 10,token); }
例2 设DFA M=({A,B,C,D},{0,1}, δ, A,{B}) 其中: δ (A,0)=B δ (A,1)=D δ (B,0)=D δ (B,1)=C δ (C,0)=B δ (C,1)=D δ (D,0)=D δ (D,1)=D 构造一个右线性文法G,使得L(G)=L(M)。 该自动机相应的状态转换图如下图所示。 0 B 0 A C 1 0 1 1
0
l
1 0
非d
非l
2
ห้องสมุดไป่ตู้
d
d
3 0 5 6 7 8 9
非d
4



/



非和 非
10 11 12 14
:
13


15
;
其它
16 17
l
1 0
非d
非l
2
d
d
3 0 5 6 7 8 9
非d
4



/



非和 非
10 11 12 14
:
13


15
;
其它
16 17
3.6 词法分析程序的编写方法
在例中,我们规定所有关键字, 用户不得 使用它们作为自己定义的标识符,这样我们 可以把关键字作为一类特殊的标识符来处理, 不再专设对应的转换图。但需把它们预先安 排在一个表格中,此表叫关键字表。当利用 状态转换图识别出一个标识符时,就去查关 键字表,以确定它是否是一个关键字。 其次规定,若关键字、标识符和常数之 间没有确定的运算符或界符作间隔,则必须 至少用一个空白符作间隔,即此时的空白符 是有意义的。
3.6 词法分析程序的编写方法
5. concat( )函数,每次调用把当前ch中的字符 与token中的字符串联接。例如,假定token字 符数组中原有值为 “ab”, ch中存放着 “c”, 经调用concat( )后,token数组中的值变为 “abc”。 6. letter(ch) 和 degit(ch)布尔函数,它们分别判 定 ch 中的字符是否为字母和数字, 从而给出 true 或 false。 7. reserve( )整型函数,对token中的字符串查关 键字表,若它是一个关键字, 则回送它的编码, 否则回送标识符的种别码10。
Y
(c)
R=(10|01)(10|01)*

例2:给定下图NFA M,求正规表达式E,使L(E)=L(M)
a a
S0 a S1 b S2 b S3 b b a a 解: (1)加新结点S、Z a S1 b S2 b S3 ε S ε S0 b b (2)消去结点S1,S2,化简S0、S3
a|b a|b
B B B
对于
代换为
对于
A
r1
C
r2
r3
B
代换为
3.4.6 有穷自动机到正规式的转换
例1. 设有穷自动机的状态图如图所示。 试求该自动机识别语言的正规式。
S 0 0 V 1
10 X 10 s 01 (b) z

1 1
U 0 Z
X
S 0
1 1 0
U 0 Z
v 1 (a)

Y


01
X
Y
(10 | 01)(10 | 01) *
Z
S ε S0
(3)得到正规式
abb
S3 ε
Z
S
(a|b)*abb(a|b)*
Z
3.5 正规文法与有穷自动机
程序设计语言的单词符号可用乔母斯基3
型文法——正规文法来描述 对于正规文法所描述的语言可用一种有 穷自动机来识别 下面分别就左线性正规文法/右线性正规 文法给出构造相应有穷自动机的方法
3.5.3 有穷自动机到正规文法的转换
设给定有穷自动机M = (Q , Σ , f , q0 , Z ) 则相应的正规文法 G = (VN ,VT , P , S) 1. 令VN = Q ,VT = Σ,S = q0 2. 若f (A,a)=B 且B∈ / Z时,则将产生式 A→aB 加到P中。
3. 若f (A,a)=B 且B∈Z时,则将产生式 A→aB | a 或将产生式A→aB、B→ε 加到P中。
0
l
1 0
非d
非l
2
d
d
3 0 5 6 7 8 9
非d
4



/



非和 非
10 11 12 14
:
13


15
;
其它
16 17
l|d
相对于状态转换图用C语言编 写出词法分析程序如下:
else if(digit(ch)) { while (digit(ch)) { concat( ); getch( ); } retract( ); return(11,dtb( )); }
(b)
3.5.2 左线性正规文法到 有穷自动机的转换方法
A→Ba 设给定了一个左线性正规文法 A→a G = (VN ,VT , P , S) a= ε A→B 则相应的有穷自动机 M = (Q , Σ , f , q0 , 令 Zf ) (B , ε)=A 1. 令 Q= VN∪{q0} (q0∈ / VN) Z={S} Σ = VT 2. 对G中每一形如 A→Ba (A ,B∈VN ,a∈VT∪{ε}) 的产生式, 令 f (B , a)=A
3.4.6 有穷自动机到正规式的转换
2. 逐步消去M’中的其它结点,直 至只剩下X,Y结点。在消除结点过程 中,逐步用正规式来标记相应的箭弧。
消除结点的过程是很直观的,只 需反复使用下图的替换规则即可。
3.4.6 有穷自动机到正规式的转换
对于
A
A
r1
C
r1 r2
r2
B
B
代换为
A A A
r1r2
r1| r2 r1r2*r3
3.5.2 左线性正规文法到 有穷自动机的转换方法
3. 对G中每一形如 A→a (A∈VN, a∈VT∪{ε}) 的产生式, 令 f (q0 , a) =A
例1. 构造下述文法G[A]的自动机。 A→A1 | B1 B→B0 | 0 其状态图如下图所示。 0 1 S
0
B
1
A
显然,该自动机是确定的。它识别的语言 就是文法G[A]所描述的语言。 即 L(G[A])=L(M)=00*11*
3.5.3 有穷自动机到正规文法的转换
4. 若文法的开始符号S是一个终态,则 将产生式 S→ε 加到P中。
例1 设有穷自动机 M=({S,A},{a,b,0,1} ,f , S , {A}) 其中 f (S,a)=A f (S,b)=A a f (A,a)=A f (A,b)=A b a S f (A,0)=A f (A,1)=A A b 0 M的状态转换图如图所示。 1 根据上述转换规则,与M 等价的正规文法G为: G=({S,A},{a,b,0,1},P,S) 其中P: S→aA | bA A→aA | bA | 0A | 1A | ε 或P: S→aA | bA A→aA | bA| 0A | 1A |a|b |a|b|0|1 自动机M所识别的语言L(M)=L(G)=(a|b)(0|1|a|b)*。
例如,下表列出了某个简单语言的所有单词符号,以 及它们的种别编码和单词值。
单词符号
begin end if then else while do 标识符 整常数 + * / <= <> < : := ;
种别编码
1 2 3 4 5 6 7 10 11 13 14 15 16 17 18 19 21 22 23
3.5.1 右线性正规文法到 有穷自动机的转换方法
3. 对G中每一形如A→a(A∈VN ,a∈VT) 的产生式, 令 f (A , a)=D
4. 对G中每一形如A→ε (A∈VN )的产生 式, 令A为接受状态或令 f (A , ε)=D
例1 构造下述文法G[Z]的有穷自动机。
Z→0A A→0A | 0B B→1A | ε 其状态图如图(a)或(b)所示。
3.5 正规文法与有穷自动机
右线性正规文法到有穷自动机的转换方法 A→aB 设给定了一个右线性正规文法 A→a G = (VN ,VT , P , S) 则相应的有穷自动机 M = (Q , Σ , f , q0 , Z ) a= ε A→B 1. 令 Q= VN∪{D} (D ∈ / VN) 令f (A , ε)=B Z={D} Σ = VT q0=S 2. 对G中每一形如 A→aB (A ,B∈VN ,a∈VT∪{ε}) 的产生式 , 令 f (A , a)=B
根据状态转换图构造出词法分析程序最简 单的办法是让每个状态对应一小段程序。 首先,我们引进词法分析程序所用的全局 变量和需调用的函数如下: 1. ch 字符变量,存放当前读进的源程序字符。 2. token 字符数组, 存放构成单词符号的字符串。 3. getch( )读字符函数,每调用一次从输入缓冲 区中读进源程序的下一个字符放在ch中,并把 读字符指针指向下一个字符。 4. getbc( )函数,每次调用时,检查ch中的字符 是否为空白字符,若是空白字符,则反复调用 getbc( ),直至ch中进入一个非空白字符为止。
3.6 词法分析程序的编写方法
8. retract( )函数,读字符指针回退一个字符。 9. return( )函数,收集并携带必要的信息返回 调用程序,即返回语法分析程序。
10. dtb( ) +进制转换函数, 它将token中的数字 串转换成二进制数值表示, 并以此作为函数值 返回。
根据该语言的状态转换图用C语言编写出词 法分析程序如下:
相关文档
最新文档