将两个标记加在一起(整数)。 Flex/Bison
Adding two tokens together (integers). Flex/Bison
我有一个简单的 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", ( + )); }
;
%%
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;
%%
在你的解析器中你有这个:
expr: INT PLUS INT
{ printf("%d\n", ( + )); }
这会获取两个 INT
标记的语义值并将它们相加,这很好。如果这始终产生 0,则意味着标记的语义值一定有问题。那么让我们看看相应的词法分析器动作:
[0-9]+ return INT;
在这里您永远不会为 yylval
分配任何内容,因此您的解析器规则中的 </code> 和 <code>
将被取消分配。要分配有意义的语义值,您可以使用 strtol
将 yytext
中的字符串转换为整数:
[0-9]+ yylval = strtol(yytext, NULL, 10); return INT;
为了正确处理超出 int
范围的数字,您应该在调用 strtol
后检查 errno
。
我有一个简单的 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", ( + )); }
;
%%
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;
%%
在你的解析器中你有这个:
expr: INT PLUS INT
{ printf("%d\n", ( + )); }
这会获取两个 INT
标记的语义值并将它们相加,这很好。如果这始终产生 0,则意味着标记的语义值一定有问题。那么让我们看看相应的词法分析器动作:
[0-9]+ return INT;
在这里您永远不会为 yylval
分配任何内容,因此您的解析器规则中的 </code> 和 <code>
将被取消分配。要分配有意义的语义值,您可以使用 strtol
将 yytext
中的字符串转换为整数:
[0-9]+ yylval = strtol(yytext, NULL, 10); return INT;
为了正确处理超出 int
范围的数字,您应该在调用 strtol
后检查 errno
。