Довольно необычная ошибка бизонов - PullRequest
3 голосов
/ 14 августа 2011

Я учил себя Бизону и отправился в Википедию за тем же и скопировал весь код из примера, который там был помещен [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?

Любая помощь приветствуется ...

1 Ответ

3 голосов
/ 14 августа 2011

В правиле expr TOKEN_PLUS expr $1 - первое выражение, $2 - TOKEN_PLUS, $3 - второе выражение.См. Руководство зубра .

Так что семантическое действие должно измениться с вашего { $$ = new Addition($1, $2); } на { $$ = new Addition($1, $3); }.

...