Проблемы с типами данных во flex

У меня проблема.

Я пишу программу с flex и использую этот код:

%union {

    int entero;

    char *cadena;

    TipoDato tipo;

}

Этот код для моих типов данных.

Я хочу оценить следующую строку: выражение SUM выражение, где 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 для `выражения' не указывается типом объявления

../src/buggy.y:351.28-29: $1 для `выражения' не указывается типом объявления

buggy.tab.c: В функции ‘yyparse’:

buggy.tab.c:1646: предупреждение: неявное объявление функции ‘yylex’

../src/buggy.y: На верхнем уровне:

lex.yy.c:1577: предупреждение: ‘yyunput’ определен, но не используется

lex.yy.c:1618: **предупреждение: «ввод» определен, но не используется

Найдите файл '../docs/prog1.bgy'.

В чем проблема?

Спасибо!

Пока!!


person Alberto    schedule 14.02.2010    source источник


Ответы (1)


На самом деле все это предупреждения, а не ошибки, поэтому ваш код должен работать, несмотря на них, но они раздражают. Чтобы избавиться от предупреждений bison, вам нужно использовать объявление %type в верхней части вашего файла .y. Что-то вроде %type <tipo> expression, а затем вы просто ссылаетесь на $1, $3 и $$ в своем коде действия (без суффикса .tipo, который автоматически предоставляется bison из-за %type).

Чтобы избавиться от предупреждения компилятора в buggy.tab.c, вам нужно объявить yylex в вашем файле .y; что-то вроде:

%{
extern int yylex();
%}

в верхней части, если вы не #define YYLEX_PARAM

Избавиться от предупреждений компилятора из lex.yy.c сложнее; ваш лучший выбор, вероятно, просто НЕ использовать -Wall при его компиляции, так как код, сгенерированный flex, не является -Wall чистым

изменить

после некоторого поиска кажется, что вы можете избавиться от предупреждения о вводе, поместив #define YY_NO_INPUT в верхнюю часть вашего .l-файла.

person Chris Dodd    schedule 21.02.2010
comment
flex имеет специальные инструкции, чтобы избежать неиспользуемых определений: %option noinput %option nounput - person jmster; 22.03.2011