grammar - Flex 和 Bison 的使用

标签 grammar bison flex-lexer

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

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

例如,如果单词 abc 在 Flex 中可以被视为 category1category2,我希望 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/

相关文章:

c++ - 在哪里释放 Bison/Flex 中的内存?

compiler-construction - %option noinput nounput : what are they for?

java - 从 Antlr4-Java 切换到 ParseKit-Objective-C : Channels in ParseKit?

c++ - 为什么 C++ 编译器在行后而不是行上给出错误?

c - 如何用玩具语言实现返回语句?

c++ - Bison/Flex 以相反的顺序处理 token

c - 非终端符号和符号规则说明,尤其是expr是否保留?

c++ - 具有不同字符大小的 spirit::qi::grammar-name

.net - 具有基于自定义 SRGS 语法的自由格式文本

c++ - 是否可以使用带有 bison/yacc 的逆波兰符号为一种语言生成解析器?