如何反驳 LL(3) 的语法?

问题描述

我编写了以下语法:

S -> a a a t | a a a a

我试图证明它不是 LL(3)。我发现 First(S)={a}Follow(S)={$} 但我似乎无法弄清楚我需要做什么来反驳它是 LL(3)。这是我为自己构建的一个小语法,以了解如何反驳 LL(k)。对于 LL(1),我构建了一个表格,并在每个字段中插入了规则库,首先/跟随。但是使用前瞻 3 我该怎么做?

解决方法

要证明一个语法是(不是)LL(3),你需要为它构造一个 LL(3) 解析器,并证明结果表中存在(或不存在)冲突。

要为 LL(3) 构造解析器表,您需要 FIRST3 和 FOLLOW3,它们类似于 FIRST 和 FOLLOW,除了它们是(最多)3 个令牌,而不是单个令牌集。所以你得到 FIRST3(S) = { "aaa" } ,它可以选择 S 的任何一个产生式,给你在这些产生式之间的表中产生冲突。