难怪我无法从我的flex文件链接到它。 我检查过这个并取出声明“YYSTYPE yylval;”从yyparse开始,它按预期工作。当然这不是使用野牛和弯曲的正确方法吗?有人能告诉我另一种方式吗? 谢谢。
答案 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会为你生成一个包含所有这些声明的头文件。