私はバイソンを教えていて、同じものをウィキペディアに向かい、そこに置かれていた例のコード全体をコピー貼り付けました[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
のエラーが発生しないのはなぜですか?
任意の助けを理解され...ルールで
ああ...なんて愚かな見落とし。それを指摘してくれて本当にありがとう:) –
私はそれによって自分自身で困惑してしまった:) – user786653