将两个令牌加在一起(整数)。弹性/野牛

时间:2018-11-27 03:35:12

标签: 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", ($1 + $3)); }
;

%%


int main(int argc, char** argv) {
    yyparse();
    return 0;
}


void yyerror(const char* msg) {
    fprintf(stderr, "ERROR! %s\n", msg);
}

Flex文件

%{
#include "adder.tab.h"
%}

%%
(\+)        return PLUS;
[0-9]+      return INT;
(END)       return END;
%%

1 个答案:

答案 0 :(得分:1)

在解析器中,您有以下内容:

expr:         INT PLUS INT
          { printf("%d\n", ($1 + $3)); }

这采用了两个INT标记的语义值并将它们相加,这很好。如果始终产生0,则表示令牌的语义值一定存在问题。因此,让我们看一下相应的词法分析器操作:

[0-9]+      return INT;

在这里,您永远不会为yylval分配任何内容,因此解析器规则中的$1$3将不会被分配。要分配有意义的语义值,可以使用strtolyytext中的字符串转换为整数:

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

要对int范围以外的数字进行正确的错误处理,请在致电errno之后检查strtol