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
我要制作一个编译器,为此我使用了 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