flex中数据类型的问题

Alb*_*rto 2 types yacc lex

我有个问题.

我正在编写一个flex程序,我正在使用这段代码:

%union {

    int entero;

    char *cadena;

    TipoDato tipo;

}
Run Code Online (Sandbox Code Playgroud)

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

我想评估下一行:expresion SUM expresion其中SUM是evaluate的运算和,例如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);

}
Run Code Online (Sandbox Code Playgroud)

我有下一个错误

../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:**警告:'input'已定义但未使用

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

问题是什么?

谢谢!

再见!

Chr*_*odd 5

这些都是警告,而不是错误,所以你的代码应该可以工作,但它们很烦人.要摆脱野牛警告,您需要%type在.y文件的顶部使用声明.出头像%type <tipo> expression,然后你只是参考$1,并$3$$你的动作代码(没有.tipo后缀,这是自动野牛由于所提供的%type).

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

%{
extern int yylex();
%}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

经过一些搜索,似乎你可以通过#define YY_NO_INPUT在.l文件的顶部放置一个关于输入的警告.

  • flex有一些特殊的指令可以避免使用未使用的定义:`%option noinput``%option nounput` (7认同)