2011-08-14 34 views
3

我在教自己的野牛,並向維基百科上傳相同的內容,並複製粘貼來自示例的代碼[http://en.wikipedia.org/wiki/GNU_Bison]。它編譯和工作完美。然後,我通過添加一點C++來添加它。這裏的是我的新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。]。所有類別,即AdditionExpression,Multiplication都被定義和聲明。我不認爲這是造成這個問題的原因,但只是說。

爲什麼它只有在$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