计算器示例中的Bison错误

计算器示例中的Bison错误,bison,yacc,Bison,Yacc,我正在通过标准计算器示例学习bison,我试图在已经编写的计算器中添加一些新功能。我正在尝试向我的计算中添加一个功能,其中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 %to

我正在通过标准计算器示例学习bison,我试图在已经编写的计算器中添加一些新功能。我正在尝试向我的计算中添加一个功能,其中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; }
表示:'expression'的$1没有声明的类型

我做错了什么

谢谢。

将$1的值转换为(int)通常不是这样做的。您需要声明“表达式”具有特定类型,因此bison知道需要分配联合的哪一部分。试试看:

%type <dval> expression
%类型表达式

要从规则中访问某个符号的值,该符号需要有一个类型,并且需要正确设置其值。那么规则呢

expression: CHAR { $$ = $1; }
要工作,
CHAR
需要定义一个类型,例如:

%token<dval> CHAR
%token字符
当lexer返回
CHAR
标记时,它需要在
yylval.dval
中提供值。现在取决于您希望输入
a+1=b
实际执行的操作(假设lexer为
a
b
返回
CHAR
,而不是
SYMBOL
),这可能是您想要的,也可能不是