2

私は問題があります。

私は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 `expression' no tiene tipo declarado

../src/buggy.y:351.28-29: $1 de `expression' no tiene tipo declarado

buggy.tab.c: 関数 'yyparse' 内:

buggy.tab.c:1646: 警告: 関数 'yylex' の暗黙の宣言</p>

../src/buggy.y: トップレベル:

lex.yy.c:1577: 警告: 'yyynput' が定義されていますが、使用されていません

lex.yy.c:1618: **警告: 'input' が定義されていますが、使用されていません

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

何が問題ですか?

ありがとう!

さよなら!!

4

1 に答える 1

5

これらはすべて実際には警告であり、エラーではないため、コードはそれらに関係なく動作するはずですが、煩わしいものです。バイソンの警告を取り除くには%type、.y ファイルの先頭セクションで宣言を使用する必要があります。のようなもので、アクション コードでandと%type <tipo> expressionを参照するだけです (接尾辞はありません。これは、 により bison によって自動的に提供されます)。$1$3$$.tipo%type

buggy.tab.c のコンパイラ警告を取り除くには、.y ファイルで yylex を宣言する必要があります。何かのようなもの:

%{
extern int yylex();
%}

#define YYLEX_PARAM を使用しないと仮定すると、上部のセクションで

lex.yy.c からコンパイラの警告を取り除くのはより困難です。flex によって生成されたコードは -Wall clean ではないため、コンパイル時に -Wall を使用しないことをお勧めします。

編集

#define YY_NO_INPUTいくつか検索した後、.l ファイルの先頭セクションに a を追加することで、入力に関する警告を取り除くことができるようです。

于 2010-02-21T05:41:20.433 に答える