我无法理解如何计算LR(1)-items的前瞻。
让我们说我有这个语法:
S -> AB
A -> aAb | a
B -> d
LR(1)-item是具有前瞻的LR(0)项目。所以我们将为状态0获得以下LR(0)-item:
S -> .AB , {lookahead}
A -> .aAb, {lookahead}
A -> .a, {lookahead}
状态:1
A -> a.Ab, {lookahead}
A -> a. ,{lookahead}
A -> .aAb ,{lookahead}
A ->.a ,{lookahead}
有人可以解释如何计算前瞻吗?一般方法是什么?
提前谢谢
答案 0 :(得分:30)
LR(1)解析器中使用的前瞻计算如下。首先,开始状态有一个
形式的项目S -> .w ($)
对于每个生产S - > w,其中S是起始符号。这里,$ marker表示输入的结束。
接下来,对于包含表单A - >的任何状态。 x.By(t),其中x是终端和非终结符的任意字符串,B是非终结符号,你添加一个形式为B的项目 - >每个生产B的.w(s) - > w和集合FIRST(yt)中的每个终端。 (这里,FIRST是指FIRST sets,它们通常是在谈论LL解析器时引入的。如果你以前没有看过它们,我会花几分钟来查看那些讲义。)
让我们试试你的语法。我们首先创建一个包含
的项目集S -> .AB ($)
接下来,使用我们的第二条规则,对于A的每次生产,我们添加一个与该生产相对应的新项目,并在FIRST(B $)中查看每个终端的前瞻。由于B总是产生字符串d,FIRST(B $)= d,因此我们引入的所有产品都将具有前瞻性。这给了
S -> .AB ($)
A -> .aAb (d)
A -> .a (d)
现在,让我们构建对应于在此初始状态中看到'a'的状态。我们首先为每个以:
开头的生产移动点一步A -> a.Ab (d)
A -> a. (d)
现在,由于第一个项目在非终结符号之前有一个点,我们使用我们的规则为每个A的生成添加一个项目,使这些项目预测为FIRST(bd)= b。这给了
A -> a.Ab (d)
A -> a. (d)
A -> .aAb (b)
A -> .a (b)
继续此过程将最终构造此LR(1)解析器的所有LR(1)状态。这显示在这里:
[0]
S -> .AB ($)
A -> .aAb (d)
A -> .a (d)
[1]
A -> a.Ab (d)
A -> a. (d)
A -> .aAb (b)
A -> .a (b)
[2]
A -> a.Ab (b)
A -> a. (b)
A -> .aAb (b)
A -> .a (b)
[3]
A -> aA.b (d)
[4]
A -> aAb. (d)
[5]
S -> A.B ($)
B -> .d ($)
[6]
B -> d. ($)
[7]
S -> AB. ($)
[8]
A -> aA.b (b)
[9]
A -> aAb. (b)
如果它有所帮助,我去年夏天教了一个编译器课程并且 all the lecture slides available online 。自下而上解析的幻灯片应该涵盖LR解析和解析表构造的所有细节,我希望你发现它们很有用!
希望这有帮助!
答案 1 :(得分:2)
这里是用于语法的LR(1)自动机,如上所述 我认为尝试绘制自动机的理解会更好,流程会使前瞻的想法更清晰
答案 2 :(得分:0)
由你构建的LR(1)项目集应该还有两个项目。
I8 A - > aA.b,b来自I2
I9 A - > aAb的。 ,b来自I8
答案 3 :(得分:0)
我也有11个州,而不是8个州:
State 0
S: .A B ["$"]
A: .a A b ["d"]
A: .a ["d"]
Transitions
S -> 1
A -> 2
a -> 5
Reductions
none
State 1
S_Prime: S .$ ["$"]
Transitions
none
Reductions
none
State 2
S: A .B ["$"]
B: .d ["$"]
Transitions
B -> 3
d -> 4
Reductions
none
State 3
S: A B .["$"]
Transitions
none
Reductions
$ => S: A B .
State 4
B: d .["$"]
Transitions
none
Reductions
$ => B: d .
State 5
A: a .A b ["d"]
A: .a A b ["b"]
A: .a ["b"]
A: a .["d"]
Transitions
A -> 6
a -> 8
Reductions
d => A: a .
State 6
A: a A .b ["d"]
Transitions
b -> 7
Reductions
none
State 7
A: a A b .["d"]
Transitions
none
Reductions
d => A: a A b .
State 8
A: a .A b ["b"]
A: .a A b ["b"]
A: .a ["b"]
A: a .["b"]
Transitions
A -> 9
a -> 8
Reductions
b => A: a .
State 9
A: a A .b ["b"]
Transitions
b -> 10
Reductions
none
State 10
A: a A b .["b"]
Transitions
none
Reductions
b => A: a A b .