【发布时间】:2018-04-25 05:30:47
【问题描述】:
这里是有问题的代码:
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();
}
计算.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
谁能解释为什么会这样?
或者,我该如何解决这个错误?
请需要帮助。
【问题讨论】:
-
我无法在我的拱门上重现同样的行为。没有错误,这是预期的工作。也许你应该包含你的 bison、flex 和 gcc 版本。
-
@Stargateur 。我如何生成
app.?我已经尝试过gcc lex.yy.c calc.tab.c -o app和valgrind gcc lex.yy.c calc.tab.c -o app。但这行不通。 -
你的 gcc 版本是多少?
gcc -v -
@Stargateur 。
$ gcc -v Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Bus error: 10 -
嗯……用你的包管理器升级你的 gcc……我无法想象你还在 gcc-4.2.1。也许这会修复错误。
标签: c macos bison flex-lexer