【问题标题】:LR(1) - Items, Look AheadLR(1) - 物品,向前看
【发布时间】:2012-11-07 17:11:57
【问题描述】:

我很难理解 LR(1) 中的先行原理 - 项目。如何计算前瞻集?

举个例子,我有以下语法:

S -> AB
A -> aAb | b
B -> d

那么第一个状态会是这样的:

S -> .AB , {look ahead}
A -> .aAb, {look ahead}
A -> .b,   {look ahead}

我知道前瞻是什么,但我不知道如何计算它们。 我已经用谷歌搜索了答案,但找不到一个简单的解释这个问题的网页。

提前致谢

【问题讨论】:

    标签: parsing context-free-grammar formal-languages automata-theory


    【解决方案1】:

    我会为你的例子写下前两种状态:

    S -> AB
    A -> aAb | b
    B -> d
    

    状态 0:

    (1) S -> .AB, {$}   # Once we have done this rule it's EOF ($) 
    (2) A -> .aAb, {d}  # from (1), after A there has to be a B whose first symbol has to be d
    (3) A -> .b, {d}    # as above
    

    状态 1:

    (4) A -> a.Ab, {d}   # from (2)
    (5) A -> .aAb, {b}   # from (4), the symbol after the A has to be b
    (6) A -> .b, {b}     # from (4), as above
    (7) A -> b., {d}     # from (3)
    (8) S -> A.B, {$}    # from (1) and (7)
    (9) B -> .B, {$}     # from (8)
    

    以此类推,继续遵循与 LR(0) 解析器相同的移位/减少/关闭,但要跟踪 (lookahead for) 下一个符号...
    (状态 2+ 较长,我不建议手动计算它们!)

    我建议查看Udacity's Programming Languages 课程以了解有关词法分析和解析的更多信息。 还有an example on wikipediarelated SO question

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多