我是Flex和Bison的newby,我尝试过编写Flex词法扫描器,然后编写Bison语法,但我遇到了以下问题:
例如,如果abc一词在Flex中可以被视为category1或category2,我希望Bison选择category1,如果它在Bison语法中显示为category1,而在category2中不正确;但是如果它在category1而不是category2时显示为语法错误,那么Flex应该将它归类为category2。
有办法这样做吗?还是我完全误解了Flex和Bison?
发布于 2013-01-12 19:37:18
这种情况通常发生在通常被称为“半保留”的单词,或者在C#中称为“上下文关键字”。在野牛/跳蚤中,这些都是要处理的痛苦。(柠檬有一个无文档化的特性,您可以使用%fallback指令为令牌定义回退,这对于这个用例来说是完美的;您只需将IDENTIFIER作为任何上下文保留令牌的后备项。)
通过一些工作,您可以通过定义非终端来达到同样的效果,例如:
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,将其替换为一个受限制的非终端,它排除了参与冲突的半保留字。
这不是很好,但这是我所知道的最好的方法。
发布于 2013-01-12 21:22:04
Flex支持“开始状态”和“独占启动状态”,这可能允许您实现您想要的效果。如果您可以预先知道上下文是这样的,abc应该是category1,那么您可以告诉Flex启动一个abc被分类为category1的状态,而在其他状态下,它在category2中被分类。当你完成特殊状态时,别忘了把状态切换回来。这种技术可用于在某些上下文中将选定的关键字转换为关键字,并在其他上下文中作为标识符保留。但是,通常情况下,词法分析器总是以相同的方式对其进行分类(例如,令牌KW_ABC),并让语法继续使用该标记。
发布于 2013-11-10 20:08:33
为了在19:39重申Jonathan对1月13日的上述评论,您正在尝试使用上下文不敏感的解析器生成器工具来解析上下文敏感的语言。你需要重新思考语法,或者重新考虑你选择的解析器生成器工具--你所做的就相当于试图用螺丝刀敲击钉子。
如果是我,我会回到书籍和英特网,回顾上下文敏感语法解析的处理。
https://stackoverflow.com/questions/14291319
复制相似问题