使用整型YYSTYPE使bison/flex解析器可重入
我很难按照步骤使bison/flex解析器以最少的麻烦重入 问题似乎出在lexer中。因为所有解析器都是可重入的,所以我不能再直接分配yylval。相反,根据,我必须调用此函数:使用整型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?我从来没有遇到过不可重入解析器的问题
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