将两个标记加在一起(整数)。 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> 将被取消分配。要分配有意义的语义值,您可以使用 strtolyytext 中的字符串转换为整数:

[0-9]+      yylval = strtol(yytext, NULL, 10); return INT;

为了正确处理超出 int 范围的数字,您应该在调用 strtol 后检查 errno