为什么ll(k)和ll(∞)与左记录不兼容?我知道,只要使用K-Overahead代币,LL(k)语言可以支持左派复发性。但是,使用LL(∞)语法,无法解决哪种类型的歧义?

有帮助吗?

解决方案

$ ll $ variants左递归的问题是$ ll $的工作方式所固有的:它是自上而下的类型解析器,这意味着它用其生产代替了非终端。

$ ll $式的解析器的工作原理如下。它一口气从左到右遍历输入。如果我们在输入中的某个时刻,那么我们知道这一点左侧的所有内容都可以。对于这一点右侧的所有内容,解析器构建了它希望看到的东西的“近似值”。例如,考虑这种语法:

1:$ e to e + e $
2:$ e to x $

请注意,语法不是$ ll $,但我们仍然可以在$ ll $ style中解析输入。在输入$ x+x+x $上,$ ll $ - 风格的解析器最终可能会位于$ x+ bullet x+x $。假设它已经决定左右$ x+$是可以的,并且在其余的输入中,它希望看到$ x+e $。然后,它将发现$ x+x+$很好,剩下$ e $。然后,它可以用生产,尤其是上面的生产2替代此$ e $。剩下$ x $,解析器将接受输入。

然后,诀窍是正确确定给定非终端的替换生产。语法是$ ll(k)$,如果我们可以通过查看下一个$ k $输入符号来做到这一点,而其他技术则更强大。

现在考虑以下语法:

1:$ a to a $
2:$ a to varepsilon $

如果$ ll $ parser试图用生产代替$ a $,则必须在生产1和2之间做出决定。

让我们考虑一下,如果我们的解析器无所不知,那么适当的行动将是什么。每次取代生产1 $ a $时,它都会为其余输入的期望添加$ a $(预期的剩余时间从$ a $ aa $ aa $ to $ aa $ to $ aaa $ ...),但是,一开始的$ a $并没有消失。最终,它必须选择生产2,之后$ a $消失了,并且永远无法在期望中添加$ a $ s。

由于没有机会匹配几个输入符号,因此解析器必须确切地决定必须匹配多少次生产1。这意味着它必须确切知道在我们的情况下,$ a $目前将出现在其余的输入中。

但是,$ ll(k)$只能看到前方的$ k $符号。这意味着,如果必须选择生产1超过$ K $ times,那么解析器就无法“看到”这一点,因此注定要失败。 $ ll(*)$在解析时比$ ll(k)$更好,因为它可以在输入中任意地看到,但是关键的细节(并非总是提到)是这个lookahead是 常规的.

想象一下会发生什么,您可以查看该算法如下:当它必须决定要采用哪种生产时,它会启动有限状态机器(DFA(DFA),该机器等同于正则表达式),并让该机器查看其余的输入。然后,该机器可以报告“使用此生产”。但是,这台机器的功能受到严重限制。尽管它比仅查看下一个$ k $符号要好得多,但不能例如“计数”,这意味着它在上述情况下无济于事。

即使您要在此有限自动机中的某些计数函数中“入侵”,仍然有左记录语法,您确实需要更多的功能。例如,对于这种语法:

$ a to ab $
$ a to varepsilon $
$ b to(b)$
$ b to varepsilon $

您必须匹配匹配牙套的“塔”,这是有限自动机无法做的事情。更糟糕的是:

$ a to bcade $
$ a to a'$
$ a' to a'de $
$ a' to varepsilon $
$ b to a b a mid b b b b mid aa mid bb $
$ c to c c c mid d c d mid cc mid dd $
$ d to e d e mid f d f mid ee mid ff $
$ e to g e g mid h e h mid gg mid hh $

是一种完全可怕的语法,我敢肯定,没有已知的线性时间解析算法作品,所有已知的一般解析算法都需要二次时间。更糟糕的是,任何描述这种语言的语法都必然会是左派恢复的。语法仍然是明确的。您需要手工制作的解析器来线性时间解析这些怪物。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top