‘壹’ 编译原理判断题
1. B 正确
2. A 错误,不一定存在
3. B 正确
4. B 正确
5. A 错误,是后缀式
6. A 错误,只是算符文法,不一定是算符优先文法
7. B 正确
8. B 正确
9. A 错误,语义动作是附加在产生式上的,不是附加在非终结符上
10. A 错误,有些文法不能改写为LL(1)文法
11. B 正确
12. B 正确
13. B 正确
14. B 正确
15. A 错误,SLR(1),LR(1)等都是冲突解决的办法
16. B 正确
17. B 正确
18. A 错误,不是编译程序工作效率高,而是生成的目标程序运行效率高
19. B 正确
‘贰’ 关于LL(1)文法
(1)first(E)={(,i},first(D)={+,-,ε},first(T)={(,i},first(S)={*,/,ε}
first(F)={(,i}
follow(E)={#,)},follow(D)={#,)},follow(T)={+,-,#,)} follow(S)={+,-,#,)} follow(F)={*,/,+,-,#,)}
(2)select(E->TD)=FIRST(TD)={(,i}
SELECT(E->+TD)={+}
SELECT(E->-TD)={-}
SELECT(E->ε)={#,)}
SELECT(T->FS)={(,i}
SELECT(S->*FS)={*}
SELECT(S->/FS)={/}
SELECT(S->ε)={+,-,#,)}
SELECT(F->(E))={(}
SELECT(F->i)={i}
预测分析表:
+ - * / ( ) i #
E ->+TD ->-TD ->TD ->ε ->TD ->ε
D
T ->FS ->FS
S ->ε ->ε ->*FS ->/FS ->(E) ->ε ->ε
F ->i
(3)i/i-i的分析过程:
步骤 输入串 剩余串 移进或规约
1 # i/i-i#
2 #i /i-i# E->TD
3 #DT ......
...
剩余的只要按照书上的步骤填就行了。
‘叁’ 什么叫首符集不相交 编译原理(判定是否为LL(1)文法)
就是各自的first集没有相同的元素
‘肆’ 编译原理的LL(1)文法是什么意思
第一个L表示从左向右读取要判断的字符(括号内数字表示每次读取的字符数),第二个L指最左推导。
‘伍’ 关于LL(1)文法的编译原理题目
判断是不是LL(1),首先看候选式的首字符有没有相同的,第二判断首字符迭代进去是否会构成左递归。
如果首字符不相同,也没用左递归就说明此文法是LL(1)
M→MaH|H
H→(M)|b(M)|b
第一个产生式中存在左递归:M->MaH
第二个产生式中存在首字符相同:H->b(M) ,
H->b
怎么改呢?
对第一个产生式,消除左递归就是要变成右递归,把右边剩下的符号提到前面:
M->aHM'
M'->aHM'
对第二个产生式,提出公共因子
H->b( (M)|ε)
=>
H->bH'
H'->(M)|ε
‘陆’ 编译原理怎么判断是否为slr文法
LL(1)就是向前只搜索1个符号,即与FIRST()匹配,如果FIRST为空则还要考虑FELLOW.
LR需要构造一张LR分析表,此表用于当面临输入字符时,将它移进,规约(即自下而上分析思想),接受还是出错.
LR(0)找出句柄前缀,构造分析表,然后根据输入符号进行规约.
SLR(1)使用LR(0)时若有冲突,不知道规约,移进,活移进哪一个,所以需要向前搜索,则只把有问题的地方向前搜索一次.
LR(1)1.在每个项目中增加搜索符.2.举个列子如有A->α.Bβ,则还需将B的规则也加入.
LALR(1)就是假如两个产生式集相同则将它们合并为一个,几合并同心集.
‘柒’ 编译原理题目关于判断LL(1)文法的
A 不是,因为含有左公共引子a
B 和D不是,因为含有左递归
C是,因为SELECT(S→aS) 与SELECT(S→b)的交集为空,符合LL(1)文法的定义。
‘捌’ 编译原理的LL(1)文法是什么意思
1.文法不含左递归,没有公共左因子
2.对于文法中的每个非终结符A的产生式的候选首符集两两不相交。
3.对于文法中的每个非终结符A,它存在某个候选首符集包括ε,则FIRST(A)∩FOLLOW(A)=空
满足以上条件的文法为LL(1)文法
‘玖’ 编译原理 对一个文法进行改写,然后判断改写后的文法是不是LL(1)文法,请问改写方式的不同是否影响结果
楼上的答案是错误的。对同一种文法,可能同时存在两种改写方法,其中一种使改写后的新文法为LL(1)文法,而另外一种使改写后的新文法不为LL(1)文法。