【问题标题】:bison/lex YYSTYPE declaration as structbison/lex YYSTYPE 声明为结构
【发布时间】:2012-05-23 15:43:51
【问题描述】:

我已经尝试了一段时间,通过使用 bison 和 lex 来实现语法解析器。

我对 yylval 的类型重新声明有问题,我自己解释一下。

我有 4 个文件:lexico.l、parser.y、funcionesTabla.c、funcionesTabla.h

第一个,包含 lex 的规范 二、bison/yacc的规范 最后两个,是一堆处理符号表的方法。

我在funcionesTabla.h:

typedef enum {
entero,
real,
caracter,
arrayEntero,
arrayReal,
arrayCaracter,
matrizEntero,
matrizReal,
matrizCaracter,
desconocido,
no_asignado
} dtipo ;

typedef struct{
int    atrib ;
char  *lexema ;
dtipo  tipo ;
} atributos;

#define YYSTYPE atributos

我尝试了下一个:

从parser.y,在一个规则内,尝试访问yylval.tipo,没问题。

从 lexico.l,在令牌规则内,尝试访问 yylval.lexema(或任何属性),gcc 告诉我:

 lexico.l: In function ‘yylex’:
 lexico.l:93: error: request for member ‘lexema’ in something not a structure or union
 make: *** [lex.yy.o] Error 1

有什么建议吗?

提前非常感谢,对不起我的英语。

【问题讨论】:

    标签: bison yacc lex


    【解决方案1】:

    David 是对的,默认情况下 yacc 会为您提供 %union 指令,但看到它被转换为纯 C,您可以将结构嵌套在其中:

    %union {
        struct {
            int atrib;
            char *lexema;
            dtipo tipo;
        };
    }
    

    在支持联合内部匿名结构(例如 C99)的 C 方言中,这将像您期望的那样简单地工作。

    【讨论】:

      【解决方案2】:

      我不完全了解您是如何使用结构 atributos,但我会猜测一下。

      查看您生成的y.tab.h 文件:我想您会看到为yylval 生成的代码与您想要使用它的方式不兼容。

      通常,我看到YYSTYPE 被定义为联合,而不是结构。查看 bison 的 %union 指令的文档以定义语义值的数据类型。我想你想要这样的东西:

      %union {
          int    atrib;
          char  *lexema;
          dtipo  tipo;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 2018-04-03
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多