flex中数据类型的问题

时间:2010-02-14 12:26:29

标签: types yacc lex

我有一个问题。

我正在编写一个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'

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

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

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

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

有什么问题?

谢谢!

再见!!

1 个答案:

答案 0 :(得分:5)

这些都是实际的警告,而不是错误,所以你的代码应该可以正常工作,但它们很烦人。要摆脱野牛警告,您需要在.y文件的顶部使用%type声明。像%type <tipo> expression这样的事情,然后您只需在动作代码中引用$1$3以及$$(无.tipo后缀,后者由bison自动提供由于%type)。

要删除buggy.tab.c中的编译器警告,您需要在.y文件中声明yylex;类似的东西:

%{
extern int yylex();
%}

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

从lex.yy.c中删除编译器警告更难;你最好的选择可能只是在编译时不使用-Wall,因为flex生成的代码不是-Wall clean

修改

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