我要制作一个编译器,我使用flex和bison。 我实现了布尔比较。但是当野牛进入我的令牌COMP时,我有一个错误。
我已经这样声明了:
("==")|(">=")|("<=")|("!=")|(">")|("<")
{
sscanf(yytext,"%s",yylval.svalcmp); return COMP;
}
在野牛我的gramar是:
ExpBool :
Exp COMP Exp { printf("TEST= %s \n",$2); /*comp_exp_temp($2);*/}
| Exp BOPE Exp
| NEGATION Exp
;
我的工会:
%union {
char cval;
char * sval;
char * svalt;
char * svalcmp;
char svalas;
char * svalds;
int signedint;
int usint;
}
和令牌去除:
%token <svalcmp> COMP
Bison执行第一个Exp但是当它读取COMP时,我得到一个Segmenation错误。
有人有想法吗?
答案 0 :(得分:0)
我通常在词法分析器中使用不同的样式,因此无法验证(...)|(...)...语法是否正确。但是,你的联盟与yylval相关联的是什么? svalcmp是缓冲区还是指针?如果它是缓冲区,您可能应该将scanf格式限制为一个长度。如果它只是一个指针,你可能已经消耗了内存,并且可能遇到空指针崩溃。
如果你在GDB中提出它,请附上一个回溯,并打印yylval