2009-06-18 13 views
40

「...には宣言された型を持っていない」:、このファイルにバイソンを実行

warning: $$ of 'exp' has no declared type.

それが何を意味する:

%{ 
    #include <iostream> 
    int yylex(); 
    void yyerror(const char*); 
%} 


%union 
{ 
    char name[100]; 
    int  val; 
} 

%token NUM ID 
%right '=' 
%left '+' '-' 
%left '*' 

%% 

exp : NUM  {$$.val = $1.val;} 
    | ID  {$$.val = vars[$1.name];} 
    | exp '+' exp {$$.val = $1.val + $3.val;} 
    | ID '=' exp {$$.val = vars[$1.name] = $3.val;} 
; 

%% 

は、のような警告にリードどのように解決するのですか?

+14

1あなたの将来バイソン/ Lexのフロントエンドに役立ちますと...:グーグル 'バイソンエラーが何 – INS

+0

ただ、A type'が宣言したとき、最初に表示されていないために小さな明瞭さ。私は '%union {int intValue; int floatValue; } 'しかし、' $$。intValue'や '$ 1.intValue'は使用できません。 'error:メンバー 'floatValue'が構造体または共用体でないものにリクエストしています。なぜそうなのか? – Shashwat

答えて

39

定義されている共用体(%union)は、直接使用するためのものではありません。むしろ、あなたは組合のどのメンバーがどの表現によって使われているかをBisonに伝える必要があります。

これは%type directiveで行われます。

コードの修正バージョンは次のとおりです。さらに思想として

%{ 
    #include <iostream> 
    int yylex(); 
    void yyerror(const char*); 
%} 


%union 
{ 
    char name[100]; 
    int  val; 
} 

%token NUM ID 
%right '=' 
%left '+' '-' 
%left '*' 

%type<val> exp NUM 
%type<name> ID 

%% 

exp : NUM  {$$ = $1;} 
    | ID  {$$ = vars[$1];} 
    | exp '+' exp {$$ = $1 + $3;} 
    | ID '=' exp {$$ = vars[$1] = $3;} 
; 

%% 
+1

小さな点: '%type exp NUM'という表記は、特定の縮小' exp NUM'が 'val'型を持つことを意味するものではありません。 'exp'はタイプ' VAL'を、 'NUM'は' val'タイプを意味します。例題のない型指示文の公式文書よりも、この投稿された回答、btwが便利です。 –

7

、あなたは(あなたがASTのannoationを行っている場合、これは便利です)あなたの削減とより明確になりたい場合は、その後のことができます。あなたのスタック値をポインタにしてから自分で型の値を扱います。

struct myScalar { 
    union { 
     int num; 
     char *id; 
     char *float_lexeme; 
    }payload; 

    enum { 
     TYPE_NUM, 
     TYPE_IDENTIFIER, 
     TYPE_FLOAT_CHAR 
    } type; 
    char *orig_lexeme; 
}; 

、スタックのtypedefとscalar_val *valを持っている:多く持つスカラー型などがあります。

より複雑なコンパイラフロントエンドに移動すると、ASTをこのように構築することができます。ツリーをトラバースしたときにメタデータがよりよくなり、セマンティック前処理の翻訳を追加することもできますタイプ。それから、IDのようなリーフプロダクションに慣れて、字句を右のスカラーペイロードにシャッフルします。

完全な説明ではありませんが、あなたはそのアイディアを得ています。

希望これは

グッドラック

+0

もう少し説明できますか? '%type'の仕組みを理解できませんでした。 – Jaseem

関連する問題