Bison 野牛版本之间的差异

Bison 野牛版本之间的差异,bison,Bison,我不熟悉词法分析和解析器生成,我尝试直接从编译bison示例开始。这是一个可重入解析器的示例 我试着用bison的两个版本编译:2.5和2.6.5。前者可以完美地编译和执行,但后者在解析器头中包含类型yyscan\t,该类型在lexer头(lexer.h)中声明(我想这是可重入特性所必需的)。因此,它不会编译由Parser.y生成的Parser.c 下面是由2.6.5在Parser.h中生成的额外部分,它在2.5中不存在: #ifdef YYPARSE_PARAM #if defined __S

我不熟悉词法分析和解析器生成,我尝试直接从编译bison示例开始。这是一个可重入解析器的示例

我试着用bison的两个版本编译:2.5和2.6.5。前者可以完美地编译和执行,但后者在解析器头中包含类型
yyscan\t
,该类型在lexer头(lexer.h)中声明(我想这是可重入特性所必需的)。因此,它不会编译由
Parser.y
生成的
Parser.c

下面是由2.6.5在
Parser.h
中生成的额外部分,它在2.5中不存在:

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (SExpression **expression, yyscan_t scanner); // this line
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */
我已经标出了引起问题的那条线。有什么想法吗


编辑:我需要做的是确保bison生成的头文件中声明了
yyscan\t

实际上,bison 2.6在头部分插入了前面提到的代码块

您需要告诉bison在该块之前插入yyparse函数参数的所有声明,方法是将%code{…}(或%{…%})节的一部分的子节移动到带有标记“requires”的新代码节中,以便将其插入到yy文件的头的顶部:

%code requires {
typedef void*                 yyscan_t;
} 
参见野牛破碎手册:


希望这对你有所帮助,
yyscan\u t
来自于
Parser.y
中的声明
%lex param{yyscan\u t scanner}
,所以无论你使用的是哪一个版本的bison,只要它足够新,能够支持
%lex param
(2.5和2.6.5都应该是)您所引用的文本在Parser.c和bison 2.5中都有,效果很好。我并没有安装bison 2.6.5来检查那里发生了什么。@chrisdsodd是的,你是对的。我想问题在于它是在
Lexer.h
中声明的,而
Parser.h
不会自动包含它。交换
Lexer.h
Parser.h
的包含顺序不起作用;除了
yyscan\u t
之外,还产生未定义的宏错误。