使用Flex和Bison时,yylval未定义

10

我已经在网上搜索了几乎所有的资料,但是我仍然不明白为什么词法分析器无法识别yylval。

这里是情况: 我在node.h中定义了一堆ADT,并在node.c中实现它们,我的目的是在这些结构被正确存储后生成AST。但我卡在bison文件中了。

首先,我将%union改为union YYSTYPE {...};typedef union YYSTYPE YYSTYPE;,我不知道为什么要这样做,网上发布的一些其他文件似乎可以很好地使用%uinion

然后,我卡在了yylval的问题上。我已经执行了bison -d命令,并且在parser.c中检查了它(我已经指定了bison输出),所以我认为extern YYSTYPE yylval;应该可以工作。但事实并非如此。因此,我想知道是否有另一种方法来解决yylval未声明的问题。

我只使用了两种类型的YYSTYPE结构,即intchar *,我能否将联合YYSYTPE和AST结构分开?这意味着非终端将没有关联的类型。你们有其他想法吗?


我仍然不明白你所说的“将联合体YYSTYPE和AST结构分开”,而且我认为这并不必要。你在使用bison中的%union%type时遇到了问题吗? - neuront
@neuront 是的,我同意你的观点。我们不需要在bison中明确指定YYSTYPE。但问题是如果不这样做,我就无法通过它。换句话说,尽管%union%union YYSTYPE的作用相同,但在我的情况下,我必须选择后者。我不知道为什么?对于%union%type,我知道它们之间的关系。我只知道如何解决“YYSTYPE未定义”的错误。当我在网上搜索时,发现这是一个常见的问题。 - chenrui
3个回答

5
如果对其他人有帮助的话,我发现(OpenBSD lex v2.5.4 + yacc)包含以下内容:
extern YYSTYPE yylval;

我的词法分析器源代码不足以解决“yylval未定义”的问题,即使y.tab.c文件中包含了如下内容:

#ifndef YYSTYPE
typedef int YYSTYPE;
#endif

我通过在词法分析器源代码中添加一个显式定义来解决了这个问题:
#define YYSTYPE int
extern YYSTYPE yyltype

然而,我不清楚以这种方式定义是否会传播到yacc源文件的语言环境...

1

你应该使用%union。你不需要为联合类型定义typedef。

你可以使用bison -d命令获取一个带有任何声明(例如终结符、非终结符和标记的类型)的头文件。例如:

bison -d parser.y 会生成两个文件,parser.tab.c和parser.tab.h。你可以将后者包含到你的词法分析器文件中,这样它就会知道你的%token定义。该文件还包括yylval及其类型的定义。

你不应该分离联合类型,因为你很可能会扩展它,并需要用它来在词法分析器和语法分析器之间进行通信。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接