问题描述
我必须承认我是这方面的绝对新手,甚至可能不明白我在做什么。
我正在尝试制作一个至少包含来自 BABA IS YOU 的语法的语法,并且如果可能的话对其进行扩展。我正在使用这个工具来调试我的语法:http://jsmachines.sourceforge.net/machines/lalr1.html
诚然,我的语法目前不是 LALR(1)(从许多转移/减少冲突中可以看出,我不确定如何正确解决)。
所以,当我在解析器中输入“RED AND BLUE BABA IS YOU”时,这就是我希望看到的:
然而我看到的是:
我不知道从哪里开始了解我的问题,我至少需要帮助
我使用的语法是这样的: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
非终端相同的歧义,这或多或少会重现此错误。