나는 들소를 가르치고 있었고 같은 것을 위해 위키피디아로 향했다. 거기에 놓인 예에서 전체 코드를 복사했다. [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
에만 문제가 있습니다. $1
도 expr
인 경우 $1
에 대한 오류가 발생하지 않는 이유는 무엇입니까? 규칙 expr TOKEN_PLUS expr
$1
에서
어떤 도움이 이해된다 ..
오 ... 어리석은 감시. 그것을 지적 해 주셔서 대단히 감사합니다 :) –
나는 그것에 의해 난처하게되었습니다. :) – user786653