我是 Flex 和 Bison 的新手,我尝试编写 Flex 词法扫描器,然后编写 Bison 语法,但遇到以下问题:
- 一个单词有时可以与 Flex 定义中的不同定义相匹配,我希望 Bison 从它的语法中找到合适的 Flex 定义来选择。
例如,如果单词 abc
在 Flex 中可以被视为 category1
或 category2
,我希望 Bison 选择 category1
如果它在 Bison 语法中显示为 category1
时没有语法错误,但显示为category2 则不正确;但如果它在 category1
而非 category2
时显示为语法错误,则 Flex 应将其分类为 category2
。
有办法做到这一点吗?或者我完全误解了 Flex 和 Bison?
最佳答案
这种情况通常是由 C# 中所谓的“半保留”字或所谓的“上下文关键字”引起的。在 bison/flex 中,这些都是很难处理的。 (Lemon 有一个未记录的功能,您可以使用 %fallback
指令定义 token 的后备,这非常适合此用例;您只需将 IDENTIFIER
作为后备任何上下文保留的 token 。)
通过一些工作,您也许可以通过定义非终结符来实现相同的效果,例如:
identifier : IDENTIFIER | VAR | ADD | REMOVE | DYNAMIC | GLOBAL | ...
/* VAR is special in a local-variable-type: */
local_variable_type_identifier : IDENTIFIER | ADD | REMOVE | DYNAMIC | GLOBAL | ...
您可能可以通过在整个过程中使用identifier
来找到需要自定义的位置,然后解决每个冲突,其中包括通过将其替换为受限制的非-来减少identifier
排除参与冲突的半保留字的终端。
这不是很好,但这是我所知道的最好的方法。
关于grammar - Flex 和 Bison 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291319/