我正在尝试开发一个基本编译器,并且使用 yylval
的 union ,如下所示:
%{
#include <string.h>
#include <stdio.h>
struct info {
int line;
/* details unimportant */
};
%}
%union{
char *str;
struct info *ptr;
}
在我的词法分析器定义中,我有
%{
#include "parse.tab.h"
%}
但是当我编译生成的词法分析器时,出现以下错误:
y.tab.h: unknown type name 'YYSTYPE'.
error: request for a member str in something not a structure or a union.
我还需要#define YYSTYPE
吗?
(我编辑了原始问题,从源文件中插入足够的信息,使问题可以回答。转录中的任何错误都是我的错,我深表歉意 - Rici。)
最佳答案
没有。如果您使用%union
声明,则不得#define YYSTYPE
;野牛手册清楚地说明了这一点。
但是,任何必要的声明(在本例中为 struct info 的声明)也必须包含在您的词法分析器描述文件 (parse.l
) 中。两个生成的文件彼此独立,因此在解析器中声明 struct info 的事实并不会使该定义自动可供词法分析器使用em>.
为了避免重复声明,通常最好将它们放在单独的头文件中:
文件:info.h(已添加)
#ifndef INFO_H_HEADER_
#define INFO_H_HEADER_
struct info {
int line;
/* details unimportant */
};
// ...
#endif
文件:parse.y(现在是#include的info.h而不是内联结构声明)
%{
#include <stdio.h>
#include <string.h>
#include "info.h"
%}
%union{
char *str;
struct info *ptr;
}
文件:parse.l(也#includes info.h)
%{
#include <stdio.h>
#include <string.h>
/* This must come *before* including parse.tab.h */
#include "info.h"
#include "parse.tab.h"
%}
关于c - 在 yacc 文件中使用 union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373248/