Ошибка бизона в примере калькулятора - PullRequest
1 голос
/ 11 августа 2011

Я изучаю бизона на примере стандартного калькулятора, где я пытаюсь добавить некоторые новые функции к уже написанному калькулятору. Я пытаюсь добавить функцию в свой калькулятор, где будет работать a + 1 = b.

в моем .y файле я должен объявить символы терминала:

%token <symbol> SYMBOL_NAME
%token <dval> NUMBER
%token LIST_VAR_COMMAND
%token LIST_CONST_COMMAND
%token LIST_FUNC_COMMAND
%token DELETE_COMMAND
%token QUIT_COMMAND
%token CLEAR_COMMAND
%token BINARY
%token OCTAL
%token DECIMAL
%token HEXADECIMAL
%token UNSIGNED
%token CHAR
%token SHORT
%token INT
%token LONG
%token FOR

Я заявляю, что мое заявление выглядит так:

statement:      ';'
|       expression             { setp($1); print_universal_base($1, 0); }
|       expression BINARY      { setp($1); print_universal_base($1, 2); }
|       expression OCTAL       { setp($1); print_universal_base($1, 8); }
|       expression DECIMAL     { setp($1); print_universal_base($1, 10); }
|       expression HEXADECIMAL { setp($1); print_universal_base($1, 16); }

Я заявляю, что мое выражение выглядит так:

expression:     expression ',' expression { $$ = $3; }
|       NUMBER { $$ = $1; }
|       CHAR { $$ =(int)$1; }

Я получаю сообщение об ошибке в строке

|       CHAR { $$ =(int)$1; }

говоря: $ 1 выражения не имеет объявленного типа

что я тут не так делаю?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Преобразование значения $ 1 в (int) обычно не так, как вы это делаете. Вам нужно объявить, что выражение имеет определенный тип, поэтому bison знает, какую часть объединения ему нужно назначить. Просто попробуйте:

%type <dval> expression
1 голос
/ 13 августа 2011

Чтобы получить доступ к значению некоторого символа из правила, этот символ должен иметь тип, и его значение должно быть правильно установлено.Таким образом, чтобы правило

expression: CHAR { $$ = $1; }

работало, CHAR должен иметь определенный тип, например:

%token<dval> CHAR

, а лексеру необходимо предоставить значение в yylval.dvalкогда он возвращает токен CHAR.Теперь, в зависимости от того, что вы хотите, чтобы ввод a+1=b действительно делал (и предполагая, что лексер возвращает CHAR для a и b, а не SYMBOL), это может или не может быть тем, что вы хотите.*

...