遇到的问题:
- 二义性
- 左递归
- 回溯
二义性
如果L(G)中存在一个具有两棵或两棵以上分析树的句子,则称G是二义性的。也可以等价地说:如果L(G)中存在一个具有两个或两个以上最左(或最右)推导的句子,则G是二义性文法。
解决办法:改造文法,引入新的文法变量
左递归
存在推导A$\Rightarrow ^*$αAβ,则称文法G是递归的,
存在推导A$\Rightarrow^*$Aβ, 称之为左递归,(根据推导次数不同,分为间接和直接)
解决方法:引入新的变量A' ,将左递归产生式A→Aα|β替换为A→βA' A' →αA' |ε
回溯
解决方法:提取左因子
预测分析法
First集计算
推导出的最左的终结符(如果能推导出空串则包含空串)
- 对于X是终结符:FIRST(X):= {X}
- 对于X是非终结符:
-
First(X):={a|X→a…∈P}; 先把产生式中首字符加入集合
如果有X→ε,把 ε加入集合
-
如果有X→Y,把FIRST(Y)加入集合
-
如果有X→Y1,Y2...,并且Y1→ ε,把FIRST(Y2)加入集合(以此类推)
-
Follow集计算
后面可能跟的终结符
对于变元的概念,终结符没有
1.对X∈V,FOLLOW(X) :=∅ ; 2.FOLLOW(S) := {#}; 3.对X∈V,重复下面的第4步到第5步,直到所有FOLLOW集不变为止。 4.若A→αBβ∈P,则FOLLOW(B):=FOLLOW(B)∪FIRST(β)–{ε}; 5.若A→αB或A→αBβ∈P,且β可以推出ε,A≠B,则 FOLLOW(B) := FOLLOW(B)∪FOLLOW(A);
LL(1)文法判定:
如果G的任意两个具有相同左部的产生式A→α|β满足下列条件: 1. 如果α、β均不能推导出ε,则FIRST(α)∩FIRST(β)=∅; 2. α和β至多有一个能推导出ε; 3. 如果β能推导出ε,且FIRST(α)∩FOLLOW(A) =∅; 则称G为LL(1)文法
LL(1)分析表计算
步骤:
预测分析器
分析过程:
- 开始:分析栈中**#E,输入缓冲区w#**
- 结束:分析栈中**#** ,输入缓冲区 #