使用整型YYSTYPE使bison/flex解析器可重入

使用整型YYSTYPE使bison/flex解析器可重入,bison,flex-lexer,reentrancy,Bison,Flex Lexer,Reentrancy,我很难按照步骤使bison/flex解析器以最少的麻烦重入 问题似乎出在lexer中。因为所有解析器都是可重入的,所以我不能再直接分配yylval。相反,根据,我必须调用此函数: void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner ); 但问题是,YYSTYPE是一种积分类型。它不是一个动态分配的值,也不是一个左值,所以我不能向它传递指针!我是否遗漏了什么,如果没有,我应该如何设置yylvalue?我从来没有遇到过不可重入解析器的问题

我很难按照步骤使bison/flex解析器以最少的麻烦重入

问题似乎出在lexer中。因为所有解析器都是可重入的,所以我不能再直接分配yylval。相反,根据,我必须调用此函数:

void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner );
但问题是,YYSTYPE是一种积分类型。它不是一个动态分配的值,也不是一个左值,所以我不能向它传递指针!我是否遗漏了什么,如果没有,我应该如何设置yylvalue?我从来没有遇到过不可重入解析器的问题

更新: 好的,我想我可能已经解决了积分型问题。现在解析器似乎崩溃了,因为没有设置输入,我也没有找到任何关于如何告诉lexer从何处读取输入的文档

Flex文件:

%{
#define YYSTYPE Token // Token is a typedef to an integral type
// following two lines added per suggestion from Chris Dodd
#define YYPARSE_PARAM yyscan_t scanner
#define YYLEX_PARAM scanner

%}
%option reentrant
%option bison-bridge

// ...

{D}+{IS}?               {
    *yylval = Tokenint(strtol(yytext,0,10));
     return(CONSTANT); 
}
野牛档案:

%{
#define YYSTYPE Token
%define pure-parser
%lex-param {void * scanner}
%parse-param {void * scanner}
%token CONSTANT
// ...
在解析器中的这一行获取崩溃:

*yy_cp = yyg->yy_hold_char;
我怀疑我可能没有为解析正确初始化所有内容。手册在这个问题上非常混乱,经常引用类型或变量,而没有解释它们来自何处或使用它们的原因。我以这种方式调用解析:

void * scanner;
yylex_init(&scanner);
yyparse(scanner); // Note: was &scanner, this is wrong and will crash!
通过读取源代码,yylex_init正在分配一个
结构yyguts_t
并将其归零。当我到达崩溃点时,yy_cp是一个空指针,事实上整个
结构yyguts_t
仍然为零!所以我怀疑我没有正确初始化某些东西,这导致它不知道从哪里获取输入

最终编辑:
我将把这个问题标记为与我原来的问题的答案一样关闭,并将新问题作为新问题重新打开。

通常要创建可重入的解析器/扫描仪,您将在
.l
文件中使用
%选项bison bridge
,在
.y
文件中使用
%define api.pure
。这使得
yylval
成为
yylex
的参数,而不是全局变量。此外,您还需要:

%{
#define YYPARSE_PARAM yyscan_t scanner
#define YYLEX_PARAM scanner
%}
.y
文件的顶部,通过解析器将额外的
scanner
参数传递给lexer


现在,如果
YYSTYPE
int
(您在
.y
文件中没有
%union
YYSTYPE
声明),那么您只需说
*yylval=which,就可以在
.l
中设置令牌值

通常,要创建可重入的解析器/扫描仪,您将在
.l
文件中使用
%option bison bridge
,在
.y
文件中使用
%define api.pure
。这使得
yylval
成为
yylex
的参数,而不是全局变量。此外,您还需要:

%{
#define YYPARSE_PARAM yyscan_t scanner
#define YYLEX_PARAM scanner
%}
.y
文件的顶部,通过解析器将额外的
scanner
参数传递给lexer

现在,如果
YYSTYPE
int
(您在
.y
文件中没有
%union
YYSTYPE
声明),那么您只需说
*yylval=which,就可以在
.l
中设置令牌值

是的,输入错误--应该是
*yylval
是的,输入错误--应该是
*yylval