c - Flex 和 Bison 段错误

标签 c bison flex-lexer

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

相关文章:

c - 使用/将Linux shell命令 "echo 1=200 >/dev/mydevice"转换为c程序

regex - 为什么在我的 flex lexer 中,行数在一种情况下增加而在另一种情况下不增加?

c++ - 为什么规则不适用于使用 C++ 的 Flex?

c - 计算器中的错误

bison - 初学者 Bison 弯曲

c - YACC语法减少/减少冲突

c++ - NOT 代币在 bison 中的分布

c - qsort 崩溃程序 - C

c - 如何编写一个C程序来计算总金额?

C代码有点难?