Я учил себя Бизону и отправился в Википедию за тем же и скопировал весь код из примера, который там был помещен [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
.].Все классы, т.е. Addition
, Expression
, Multiplication
определены и объявлены.Я не думаю, что это является причиной проблемы здесь, но просто говорю.
И почему именно это имеет проблему только с $2
.Даже $1
имеет тип expr
, тогда почему я не получаю никаких ошибок для $1
?
Любая помощь приветствуется ...