开发者

Problems with data types in flex

开发者 https://www.devze.com 2022-12-20 07:12 出处:网络
I have a problem. I\'m writing a program with flex and I\'m using this code: %union { int entero; char *cadena;

I have a problem.

I'm writing a program with flex and I'm using this code:

%union {

    int entero;

    char *cadena;

    TipoDato tipo;

}

This code is for my data types.

I want evaluate the next line: expresion SUM expresion where SUM is the operation sum for evaluate, for example 69 + 60

When I write this

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);

}

I have 开发者_如何学JAVAthe next error

../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: In function ‘yyparse’:

buggy.tab.c:1646: warning: implicit declaration of function ‘yylex’

../src/buggy.y: At top level:

lex.yy.c:1577: warning: ‘yyunput’ defined but not used

lex.yy.c:1618: **warning: ‘input’ defined but not used

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

What is the problem?

Thanks!

Bye!!


These are all actually warnings, not errors, so your code should work despite them, but they are annoying. To get rid of the bison warnings, you need to use a %type declaration in the top section of your .y file. Somethings like %type <tipo> expression, and then you just refer to $1 and $3 and $$ in your action code (no .tipo suffix, which is automatically supplied by bison due to the %type).

To get rid of the compiler warning in buggy.tab.c, you need to declare yylex in your .y file; something like:

%{
extern int yylex();
%}

in the top section, assuming you don't #define YYLEX_PARAM

Getting rid of the compiler warnings from lex.yy.c is harder; your best bet is probably just to NOT use -Wall when compiling it, as the code generated by flex is not -Wall clean

edit

after some searching, it seems you can get rid of the warning about input by putting a #define YY_NO_INPUT in the top section of your .l file.

0

精彩评论

暂无评论...
验证码 换一张
取 消