c - 在 yacc 文件中使用 union

标签 c yacc unions

我正在尝试开发一个基本编译器,并且使用 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/

相关文章:

variables - Flex/Lex - 如何知道变量是否已声明

c++ - 大端和小端的概念

c - 什么是轻量级跨平台WAV播放库?

c++ - 三重检查锁定?

c - 为什么我在这里遇到段错误?

c - 如何释放 C 中的 union 数组?

c - c中的结构和标记 union

c++ - 为什么 Visual Studio 不将无符号值显示为 int?

c - 转移/减少 yacc 中的冲突

c - Flex Bison 不读取完整输入