Flex & Bison 分段错误

Flex & Bison Segmenation fault

我要制作一个编译器,为此我使用了 flex 和 bison。 我正在实施布尔比较。但是当 bison 进入我的令牌 COMP 时我有一个错误。

我已经这样声明了:

("==")|(">=")|("<=")|("!=")|(">")|("<")
{
   sscanf(yytext,"%s",yylval.svalcmp); return COMP;
}

在野牛中,我的语法是:

ExpBool :
  Exp COMP Exp { printf("TEST= %s \n",); /*comp_exp_temp();*/} 
| 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 时,我遇到了分段错误。

有人有想法吗?

我通常在词法分析器中使用不同的样式,因此无法验证 (...)|(...)... 语法是否正确。但是,您与 yylval 的联合是什么? svalcmp 是一个缓冲区还是一个指针?如果它是一个缓冲区,您可能应该按长度限制 scanf 格式。如果它只是一个指针,您可能已经清理了内存,并且可能遇到了空指针崩溃。

如果你在 GDB 中调用它,附加回溯,并打印 yylval