编译原理习题解答
?/p>
1/1
第五?/p>
自顶向下语法分析方法
1
.对文法
G[S]
S
?/p>
a|
?/p>
|(T)
T
?/p>
T,S|S
(1)
给出
(a,(a,a))
?/p>
(((a,a),
?/p>
,(a)),a)
的最左推导?/p>
(2)
对文?/p>
G
,进行改写,然后对每个非终结符写出不带回溯的递归子程序?/p>
(3)
经改写后的文法是否是
LL(1)
的?给出它的预测分析表?/p>
(4)
给出输入?/p>
(a,a)#
的分析过程,并说明该串是否为
G
的句子?/p>
解:
(1) (a,(a,a))
的最左推导为
S
?/p>
(T)
?/p>
(T,S)
?/p>
(S,S)
?/p>
(a,(T))
?/p>
(a,(T,S))
?/p>
(a,(S,a))
?/p>
(a,(a,a))
(((a,a),
?/p>
,(a)),a)
的最左推导为
S
?/p>
(T)
?/p>
(T,S)
?/p>
(S,a)
?/p>
((T),a)
?/p>
((T,S),a)
?/p>
((T,S,S),a)
?/p>
((S,
?/p>
,(T)),a)
?/p>
(((T),
?/p>
,(S)),a)
?/p>
(((T,S),
?/p>
,(a)),a)
?/p>
(((S,a),
?/p>
,(a)),a)
?/p>
(((a,a),
?/p>
,(a)),a)
(2)
由于?/p>
T
?/p>
T,S
的产生式,所以消除该产生式的左递归,增中一个非终结?/p>
U
有新的文?/p>
G
/
[S]:
S
?/p>
a|
?/p>
|(T)
T
?/p>
SU
U
?/p>
?/p>
SU|
ε
分析子程序的构造方?/p>
对满足条件的文法按如下方法构造相应的语法分析子程序?/p>
(1)
对于每个非终结号
U
,编写一个相应的子程?/p>
P(U)
?/p>
(2)
对于规则
U::=x1|x2|..|xn,
有一个关?/p>
U
的子程序
P(U),P(U)
按如下方法构造:
IF CH IN FIRST(x1) THEN P(x1)
ELSE IF CH IN FIRST(x2) THEN P(x2)
ELSE ...
.
.
.
IF CH IN FIRST(xn) THEN P(xn)
ELSE ERROR
其中?/p>
CH
存放当前的输入符号,是一个全程变量;
ERROR
是一段处理出错信息的程序?/p>
P(xj)
为相应的子程序?/p>
(3)
对于符号?/p>
x=y1y2...yn;p(x)
的含义为?/p>
BEGIN
P(y1);
P(y2);
...
P(yn);
END
如果
yi
是非终结符,?/p>
P(yi)
代表调用处理
yi
的子程序?/p>
如果
yi
是终结符,则
P(yi)
为形如下述语句的一段子程序
IF CH=yi THEN READ(CH) ELSE ERROR
即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号?/p>
CH
中,
否则表明出错?/p>
(4)
如果文法中有空规?/p>
U::=EPSILON,
则算法中的语?/p>
IF CH IN FIRST(xn) THEN P(xn)