我为LALR解析器写了语法,我被困在可选的非终端。例如,当您可以编写:
时,请考虑使用C ++解除引用******expression;
当然你可以写:
expression;
这是我的问题,取消引用非终端是可选的,这对语法有这样的影响,现在解析器看到它适合所有地方(几乎),因为,它可能是空的。
是否有一个共同的模式我应该如何重写语法来修复它?
我还要感谢指出一些书或其他资源来处理“编写语法时的常见问题和模式”。
答案 0 :(得分:1)
首先,您遇到的问题不是您声称拥有的问题。具有可空(可能是空的)非终结符并不意味着解析器将尝试将其粘贴到任何地方。 (我在这里使用术语“可空”来避免混淆,因为“可选”可能指的是非终结符的可选出现,如x?
中x
是非终结名称)。它只是意味着无论何时在语法中使用非终结符,解析器都可以跳过它或与空单词匹配(详细信息根据特定解析算法的规则,在您的情况下为LALR)。
其次,问题最可能是结果语法不明确。我的猜测是你使用了某种右递归组合来定义非终结符号和星号,并用星号作为二进制乘法运算符。 (随意用语法片段更新问题,然后我可以提供更详细的帮助。)
第三,主要是关于你对语法中的一般问题和模式的追求:通常人们不会将星星放在一个非终结符和另一个非终结符中,因为最终你会想要将你的解析树转换成一个抽象的语法树。您可能打算执行一些计算,在这种情况下,您希望有一个构造,说明“取消引用表达式的取消引用”而不是“三颗星后跟表达“。同样,如果您提供更多详细信息,答案可能会更加模糊。