gpt4 book ai didi

bison - 如何向 yylex 添加其他参数(在 bison/flex 中)?

转载 作者:行者123 更新时间:2023-12-01 09:17:51 25 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

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

yylex() 函数的默认定义可以通过定义 YY_DECL 来改变。 foo.l 文件定义部分中的宏。为了只有int *pint作为参数,它看起来像这样:
#define YY_DECL int yylex(int *pint)
yylval_paramyyscanner还需要,那么:
#define YY_DECL int yylex(YYSTYPE * yylval_param, yyscan_t yyscanner, int *pint)

关于bison - 如何向 yylex 添加其他参数(在 bison/flex 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39689564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com