我正在通过标准计算器示例学习野牛,我正在尝试为已经编写的计算器添加一些新功能。我正在尝试向我的计算中添加一个功能,其中+ 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没有声明的类型
我在这里做错了什么?
感谢。
答案 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
实际执行的操作,(并假设词法分析器返回CHAR
和a
而不是b
SYMBOL
},这可能或者可能不是你想要的。