2011-08-14 5 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으로 바뀐 같은 멤버가있다.]. 모든 클래스, 즉 Addition, Expression, Multiplication이 정의되고 선언됩니다. 나는 이것이 그 문제를 일으키는 원인이 아니라고 말하고 있습니다.

그리고 정확히 정확히 $2에만 문제가 있습니다. $1expr 인 경우 $1에 대한 오류가 발생하지 않는 이유는 무엇입니까? 규칙 expr TOKEN_PLUS expr$1에서

어떤 도움이 이해된다 ..

답변

3

$2TOKEN_PLUS이며 $3 번째 표현, 제 표현이다. 들소 manual을 참조하십시오.

따라서 의미 작업을 { $$ = new Addition($1, $2); }에서 { $$ = new Addition($1, $3); }으로 변경해야합니다.

+0

오 ... 어리석은 감시. 그것을 지적 해 주셔서 대단히 감사합니다 :) –

+0

나는 그것에 의해 난처하게되었습니다. :) – user786653