我是Flex和Bison的新手,我曾尝试编写Flex词法扫描程序,然后编写Bison语法,但我遇到了以下问题:
例如,如果在Flex中将单词abc
视为category1
或category2
,我希望Bison选择category1
,如果它出现时没有语法错误, Bison语法中的category1
和category2不正确;但如果它在category1
而不是category2
时显示为语法错误,则Flex应将其归类为category2
。
有办法做到这一点吗?或者我完全误解了Flex和Bison?
答案 0 :(得分:2)
这种情况通常出现在C#中经常被称为“半保留”的词或者所谓的“上下文关键词”中。在野牛/弯曲中,这些都很难对付。 (Lemon有一个未记录的功能,您可以使用%fallback
指令定义令牌的回退,这对于此用例是完美的;您只需为任何上下文保留的令牌设置IDENTIFIER
回退。)< / p>
通过一些工作,您可以通过定义非终端来实现相同的效果:
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
,方法是将其替换为限制的非终端,排除半参与冲突的保留词。
这不是很好,但这是我所知道的最佳方法。
答案 1 :(得分:0)
Flex支持“开始状态”和“独占开始状态”,可以让您达到所需的效果。如果您可以事先告知上下文abc
应该是category1
,那么您可以告诉Flex启动abc
被归类为category1
的状态,而在其他州,它被归类为category2
。当您完成特殊状态时,不要忘记将状态切换回来。这种技术可用于在某些上下文中将选定的关键字转换为关键字,并将其作为标识符留在其他上下文中。但是,通常情况下,词法分析器总是以相同的方式对其进行分类(例如,作为标记KW_ABC
),并让语法继续使用该标记。
答案 2 :(得分:0)
重申Jonathan Leffler在1月13日19:39的上述评论,你试图用上下文不敏感的解析器生成器工具解析上下文敏感的语言。你需要重新思考语法或重新思考你选择的解析器 - 生成器工具 - 你所做的就是试着用螺丝刀敲钉子。
如果是我,我会回到书籍和Interwebs来回顾上下文敏感语法解析的处理。