计算器示例中的Bison错误
我正在通过标准计算器示例学习bison,我试图在已经编写的计算器中添加一些新功能。我正在尝试向我的计算中添加一个功能,其中a+1=b可以工作 在.y文件中,我必须声明端子符号:计算器示例中的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
%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
),这可能是您想要的,也可能不是