【问题标题】:Making a Grammar LL(1)制作语法 LL(1)
【发布时间】:2013-03-01 15:52:30
【问题描述】:

我的语法如下:

S → a S b S | b S a S | ε

由于我正在尝试为其编写一个小型编译器,因此我想将其设为 LL(1)。我看到这里似乎存在 FIRST/FOLLOW 冲突,我知道我必须使用替换来解决它,但我不完全确定如何去做。这是我提出的语法,但我不确定它是否正确:

S-> aSbT | ε

T-> bFaF| ε

F-> ε

有人可以帮忙吗?

【问题讨论】:

    标签: parsing programming-languages grammar context-free-grammar ll


    【解决方案1】:

    在他的original paper on LR parsing 中,Knuth 给出了该语言的以下语法,他推测“这是该语言可能最简短的明确语法:”

    S → ε |抗体 | bBaS

    A → ε |抗体

    B → ε | bBaB

    直观地说,这试图将任何 As 和 B 字符串分解成完全平衡的块。有些块以 a 开头,以 b 结尾,而另一些以 b 开头,以 a 结尾。

    我们可以按如下方式计算 FIRST 和 FOLLOW 集:

    FIRST(S) = { ε, a, b }

    FIRST(A) = { ε, a }

    FIRST(B) = { ε, b }

    关注(S) = { $ }

    FOLLOW(A) = { b }

    FOLLOW(B) = {一个}

    基于此,我们得到如下LL(1)解析表:

       |   a   |   b   |   $   
     --+-------+-------+-------
     S | aAbS  | bBaS  |  e
     A | aAbA  |   e   |
     B |   e   | bBaB  |
    

    所以这个语法不仅是 LR(1),也是 LL(1)。

    希望这会有所帮助!

    【讨论】:

    • 感谢您提供这个有用的答案。我也很好奇你对我提出的语法的看法——在我看来它也是 LL(1) 并且与 Knuth 的没有太大区别。我也看不到任何可能失败的字符串。
    • @JohnRoberts- 我认为您的语法不能正常工作 - 例如,它无法获取任何以 b 开头的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多