我正在尝试使用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接受pint呢?
环境: Gentoo Linux稳定,Bison-3.0.4和Flex 2.5.39
发布于 2016-09-28 02:51:50
%lex-param说让bison使用额外的参数调用yylex,但没有说任何关于flex的内容。
可以通过在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)
https://stackoverflow.com/questions/39689564
复制相似问题