加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 01:44:24 所属栏目:百科 来源:网络整理
导读:我正在尝试使用flex和bison创建一个可重入的解析器. 我想添加一个参数来保存一些状态,但我没有将它添加到yylex(). 下面是示例,它不会被编译,只显示生成的代码. 傻子 %option reentrant%option bison-bridge%option header-file="foo.tab.h"%{#include "foo.t
我正在尝试使用flex和bison创建一个可重入的解析器.
我想添加一个参数来保存一些状态,但我没有将它添加到yylex().

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

傻子

%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){…}所以品脱了.但我想我已经在foo.y指定了它.那么我需要做些什么让yylex接受品脱?

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

解决方法

%lex-param说野牛用额外的参数调用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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读