Bison Grammar:yylval嵌入在yyparse中

时间:2011-05-11 16:54:34

标签: c++ c parsing yacc

难怪我无法从我的flex文件链接到它。 我检查过这个并取出声明“YYSTYPE yylval;”从yyparse开始,它按预期工作。当然这不是使用野牛和弯曲的正确方法吗?有人能告诉我另一种方式吗? 谢谢。

3 个答案:

答案 0 :(得分:1)

在bison输出的y.tab.c文件中声明和定义yylval是正常的。它也在y.tab.h文件中声明(作为extern),因此如果将其包含在词法分析器中,则可以将yylval作为全局变量进行访问。这是flex / bison工作的常规方式,不需要编辑文件来取出东西 - 它应该“正常工作”

如果要在程序中使用多个解析器,或者想要在不同的线程中使用多个解析器(或以其他方式同时使用),则使用全局变量会导致问题。 Bison提供了一种方法来避免使用%define api.pure,它将yylval作为全局删除 - 而解析器将使用YYSTYPE(指针)的地址调用yylex,而词法分析器应该将令牌值放在那里在yylval。如果您正在使用flex,则需要在flex文件的顶部使用#define YY_DECL int yylex(YYSTYPE *val)来更改它用于yylex的声明。

答案 1 :(得分:1)

而不是使用

#define YY_DECL int yylex(YYSTYPE *val)

您也可以使用

%option bison-bridge

但是如果你想用C ++编写flex + bison解析器,那么这个方法不起作用。

对于C ++解析器,请检查this example out。

答案 2 :(得分:0)

  

我检查过这个并取出了   声明“YYSTYPE yylval;”

我想知道你的“被拿走”是否有问题,但你可以试试

bison -d your-yacc-file.y

然后bison会为你生成一个包含所有这些声明的头文件。