野牛语法:yylval嵌入在yyparse中

Bison Grammar: yylval is embedded in yyparse

本文关键字:yyparse yylval 语法      更新时间:2023-10-16

难怪我无法从我的flex文件链接到它。我已经检查了这一点,并从 yyparse 的开头取出了声明"YYSTYPE yylval;",它按预期工作。当然,这不是使用野牛和弹性的正确方法吗?有人可以给我指另一条路吗?谢谢。

yylval 在 bison 输出的 y.tab.c 文件中声明和定义是正常的。 它也在 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 的声明。

而不是使用

#define YY_DECL int yylex(YYSTYPE *val)

您也可以使用

%option bison-bridge

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

对于C++解析器,请查看此示例。

我已经检查过并取出了 声明 "YYSTYPE yylval;"

我想知道你的"取出"是否有问题,但你可以试试

bison -d your-yacc-file.y

然后Bison将为您生成一个包含所有这些声明的头文件。