计算器示例中的Bison Error

时间:2011-08-11 18:46:19

标签: bison yacc

我正在通过标准计算器示例学习野牛,我正在尝试为已经编写的计算器添加一些新功能。我正在尝试向我的计算中添加一个功能,其中+ 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; }

说:`expression'的$ 1没有声明的类型

我在这里做错了什么?

感谢。

2 个答案:

答案 0 :(得分:2)

将值$ 1转换为(int)通常不是这样做的。你需要声明'expression'具有某种类型,因此bison知道它需要分配的union的哪个部分。试试吧:

%type <dval> expression

答案 1 :(得分:1)

要从规则中访问某些符号的值,该符号需要具有类型,并且需要正确设置其值。所以对于规则

expression: CHAR { $$ = $1; }

要工作,CHAR需要有一个已定义的类型,例如:

%token<dval> CHAR

并且词法分析器在返回yylval.dval标记时需要在CHAR中提供值。现在,根据您希望输入a+1=b实际执行的操作,(并假设词法分析器返回CHARa而不是b SYMBOL},这可能或者可能不是你想要的。