以下是相关代码:
%{
#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();
}
%{
#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
任何人都可以解释为什么会这样吗?
或者,我该如何解决这个错误?
请帮助。
答案 0 :(得分:0)
您需要确定VARIABLE是sym[$1]
还是只是sym[]
的索引。语法中您同时使用了这两种方法。从您的词法分析器来看,它是索引。实际上,我根本不需要sym[]
。
在生成.c文件或时,在编译它们时并没有出现总线错误。当您执行您的应用程序时,您就知道了。