计算机编译原理BK
1.考察如下的文法G[] :
→abcd
→a
试将其转换成等价的正则文法。
分析:
正则文法又称 3 型文法,其产生形式如:
→y
→r
其中,∈V ,y,r∈V 。
N T
文法G[]是右线性文法,可以采用逐层分解的方法将其转化为 3 型文法。
解答:
逐层分解过程如图 1.14所示。
→abcd
→a,→bcd
→b, →cd
→c,→d
图 1.14 将右线性文法文法转化为 3 型文法的逐层分解过程
其中带下划线的产生式不符合正则文法的要求,所以进入下一步的转化。转化得到的等
价的正则文法 G1[]的产生式为:
→a
→b
→c
→d
→a
2 .设文法G[] 的产生式为:
→a
→b
→a|
→d
→e
→ε
→f
→g
a)试证文法 G 是 LL(1)文法
b)用递归子程序的方法,构造文法 G 的自顶向下的句法分析程序。
构造过程中可使用如下过程。
Scan:调用词法分析程序读入下一个单词到 token 中。
Error:报错。
解答:
a)文法 G[]各产生式的选择集合为:
Select(→a)=FIRST(
Select(→b)= FIRST(d)={d,e,b}
Select(→a
Select(
Select(→d)={d}
Select(→e)={e}
Select(→ε)=FOLLOW()={b, ⊥}
Select(→f)={f}
Select(→g)={g}
∵各具有相同左部的产生式的选择集合交集为空。
∴G[]是 LL(1)文法。
b)文法 G[]可改写为:
→
→d|e|ε
→f|g
因此G[]的递归子程序方法的句法分程序所涉及的各程序为:
主程序:
Scan;
call 过程 S
if token=’ ⊥’ then Accept
else Error;
过程 S:
if token in {a,f,g}
then
begin
call 过程 A;
match a
call 过程 B;
end
else if token in {d,e,b}
then
begin
call 过程 B;
match b;
end;
else Error;
过程 A :
if token = a
then
begin
match(a);
call 过程 D;
end
else if token in {f,g}
then call 过程 D;
else Error;
过程 B :
if token = d
then match(d);
else if token = e
then match(e);
else if token in {b, ⊥}
then retur