![]() |
1
2
bison生成的头中最重要的是用于标识令牌类型的枚举值(这是通过词汇操作返回给解析器的值)。
头还声明
由于头依赖项不能是循环的,所以分析器在扫描仪上没有任何头依赖项。因此,您的bison输入文件必须包含一个声明
对于解析器和扫描器之间的经典接口来说,这是很好的,后者使用全局变量进行通信。它也或多或少地与可重入的(“纯”)解析器一起工作,其中语义值(和位置,如果使用)通过参数传递给
它开始崩溃的地方是当扫描仪也重新进入。在这种情况下,解析器必须使用类型为的不透明扫描器上下文对象调用扫描器。
这是一个非常真实的问题,因为可重入扫描器的公共接口包括其原型需要特定于解析器的数据类型的函数。(
解决这个问题的通常方法是通过注意到
在我看来,一个不那么难看的解决方案是完全避免这种特殊的配置。Bison允许您请求一个可重入的“push-parser”,它可以与一个可重入的扫描器一起使用,而不会出现上述任何问题。
在push解析器模型中,scanner是用来解析文件的顶级函数,scanner每次识别一个令牌时都会调用解析器。头依赖项不再是循环的,因为解析器不需要知道关于扫描器上下文对象的任何信息,或者关于
推送解析器除了简化两个组件之间的头依赖性之外,还常常简化扫描器内部的控制流。在许多用例中,单个扫描器模式将导致标识多个令牌。在传统模型中,扫描器必须保留一个令牌队列,在解析器调用时一次释放一个。但在推送模型中,扫描器操作只需对每个标识的令牌多次调用解析器。该模型由Lemon解析器生成器(sqlite3的一部分)推广,随后由其他解析器生成器(包括bison)实现。 |
![]() |
Kris · Flex-新行无法识别 7 年前 |
![]() |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
![]() |
Juan Torres · Flex:匹配有符号整数与加法/减法 9 年前 |
![]() |
mljli · flex正则表达式使用带有尾随上下文的{-} 9 年前 |
![]() |
TreeTree · lex和yacc的运行时“语法错误” 12 年前 |