我怎样才能证明这个语法没有歧义?

How Can I demonstrate this grammar is not ambiguous?

我知道我需要证明没有字符串可以只使用最左边的操作得到,这将导致两个不同的解析树。但是我该怎么做呢?我知道没有一种简单的方法可以做到这一点,但由于这个练习在编译器 Dragon 的书上,所以我很确定有一种方法可以展示它(不需要正式证明,只需证明为什么)。 语法是:

S-> SS* | SS+ | a

这个文法表示的是简单算术的另一种方式(我不记得名字了,如果有人知道这个技术,请告诉我):普通求和算术的形式是a+a,这只是表示另一种方式求和和乘法。所以aa+也是a+a的意思,aaa*+就是a*a+a等等

我认为示例字符串 aa 实际上显示了您的需要。难道不能解析为:

S => SS* => aaS => SS+ => aa

证明 CFG 无歧义的最简单方法是构造一个无歧义的解析器。如果语法是 LR(k) 或 LL(k) 并且您知道 k 的值,那么这很简单。

这个特定的语法是 LR(0),所以解析器的构造几乎是微不足道的;你应该能够在一张 sheet 纸上完成(在你尝试查找答案之前值得这样做。

直觉很简单:每个产生式都以不同的终结符号结束,并且这些终结符号在语法中的任何其他地方都没有出现。因此,当您阅读一个符号时,您会准确地知道要减少哪个产生式;只有一个可以申请,没有可以换到的左边

如果您反转语法以生成波兰语(或 Łukasiewicz)表示法,那么您将得到一个简单的 LL 语法。同样,解析算法很明显,因为每个右手边都以一个唯一的终端开始,所以只能做出一个预测:

S → * S S | + S S | a

所以这也很明确。但是中缀语法有歧义:

S → S * S | S + S | a

提供歧义的最简单方法是找到一个有两个解析的句子;在这种情况下,这样的一句话是:

a + a + a