首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向yylex添加额外的参数(在bison/flex中)?

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

Stack Overflow用户
提问于 2016-09-26 01:09:06
回答 1查看 3K关注 0票数 4

我正在尝试使用flex和bison创建一个可重入的解析器。我想添加一个参数来保存一些状态,但我无法将其添加到yylex()中。

这是一个例子,它不需要编译,只是显示了生成的代码。

foo.l

代码语言:javascript
复制
%option reentrant
%option bison-bridge
%option header-file="foo.tab.h"
%{
#include "foo.tab.h"
%}
%%
"{" { return "{"; }
")" { return '}'; }
%%

foo.y

代码语言:javascript
复制
%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 : '(' | ')' ;
%%

运行时使用:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 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_paramyyscanner,则:

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39689564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档