3

私はしばらくの間、bisonとlexを使用して文法のパーサーを実装しようとしてきました。

yylvalの型の再宣言に問題があります。私は自分自身を説明します。

私は4つのファイルを持っています:lexico.l、parser.y、funcionesTabla.c、funcionesTabla.h

1つ目はlexの仕様を含み、2つ目はbison / yaccの仕様を含みます。最後の2つは、シンボルテーブルを処理するための一連のメソッドです。

私はfuncionesTabla.hにあります:

typedef enum {
entero,
real,
caracter,
arrayEntero,
arrayReal,
arrayCaracter,
matrizEntero,
matrizReal,
matrizCaracter,
desconocido,
no_asignado
} dtipo ;

typedef struct{
int    atrib ;
char  *lexema ;
dtipo  tipo ;
} atributos;

#define YYSTYPE atributos

私は次を試しました:

parser.yから、ルール内でyylval.tipoにアクセスしようとしましたが、問題ありません。

lexico.lから、トークンルール内で、yylval.lexema(またはいずれかの属性)にアクセスしようとしましたが、gccは次のように言っています。

 lexico.l: In function ‘yylex’:
 lexico.l:93: error: request for member ‘lexema’ in something not a structure or union
 make: *** [lex.yy.o] Error 1

なにか提案を?

よろしくお願いします。英語でごめんなさい。

4

2 に答える 2

1

Davidは正しいです。デフォルトでは、yaccが%unionディレクティブを提供しますが、これがプレーンCに変換されるのを見ると、構造体をそこにネストすることができます。

%union {
    struct {
        int atrib;
        char *lexema;
        dtipo tipo;
    };
}

これは、ユニオン内の匿名構造体(C99など)をサポートするC方言で期待どおりに機能します。

于 2012-10-19T06:19:03.777 に答える
-1

構造体をどのように使用しているかは完全にはわかりませんがatributos、推測します。

生成されたファイルを見てください。生成されたコードは、使用したい方法と互換性がないy.tab.hことがわかると思います。yylval

通常、私はYYSTYPE構造体ではなく、結合として定義されていると思います。%unionセマンティック値のデータ型を定義するためのbisonのディレクティブのドキュメントを参照してください。私はあなたがこのようなものが欲しいと思います:

%union {
    int    atrib;
    char  *lexema;
    dtipo  tipo;
}
于 2012-05-24T02:00:43.413 に答える