在可重入的Bison生成的解析器中访问yyout

问题描述 投票:1回答:1

是否存在从可重入的Bison生成的解析器访问函数yyget_out(scanner)或变量yyout的常规方法?

[我想在解析器中使用任一方法将消息写入词法分析器的yyout

fprintf(yyout, message);

fprintf(yyget_out(scanner), message);

后者实际上是有效的,但是我必须提供原型FILE* yyget_out(yyscan_t),手动执行此操作而不是通过包含头文件来进行操作感觉很奇怪。

c bison flex-lexer reentrancy
1个回答
0
投票

您可以要求Flex在命令行中使用--header-file=FILE或在序言中使用%option header-file="FILE"生成头文件。

但是,当您尝试使用该头文件时,会发现它需要YYSTYPEYYLTYPE的定义,这些定义在Bison生成的头文件中定义。该头文件不包含在Flex生成的头文件中,因此,您必须确保已将其包含在内,或者(我的喜好)将头文件包装在自己的包含Bison和Flex生成的头的头文件中。 >

对于其他翻译单元来说很好,但是Bison生成的头文件和Flex生成的头文件之间的循环依赖关系仍然会在Bison生成的C文件本身中引起问题。我的首选解决方案是包装使用由Flex生成的代码提供的功能的函数,并将包装的函数放在包含实用程序的单独转换单元中。 (包装还可以用于其他目的,例如将特定于Flex和Bison的上下文对象隐藏在一个更通用的上下文对象中,该对象也包含您的项目所需的上下文。)尝试直接在您的Bison中#include Flex生成的标头文件会使您发疯。

由于Bison生成的C文件可能依赖于yyscan_t(在Flex生成的头文件中声明),因此仍然存在不可解决的循环性。除了放置

,似乎没有其他解决方法
typedef void* yyscan_t;

进入Bison代码序幕(但不在将其添加到头文件的位置)。

关于循环依赖问题以及在我对this question的回答中,解决该问题的方法已有较长的讨论。

© www.soinside.com 2019 - 2024. All rights reserved.