如何为yylex添加额外的参数(在bison / flex中)?

时间:2016-09-25 17:09:06

标签: bison flex-lexer

我正在尝试使用flex和bison创建一个可重入的解析器。 我想添加一个参数来保存一些状态,但是我没有把它添加到yylex()

以下是示例,它不会被编译,只显示生成的代码。

foo.l

%option reentrant
%option bison-bridge
%option header-file="foo.tab.h"
%{
#include "foo.tab.h"
%}
%%
"{" { return "{"; }
")" { return '}'; }
%%

foo.y

%define api.pure full
%define parse.error verbose
%parse-param {void *scanner}
%parse-param {int *pint}
%lex-param {void *scanner}
%lex-param {int *pint}
%token '(' ')'
%%
foo : '(' | ')' ;
%%

运行:

bison -d -b foo foo.y
flex foo.l
gcc -E lex.yy.c | less

我们可以看到int yylex (YYSTYPE * yylval_param , yyscan_t yyscanner) {...}所以pint已经消失。但我想我已在foo.y指定了它。那么我需要做些什么来让yylex接受品脱?

环境:Gentoo Linux稳定使用Bison-3.0.4和Flex 2.5.39

1 个答案:

答案 0 :(得分:7)

%lex-param说bison用额外的参数调用yylex,但没有说任何东西要弯曲。

可以通过在foo.l文件的定义部分中定义YY_DECL宏来更改yylex()函数的默认定义。为了只有int *pint作为参数,它看起来像这样:

#define YY_DECL int yylex(int *pint)

如果还需要yylval_paramyyscanner,则:

#define YY_DECL int yylex(YYSTYPE * yylval_param, yyscan_t yyscanner, int *pint)