LALR(1) 解析器根本不解析文本

问题描述

我必须承认我是这方面的绝对新手,甚至可能不明白我在做什么。

我正在尝试制作一个至少包含来自 BABA IS YOU 的语法的语法,并且如果可能的话对其进行扩展。我正在使用这个工具来调试我的语法:http://jsmachines.sourceforge.net/machines/lalr1.html

诚然,我的语法目前不是 LALR(1)(从许多转移/减少冲突中可以看出,我不确定如何正确解决)。

所以,当我在解析器中输入“RED AND BLUE BABA IS YOU”时,这就是我希望看到的:

"RED AND BLUE BABA IS YOU" Expected Tree

然而我看到的是:

Unexpected outcome

我不知道从哪里开始了解我的问题,我至少需要帮助

我使用的语法是这样的:https://pastebin.com/5MHZrFLe

sentence' -> sentence
 
sentence -> give
 
give -> giver property
giver -> noun IS
 
selector -> adjective noun
 
multinoun -> noun AND
multinoun -> multinoun AND
multinoun -> multinoun noun
 
multiadjective -> adjective AND
multiadjective -> multiadjective AND
multiadjective -> multiadjective adjective
 
noun -> multinoun
noun -> selector
 
noun -> BABA
noun -> KEKE
noun -> ROBOT
 
adjective -> RED
adjective -> BLUE
adjective -> GREEN
 
property -> YOU

解决方法

为了识别该句子中的标记 AND,必须有一个从 sentence'multiadjective 的派生序列。没有这样的序列,可以通过做一个简单的可达性图(这只是一个 DFS)来轻松验证。

这使得 multiadjective 在该语法中毫无用处。您使用的工具没有就此警告您,这有点令人惊讶。

multinoun 的情况并非如此,它可以通过 noun -> multinoun 生成式访问。然而,这会产生一些歧义,导致转移/减少冲突。一个例子:

noun -> multinoun -> multinoun AND

对比

noun -> multinoun -> noun AND -> multinoun AND

表示标记分隔项列表的自底向上语法的一般模式是:

list -> item
list -> list separator item

在这样的语法中,列表包含在使用非终结符 list 而不是 item 的外部产生式中。添加 item -> list 以便能够将其称为 item 会导致与您的 noun 非终端相同的歧义,这或多或少会重现此错误。