总线错误:10个野牛和mac os上的flex

时间:2017-11-12 12:51:34

标签: c macos bison flex-lexer

以下是相关代码:

calc.y

%{
    #include <stdio.h>
    void yyerror(char *);
    int yylex(void);

    int sym[26];
%}
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'

%% 

program:
        program statement '\n'
        | /* NULL */
        ;

statement:
        expression                  { printf("%d\n", $1); }
        | VARIABLE '=' expression   { sym[$1] = $3; }
        ;

expression:
        INTEGER
        | VARIABLE                      { $$ = sym[$1]; }
        | expression '+' expression     { $$ = $1 + $3; }
        | expression '-' expression     { $$ = $1 - $3; }
        | expression '*' expression     { $$ = $1 * $3; }
        | expression '/' expression     { $$ = $1 / $3; }
        | '(' expression ')'            { $$ = $2; }
        ;

%%

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

int main(void){
    yyparse();
}

calc.l

%{
    #include "calc.tab.h"
    #include <stdlib.h>
    void yyerror(char *);
%}

%% 
[a-z]       {
                yylval = *yytext - 'a';
                return VARIABLE;
}

[0-9]+      {
                yylval = atoi(yytext);
                return INTEGER;
}

[-+()=/*\n]     { return *yytext; }

[\t]    ;

.           yyerror("Unkown Character");

%%

int yywrap(void) {
    return 1;
}

当我使用以下命令运行上面的代码时,它运行良好。

$ bison -d calc.y
$ flex calc.l

然而,当它像这样运行时:

$ gcc lex.yy.c calc.tab.c -o app

此命令不能正常工作。我正在关注error

Bus error: 10

任何人都可以解释为什么会这样吗?

或者,我该如何解决这个错误?

请帮助。

1 个答案:

答案 0 :(得分:0)

您需要确定VARIABLE是sym[$1]还是只是sym[]的索引。语法中您同时使用了这两种方法。从您的词法分析器来看,它是索引。实际上,我根本不需要sym[]

在生成.c文件时,在编译它们时并没有出现总线错误。当您执行您的应用程序时,您就知道了。