【问题标题】:How to transform a grammar into LL(1) grammar form?如何将文法转换为 LL(1) 文法形式?
【发布时间】:2013-08-16 10:37:03
【问题描述】:
E -> E+E|E*E|(E)|a

鉴于语法, 如何将语法转换为 LL(1) 形式?

E->aX|(E)
X->+E|*E|epsilon

这是 LL(1) 语法吗?

【问题讨论】:

    标签: context-free-grammar automata


    【解决方案1】:

    原始语法是左递归的,因此不是 LL(1),实际上对于任何 k 都不是 LL(k)。

    幸好左递归可以去掉。标准算法通过分别处理立即左递归(正如我们在这里)和间接左递归来做到这一点。立即左递归是两者中较简单的情况。维基百科的文章解释了它here

    基本上你将递归引用之后的部分移动到一个新的产生(尾部)中,它也有一个ε 替代,

       X -> ε|+E|*E
    

    然后,您从原始产生式中删除左递归替代方案,并允许 X 遵循所有剩余的非递归替代方案,

       E -> (E)X|aX
    

    请注意,您的提案错过了括号表达式后面的X,因此它无法识别相同的语言。

    【讨论】:

    • FWIW:原始语法也是模棱两可的,因此对于任何 k 也不是 LR(k)。转换后的文法没有歧义,但其解析不符合正常的算术优先级。可能这两个事实都将在课程的后面部分介绍。
    【解决方案2】:

    ) 为这个语法找到 FIRST(S) 和 FOLLOW(S): S → d S a S → c S b S → ε

    【讨论】:

    • 这甚至与问题有关吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多