解析器 - 调用 yytext 时出现分段错误

Parser - Segmentation fault when calling yytext

我的解析器正在识别语法并使用 yylineno 指示正确的错误行。我想打印导致错误的符号。

int yyerror(string s)
{
  extern int yylineno;  // defined and maintained in lex.yy.c
  extern char *yytext;  // defined and maintained in lex.yy.c

  cerr << "error: " << s << " -> " << yytext << " @ line " << yylineno << endl;
  //exit(1);
}

当我写一些语法不可接受的内容时出现此错误:

error: syntax error -> Segmentation fault

难道我不应该使用 yytext 吗?如果不是,哪个变量包含导致语法错误的符号?

谢谢

您使用的是 lex 还是 flex?如果您使用的是 lexyytextchar[], 而不是 char*.

EDIT 如果您没有使用 flex,您应该使用它,它在各个方面都非常出色,并且从它出现在将近 30 年前。 lex 在那一天被淘汰了。

根据您使用的 lex 版本,yytext 可能是一个数组,也可能是一个指针。由于它是在不同的编译单元中定义的,如果它是一个数组并且您将其声明为指针,您将不会看到来自编译器或链接器的任何错误消息(链接器通常不进行类型检查)。相反,它会将数组中的前几个字符视为指针并尝试取消引用它并可能崩溃。

如果您使用的是 flex,您可以在 .l 文件的第一部分添加一个 %pointer 声明,以确保它是一个指针而不是数组