4

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

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

例如,如果这个词在 Flexabc中可以看成category1or category2,我想让 Bison 选择category1它是否像 Bison 语法那样出现没有语法错误,category1而像 category2 那样不正确;但如果它在是category1而不是 as时显示为语法错误category2,则 Flex 应将其归类为category2.

有没有办法做到这一点?还是我完全误解了 Flex 和 Bison?

4

3 回答 3

2

这种情况通常出现在通常称为“半保留”字词或 C# 中称为“上下文关键字”的字词中。在 bison/flex 中,处理这些是一件很痛苦的事情。(Lemon 有一个未记录的功能,您可以使用该%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-12T19:37:18.397 回答
0

Flex 支持“开始状态”和“独占开始状态”,这可能会让您达到您想要的效果。如果你可以提前知道上下文是abc应该的category1,那么你可以告诉 Flex 启动一个被分类为的状态abccategory1而在其他状态下,它被分类为category2。完成特殊状态后,不要忘记将状态切换回来。这种技术可用于在某些上下文中将选定的关键字变成关键字,而在其他上下文中将其保留为标识符。但是,通常情况下,您让词法分析器始终以相同的方式对其进行分类(例如,作为 token KW_ABC)并让语法继续使用该标记。

于 2013-01-12T21:22:04.913 回答
-1

重申 Jonathan Leffler 在 1 月 13 日 19:39 的上述评论,您正在尝试使用上下文不敏感的解析器生成器工具解析上下文敏感的语言。您需要重新考虑语法或重新考虑您对解析器生成器工具的选择——您所做的相当于尝试使用螺丝刀敲钉子。

如果是我,我会回到书籍和互联网上来回顾上下文相关语法解析的处理。

于 2013-11-10T20:08:33.823 回答