LR(1)项目DFA - 计算前瞻

时间:2012-12-31 15:12:58

标签: parsing context-free-grammar lookahead dfa lr

我无法理解如何计算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}

有人可以解释如何计算前瞻吗?一般方法是什么?

提前谢谢

4 个答案:

答案 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)自动机,如上所述 我认为尝试绘制自动机的理解会更好,流程会使前瞻的想法更清晰

here is the automaton for the grammar

答案 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 .