我几乎在网上搜索了所有材料。但是我仍然感到困惑,为什么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
结构,即int
和char *
,我可以为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源文件的语言环境...