使用Flex和Bison

时间:2013-01-12 07:33:04

标签: grammar bison flex-lexer

我是Flex和Bison的新手,我曾尝试编写Flex词法扫描程序,然后编写Bison语法,但我遇到了以下问题:

  • 一个单词有时可以与Flex定义中的不同定义匹配,我希望Bison从它的语法中找到可供选择的好Flex定义。

例如,如果在Flex中将单词abc视为category1category2,我希望Bison选择category1,如果它出现时没有语法错误, Bison语法中的category1和category2不正确;但如果它在category1而不是category2时显示为语法错误,则Flex应将其归类为category2

有办法做到这一点吗?或者我完全误解了Flex和Bison?

3 个答案:

答案 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来回顾上下文敏感语法解析的处理。