例4.1假定有文法
(1)S→xAy
(2)A→**|* (4 .1)
以及输入串 x*y(记为α)。
为了自上而下构造 α的语法树,我们首先按文法的开始符号产生根结
s,并让指示器 IP指向输入串的第一个符号 x。然后,用 S的规则
(此处关于 S的规则仅有一条)把这棵树发展为
S
X A Y
非终结符 A有两个候选,试着用它的第一个候选去匹配
输入串,于是把语法树发展为
子树A的最左子结和 IP所指的符号 *相符,然后我
们再把IP调为指向下一符号并让 A的第二个子结进入
工作。但 A的第二子结 *和当前所指的符号 y不一致。
因此,A告失败。这意味着 A的第一个候选此刻不适
用于构造 α的语法树。这时应该回头(回溯),看 A
是否还有别的候选。
S
X A Y
* *
为了这种回溯,我们一方面应把 A的第一候选所
发展的子树注销掉,另一方面应把 IP恢复为进入
A时的原值,也就是让它重新指向第二个输入符
号,。现在我们试探 A的第二个候选,即考虑如下
的语法树:
X A Y
S
*
间
接左递归
例如文法 :
S →Qc|c
Q →Rb|b
R →Sa|a
虽
不具有直接左递归,但
S,Q,R都
是左递归的,
例如有S=>Qc=>Rbc=>Sabc
解
:将终结符排序为
R、Q、S。对于R不存在
直接左递归。
把R带入到Q中有关的候选式: Q Sab|ab|b
现在Q同
样不含直接左递归,把它带入
S的有关候选式:
S Sabc|abc|bc|c
经消除S的
直接左递归后我们们得到 整个文法
S abcS’|bcS’|cS’
S’ abcS’|
Q Sab|ab|b
R Sa|a
由于关于 Q,R的规则式
多余的则可化简
得到:S abcS’|bcS’|cS’
S’ abcS’|
消除
左递归算法:
(1)把文法G的所有非终结符按任一
顺序排列成
P
1,P
2,...P
n;
按此
顺序执行
(2)FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i-1 DO
把
形如
P
i
→P
jγ的规则
改写成
Pi →δ
1
γ| δ
2
γ|...| δ
k
γ,
其中
P
j
→δ
1
|δ
2
|
...|
δ
k是关于Pj的所有规则
消除
关于
P
i规则的
直接左递归性
END
提
左因子
A → δβ
1
|δβ
2
|...|δβ
n
|γ
1
| γ
2
|..|γ
m
改写
为
A → δ A' |γ
1| γ
2 |..|γ
m
A' →β
1|β
2|...|β
n
例题与
习题解答
[例1]试构造与下
列文法
G[S]等
价的无左递归文法。
G[S]: SSa|Nb|c (1)
N Sd|Ne|f (2)
对于(1)我们
引入新非终结符
S’
则: S NbS’ |cS’ [1]
S’ aS’| [2]
将
S代入 (2)
N Ne |NbS’d |cS’d |f
引
入新非终结符
N’
N cS’dN’ |fN’ [3]
N’ eN’ |bS’dN’ | [4]
[例2]:文法G的规则
集为
;
P begin d : X end
X d : X | sY
Y : sY |
做
出该文法
LL(1)分析表。
解
: 非终结符只有
P , X ,Y 只有FIRST(Y)含有 则
需
要求出
FOLLOW(Y)且
FOLLOW(Y) =FOLLOE(X)=end
则有LL(1)表:
begin d : end s #
P begind : X end
X d : X sY
Y :sY
[例3]:
给出语言
L={1
n
a0
n
1
m
a0
m
|n>0, m>=0} 的LL(1)
文法G[S]并说明
其理由。
解
:观察句子
,发现可分成两部分 1
n
a0
n
和 1
m
a0
m
两
部分中符号的个
数
n和m没
有制约关系。则可改造成
下
列文法:
S AB
A 1A0 |1a0
B 1B0 |a
对于产生式 A 1A0 |1a0 两个候选式
FIRST(1A0)FIRST(1a0)={1}<> 所以上
边文法
不是LL(1)文法:
需左提公因子,得到:
S AB
A 1C
C A0 |a0
B 1B0 |a 此文法
满足
LL(1)文法的要求。
[例4] 设
有文法:
G[S]:
SaBc | bAB
AaAb | b
Bb | 构造
其
LL(1)分析表,并分析符号串 baabbb是否是
该文发的句子。
解
:因为只有
FIRST(B)含有 所以只考虑:
FOLLOW(B)=FIRST(c) FOLLOW(S)={c, #} 该文法的 LL(1)
表
a b c #
S aBc bAB
A aAb b
B b
符号串baabbb是否为句子的分析过程
步骤
符号栈
S 输入串 规则
1#S baabbb# SbAB
2#BAb baabbb#