(a)消除习题3文法的左递归
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(a)消除习题3⽂法的左递归
3.8 (a)消除习题3.⽂法的左递归
(b)为(a)的⽂法构造预测分析器
答案:(a)S —> (L) | a
L —>S L′
L′—> ,S L′|∈
(b) FIRST(S)={(,a}
FIRST(L)={(,a,}
FIRST(L′)={‘,’, ∈}
FOLLOW(S)={ ‘,’,﹩}
FOLLOW(L)={ ),﹩,‘,’}
FOLLW(L′)={ ) ,﹩,‘,’}
预测分析表如下:
⾮终结符输⼊符号
() a , ﹩
S S —> (L)S —> a
L L —>S L′ L —>S L′
L′ L′—> ∈ L′—> ,S L′ L′—> ∈
【典型错误】:消除左递归请参考书上介绍的⽅法,有些⼈引⼊了两个⾮终结符,但不是最简的情况。
另外很多⼈没有构造FIRST和FOLLOW表,本题需要注意的是当FIRST 集合中有∈预测分析表的构造⽅法。
3.15(a)⽤习题3.1的⽂法构造(a,(a,a))的最右推导,说出每个右句型的句柄。
(b)给出对应(a)的最右推导的移进-归约分析器的步骤。
(c)对照(b)的移进-规约,给出⾃下⽽上构造分析树的步骤。
答案:(a) S => (L) => (L,S) =>(L,(L)) => (L,(L,S)) => (L,(L,a)) =>(L,(S,a)) =>(L,(a,a)) =>(S,(a,a)) =>(a,(a,a))
(b)
栈输⼊动作
﹩(a,(a,a))﹩移进
﹩( a,(a,a))﹩移进
﹩(a ,(a,a))﹩ S->a归约
﹩(S ,(a,a))﹩ L->S归约
﹩(L ,(a,a))﹩移进
﹩(L,(a,a))﹩移进
﹩(L,( a,a))﹩移进
﹩(L,(a ,a))﹩ S->a归约
﹩(L,(S ,a))﹩ L->S归约
﹩(L,(L ,a))﹩移进
﹩(L,(L, a))﹩移进
﹩(L,(L,a ))﹩ S->a归约
﹩(L,(L,S ))﹩ L->L,S归约
﹩(L,(L ))﹩移进
﹩(L,(L))﹩ S—>(L)归约
﹩(L,S )﹩ L->L,S归约
﹩(L )﹩移进
﹩(L)﹩ S—>(L)归约
﹩ S ﹩ Acc
(c)图见下页
【典型错误】:(a)中要求的是最右推导,很多⼈没有注意到
(b)⼀般没有错误,但注意a归约到S后要继续归约到L
(c)这题的错误主要是没有给出构造的步骤,另外题⽬要求的是⾃下⽽上构造分析表。