我的解析器正在识别语法并使用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吗?如果不是哪个变量包含导致语法错误的符号?
由于
答案 0 :(得分:3)
根据您使用的lex版本,yytext
可能是数组或可能是指针。由于它是在不同的编译单元中定义的,如果它是一个数组并且您将其声明为指针,则不会看到来自编译器或链接器的任何错误消息(链接器通常不进行类型检查)。相反,它会将数组中的前几个字符视为指针并尝试取消引用它并可能崩溃。
如果您正在使用flex,则可以在.l文件的第一部分添加%pointer
声明,以确保它是指针而不是数组
答案 1 :(得分:2)
您使用的是 lex 还是 flex ?如果您正在使用 lex ,则yytext
为char[],
而不是char*.
编辑如果您没有使用 flex ,那么它应该是各方面的优势,并且从近30年前出现的那一刻开始。那天 lex 已经过时了。