制作野牛/柔性解析器折返与整体YYSTYPE(Making bison/flex parser re

2019-07-31 16:11发布

我在下面的步骤,使我的野牛/柔性解析器折返用大惊小怪的最低金额麻烦。

这个问题似乎是在词法分析器。 由于一切解析器重入的,我不能再直接分配的yylval。 相反,根据Flex的手册 ,我不得不调用此函数:

void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner );

但问题是,YYSTYPE是整型。 这是不是一个动态分配的值,它不是一个左值可言,所以我不能一个指针传递给它! 我失去了一些东西,如果没有,我怎么设置yylvalue? 我从来没有过这样的问题,与非重入解析器!

更新:好吧,我想我可能过得了整体式的问题。 现在解析器出现崩溃,因为没有输入设置,而我没有找到如何告诉词法分析器从哪里读取输入的任何文件。

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被分配struct yyguts_t和归零出来。 当我到达出事,yy_cp是一个空指针,其实整个struct yyguts_t仍然是零,编出来的! 所以我怀疑我不是正确初始化的东西 ,那就是导致它不知道从哪里获取输入。

最后编辑:我要去的封闭,我原来的问题得到回答,以纪念这个问题,并重新打开新的问题,因为一个新的问题。

Answer 1:

通常情况下,使折返解析器/扫描仪,你会用%option bison-bridge.l文件并%define api.pure.y文件。 这使yylval一个参数传递给yylex而不是全局变量。 此外,你需要有:

%{
#define YYPARSE_PARAM yyscan_t scanner
#define YYLEX_PARAM scanner
%}

在你的上面.y文件通过额外的scanner通过你的解析器参数的词法分析器。

现在,如果YYSTYPEint (你有没有%union或声明YYSTYPE.y文件),然后你会设置你的令牌值.l通过只是说*yylval = whatever;



文章来源: Making bison/flex parser reentrant with integral YYSTYPE