当试图用P去匹配输入串时,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配,这样一来,使推导无限循环下去。
(1)直接左递归原式:
P→Pα1|Pα2|…|Pαm|β1|β2|…|βn
改为
P→β1P’|β2P’|…|βnP’
P’→α1P’| α2P’|…|αmP’| ε
(2)将间接左递归改造为直接左递归
将文法中所有如下形式的产生式:
Pi →Pjγ|β1|β2|…|βn
Pj→δ1|δ2|δ3|…|δk
改写成:
Pi →δ1γ|δ2γ|δ3γ|…|δkγ|β1|β2|…|βn
2.回溯
3.LL1文法
如果首符集不含有字符串中的某个字符但是却含有空字,而且他的下一个字符会含有此字符此时只有首符集不能解决问题,就需要follow集了。
LL1符合的条件:
(1)文法不含左递归
(2)对于文法中每一个非终结符A的各个产生式的候选式的FIRST集两两不相交。
(3)对于文法中的每个非终结符A,若它的某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=Φ
4.不带回溯的自上而下分析的方法
对于LL(1)文法,假设要用非终结符A进行匹配,面临输入符号为a,A的所有产生式为
A→α1|α2|…|αn
(1)若a ∈ FIRST(αi) ,则指派αi去匹配
(2)若a不属于任何一个候选首符集,则:
①若ε属于某个 FIRST(αi)且a∈FOLLOW(A),则让A与ε自动匹配;
②否则,a的出现是一种语法错误
5.预测分析程序
预测分析表
栈内操作
2.1若X=a=#,分析成功,停止。E匹配输入串成功.
2.2若X=a≠#,把X推出栈,再读入下一个符号。
2.3若X∈Vn,查分析表M。
a) M[X,a]= X→UVW
则将X弹出栈,将UVW压入
注:U在栈顶 (最左推导)
b) M[X, a] = error 转出错处理
c) M[X, a] = X-〉ε ---a为X的后继符号
则将X弹出栈 (不读下一符号)
继续分析。
课后题
大体看了看课后题,大都是这种类型,起码考察的知识点除了编程之外就都是这些了,开始先将文法换成LL1形式,以便于构造首符集和follow集,然后根据这些写出预测分析表,如果预测分析表没有多重入口,那么 文法符合LL1形式,具体的构造方法都在上述的知识点中体现具体就不在赘述了。
感想:
在写这篇之前,自己看了一下之前写的那一篇,描述知识部分大都是自己的语言,而且还没有分成点来记,造成的后果就是自己有的都看不懂了...所以以后的知识点总结还是按照课本为标准,来总结提炼知识点,课后题我也没有很多的时间一个一个来做,挑的都是些可以基本上概括所有的知识的题目类型,如果没有这种类型的题目可以自己改一下题目要求,自己练习一下,到达能覆盖所有知识点的要求,以便于以后的复习.