我正在尝试使用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
答案 0 :(得分:7)
%lex-param
说bison用额外的参数调用yylex,但没有说任何东西要弯曲。
可以通过在foo.l文件的定义部分中定义YY_DECL
宏来更改yylex()函数的默认定义。为了只有int *pint
作为参数,它看起来像这样:
#define YY_DECL int yylex(int *pint)
如果还需要yylval_param
和yyscanner
,则:
#define YY_DECL int yylex(YYSTYPE * yylval_param, yyscan_t yyscanner, int *pint)