2

我有个问题。

我正在使用 flex 编写程序,并且正在使用以下代码:

%union {

    int entero;

    char *cadena;

    TipoDato tipo;

}

此代码适用于我的数据类型。

我想评估下一行: expresion SUM expresion 其中 SUM 是评估的运算总和,例如 69 + 60

当我写这个

if (($1.tipo == ENT) && ($3.tipo == ENT)){

           $$.tipo = ENT;

} else if (($1.tipo == CADEN) && ($3.tipo == CADEN)) {

     $$.tipo = CADEN;

     } else {

          printf ("Error en la suma: Tipos de datos incompatibles Revise los tipos\n");

          yyerror(parser);

}

我有下一个错误

../src/buggy.y:350.37-38: $1 de `expresion' no tiene Tipo declarado

../src/buggy.y:351.28-29: $1 de `expresion' no tiene tipo declarado

buggy.tab.c:在函数“yyparse”中:

buggy.tab.c:1646:警告:函数'yylex'的隐式声明</p>

../src/buggy.y:在顶层:

lex.yy.c:1577:警告:“yyunput”已定义但未使用

lex.yy.c:1618:**警告:“输入”已定义但未使用

Leyendo fichero '../docs/prog1.bgy'。

问题是什么?

谢谢!

再见!!

4

1 回答 1

5

这些实际上都是警告,而不是错误,所以尽管有它们,你的代码应该可以工作,但它们很烦人。要消除野牛警告,您需要%type在 .y 文件的顶部使用声明。之类的东西%type <tipo> expression,然后您只需在操作代码中引用and $1(没有后缀,由于 , 由 bison 自动提供)。$3$$.tipo%type

要摆脱 buggy.tab.c 中的编译器警告,您需要在 .y 文件中声明 yylex;就像是:

%{
extern int yylex();
%}

在顶部,假设您没有#define YYLEX_PARAM

摆脱来自 lex.yy.c 的编译器警告更难;您最好的选择可能是在编译时不要使用 -Wall,因为 flex 生成的代码不是 -Wall clean

编辑

经过一番搜索,您似乎可以通过将 a#define YY_NO_INPUT放在 .l 文件的顶部来消除有关输入的警告。

于 2010-02-21T05:41:20.433 回答