我几乎在网上搜索了所有材料。但是我仍然感到困惑,为什么lexer无法识别yylval。

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

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

然后,我被yylval困扰。我已经完成了bison -d的工作,并且已经在parser.c中对其进行了检查(我已经指定了野牛输出),所以我认为extern YYSTYPE yylval;应该可以工作。但事实并非如此。因此,我想知道是否存在另一种解决yylval未声明问题的方法。

我只使用两种类型的YYSTYPE结构,即intchar *,我可以为AST分离联合YYSYTPE和struct吗?这意味着,非终结符将没有关联的类型。你们还有其他想法吗?

最佳答案

万一这对其他人有帮助,我发现(OpenBSD lex v2.5.4 + yacc)包括

extern YYSTYPE yylval;


即使y.tab.c文件包含以下内容,我的lex源中的代码也不足以防止出现“ yylval undefined”问题:

#ifndef YYSTYPE
typedef int YYSTYPE;
#endif


我通过在lex源中放置一个显式定义来解决此问题:

#define YYSTYPE int
extern YYSTYPE yyltype


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

08-17 03:15