我有一个带有一些简单语法的简单Bison文件。我正在获取一个无休止的表达式列表,我的目标是为表达式创建一个统一的定义,将两个标记的值相加。
在第20行,有一个语法规则可以显示我要实现的目标。不幸的是,它不起作用。如何实现此功能?
%{
#include <stdio.h>
#include <stdlib.h>
int yylex();
void yyerror(const char* msg);
%}
%token INT
%token PLUS
%token END
%%
expr_list: END
{ exit(0); }
| expr
| expr expr_list
;
expr: INT PLUS INT
{ printf("%d\n", ($1 + $3)); }
;
%%
int main(int argc, char** argv) {
yyparse();
return 0;
}
void yyerror(const char* msg) {
fprintf(stderr, "ERROR! %s\n", msg);
}
%{
#include "adder.tab.h"
%}
%%
(\+) return PLUS;
[0-9]+ return INT;
(END) return END;
%%
答案 0 :(得分:1)
在解析器中,您有以下内容:
expr: INT PLUS INT
{ printf("%d\n", ($1 + $3)); }
这采用了两个INT
标记的语义值并将它们相加,这很好。如果始终产生0,则表示令牌的语义值一定存在问题。因此,让我们看一下相应的词法分析器操作:
[0-9]+ return INT;
在这里,您永远不会为yylval
分配任何内容,因此解析器规则中的$1
和$3
将不会被分配。要分配有意义的语义值,可以使用strtol
将yytext
中的字符串转换为整数:
[0-9]+ yylval = strtol(yytext, NULL, 10); return INT;
要对int
范围以外的数字进行正确的错误处理,请在致电errno
之后检查strtol
。