2011-08-14 22 views
3

私はバイソンを教えていて、同じものをウィキペディアに向かい、そこに置かれていた例のコード全体をコピー貼り付けました[http://en.wikipedia.org/wiki/GNU_Bison]。それはコンパイルされ、完璧に動作します。その後、私は少しのC++で追加することでそれをOOPしました。ここに私の新しいParser.yファイルされます:ちょっと変わったバイソンのエラー

%{ 

#include "TypeParser.h" 
#include "ParserParam.h" 
#include "addition.h" 

%} 

%define api.pure 

%left '+' TOKEN_PLUS 
%left '*' TOKEN_MULTIPLY 
%left '-' TOKEN_SUBTRACT 
%left '/' TOKEN_DIVIDE 
%left '^' TOKEN_EXP 

%token TOKEN_LPAREN 
%token TOKEN_RPAREN 
%token TOKEN_PLUS 
%token TOKEN_MULTIPLY 

%token <value> TOKEN_NUMBER 

%type <expression> expr 

%% 

input: 
     expr { ((SParserParam*)data)->expression = $1; } 
     ; 

expr: 
     expr TOKEN_PLUS expr { $$ = new Addition($1, $2); } 
    | expr TOKEN_MULTIPLY expr { $$ = new Multiplication($1, $2); } 
    | expr TOKEN_SUBTRACT expr { $$ = new Addition($1, $2); } 
    | expr TOKEN_DIVIDE expr { $$ = new Multiplication($1, $2); } 
    | expr TOKEN_EXP expr { $$ = new Addition($1, $2); } 
    | TOKEN_LPAREN expr TOKEN_RPAREN { $$ = $2; } 
    | TOKEN_NUMBER { $$ = new Value($1); } 
; 

%% 

しかし、私は、次のエラーを得続ける:

Parser.y:33.52-53: $2 of `expr' has no declared type 
Parser.y:34.62-63: $2 of `expr' has no declared type 
Parser.y:35.56-57: $2 of `expr' has no declared type 
Parser.y:36.60-61: $2 of `expr' has no declared type 
Parser.y:37.52-53: $2 of `expr' has no declared type 

どのように私はそれを解決するのですか?私は何を変えたのですか?私はウィキペディアのコードから何も変更していませんが、%type%宣言はまだあります[このユニオンには、同じタイプのメンバーがあり、タイプはSExpressionからExpressionに変更されています。すべてのクラス、すなわちAdditionExpressionMultiplicationが定義され宣言されています。私はそれがここで問題を引き起こしているとは思わないが、ただ言っている。

なぜ、正確には$2で問題が発生しますか? $1でもexprと入力した場合、$1のエラーが発生しないのはなぜですか?

任意の助けを理解され...ルールで

答えて

3

expr TOKEN_PLUS expr$1$2TOKEN_PLUSであり、$3が第二の発現であり、最初の式です。バイソンmanualを参照してください。

したがって、セマンティックアクションを{ $$ = new Addition($1, $2); }から{ $$ = new Addition($1, $3); }に変更する必要があります。

+0

ああ...なんて愚かな見落とし。それを指摘してくれて本当にありがとう:) –

+0

私はそれによって自分自身で困惑してしまった:) – user786653

関連する問題