2010-02-14 80 views
2

我遇到問題。flex中的數據類型問題

我正在寫使用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日`expresion '沒有tiene TIPO declarado

../src/buggy.y:351.28-29:$ 1日`expresion' 沒有tiene TIPO declarad Ø

buggy.tab.c:在功能 'yyparse':

buggy.tab.c:1646:警告:函數 '函數yylex' 的隱式聲明

../src/buggy.y :在頂層:

lex.yy.c中:1577:警告: 'yyunput' 定義但未使用

lex.yy.c中:1618:**警告: '輸入' 定義但未使用

Leyend o fichero'../docs/prog1.bgy'。

什麼問題?

謝謝!

再見!

回答

5

這些都是實際的警告,沒有錯誤,那麼你的代碼應該,儘管他們的工作,但他們是討厭。要擺脫野牛警告,您需要在.y文件的頂部使用%type聲明。諸如%type <tipo> expression之類的東西,然後您只需在您的動作代碼中指定$1$3$$(沒有.tipo後綴,由於%type由bison自動提供)。

爲了擺脫buggy.tab.c編譯器警告,你需要在你.Y文件中聲明函數yylex;是這樣的:

%{ 
extern int yylex(); 
%} 

在頂部,假設你不#定義YYLEX_PARAM

擺脫編譯器警告從lex.yy.c中更難;你最好的選擇可能是在編譯時,它只是不使用-Wall,由彎曲產生的代碼後,一些搜索沒有-wall乾淨

編輯

,似乎可以擺脫的警告通過在您的.l文件的頂部添加一個#define YY_NO_INPUT來實現輸入。

+5

flex有特殊說明以避免未使用的定義: '%option noinput' '%option nounput' – jmster 2011-03-22 17:07:02