【问题标题】:What is the real meaning of having multiple entries in the LL(1) parse table?在 LL(1) 解析表中有多个条目的真正含义是什么?
【发布时间】:2018-05-02 10:26:18
【问题描述】:

语法:

S->aABb
A->a/epsilon
B->b/epsilon 

这个语法不是LL(1),但是这个语法是无歧义的,所以即使在表中有多个条目之后,这个语法也是无歧义的。那么,当语法为 Unambiguous 时,表中有多个条目的直观含义是什么。

解析器访问列M[B, b]时,有B->bB-> epsilon两个选择。这种性质不是不确定的,但这种语法在现实中是明确的,因此如何解决这种冲突,其中虽然我们在解析表中有多个条目,但语法仍然是明确的。

【问题讨论】:

    标签: compilation compiler-construction


    【解决方案1】:

    这意味着语法不是 LL(1),您要么需要使用另一种解析算法,要么尽可能将语法重写为 LL(1)(在这种情况下,这意味着切换 bS 规则中的B)。

    【讨论】:

    • 但是多个条目意味着歧义正确但它并不模棱两可,所以只有在 LL(1) 的情况下才模棱两可,它可以被任何其他自下而上的解析器解析。
    • @radhika 多个条目表示该语法不是 LL(1),仅此而已。
    • 但是 LL(1) 不使用以下规则检查歧义:First(Non-terminal) intersection Follow(Non-terminal) = empty set ?
    • @radhika 不。检查语法是否有歧义根本不是实现 LL(1) 解析器的一部分。您需要检查语法是否为 LL(1)(或者更确切地说,您会在构建解析表时自然而然地发现),而不是它是否模棱两可。任何属于 LL(1) 的文法也是明确的。如果文法不是 LL(1),那么无论是因为它是模棱两可的还是左递归的,还是因为所需的前瞻量都无关紧要。它不是 LL(1),所以你不能使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2017-05-06
    • 2012-03-30
    • 2011-10-10
    相关资源
    最近更新 更多