我要制作一个编译器,并使用 flex 和 bison 来实现。 我正在实现 bool 比较。但是当 bison 进入我的代币 COMP 时出现错误。
我已经这样声明了:
("==")|(">=")|("<=")|("!=")|(">")|("<")
{
sscanf(yytext,"%s",yylval.svalcmp); return COMP;
}
在 Bison 中,我的语法是:
ExpBool :
Exp COMP Exp { printf("TEST= %s \n",$2); /*comp_exp_temp($2);*/}
| Exp BOPE Exp
| NEGATION Exp
;
我的 union :
%union {
char cval;
char * sval;
char * svalt;
char * svalcmp;
char svalas;
char * svalds;
int signedint;
int usint;
}
和 token 解析:
%token <svalcmp> COMP
Bison 执行第一个 Exp,但当它读取 COMP 时,我遇到了段错误。
有人有想法吗?
最佳答案
我通常在词法分析器中使用不同的样式,因此无法验证 (...)|(...)... 语法是否正确。然而,你的 union 与 yylval 有何关联? svalcmp 是一个缓冲区还是只是一个指针?如果它是一个缓冲区,您可能应该限制 scanf 格式的长度。如果它只是一个指针,您可能已经耗尽了内存,并且可能会遇到空指针崩溃。
如果您在 GDB 中调出它,请附加回溯并打印 yylval
关于c - Flex 和 Bison 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983852/