难怪我无法从我的flex文件链接到它。
我检查了一下,并取出了声明“YYSTYPE yylval;”。从yyparse的开始就可以了。当然这不是使用bison和flex的正确方法吗?有人可以告诉我另一种方式吗?
谢谢。
最佳答案
通常,由bison在y.tab.c文件中声明和定义yylval。它也在y.tab.h文件中声明(作为extern),因此,如果将其包含在词法分析器中,则可以将yylval作为全局变量访问。这是flex / bison正常工作的方式,不需要编辑文件就可以取出东西-它应该“正常工作”
如果您要在一个程序中拥有多个解析器,或者想在不同线程中使用多个解析器(或同时使用多个解析器),则对全局变量的这种使用会引起问题。 Bison通过%define api.pure
提供了一种避免这种情况的方法,它摆脱了yylval的全局限制-相反,解析器将使用YYSTYPE(指针)的地址调用yylex,并且词法分析器应将 token 值放在那里而不是yylval中。如果您使用的是flex,则需要flex文件顶部的#define YY_DECL int yylex(YYSTYPE *val)
更改它用于yylex的声明。
关于c++ - 野牛语法:yylval嵌入在yyparse中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5967873/