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

时间:2015-04-07 20:01:48

标签: parsing compiler-construction flex-lexer lex

我的解析器正在识别语法并使用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);
}

当我写一些语法不能接受的东西时,我得到了这个错误:

  

错误:语法错误 - &gt;分段错误

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

由于

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您使用的是 lex 还是 flex ?如果您正在使用 lex ,则yytextchar[],而不是char*.

编辑如果您没有使用 flex ,那么它应该是各方面的优势,并且从近30年前出现的那一刻开始。那天 lex 已经过时了。