解析器 - 调用 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?如果您使用的是 lex,yytext
是 char[],
而不是 char*.
EDIT 如果您没有使用 flex,您应该使用它,它在各个方面都非常出色,并且从它出现在将近 30 年前。 lex 在那一天被淘汰了。
根据您使用的 lex 版本,yytext
可能是一个数组,也可能是一个指针。由于它是在不同的编译单元中定义的,如果它是一个数组并且您将其声明为指针,您将不会看到来自编译器或链接器的任何错误消息(链接器通常不进行类型检查)。相反,它会将数组中的前几个字符视为指针并尝试取消引用它并可能崩溃。
如果您使用的是 flex,您可以在 .l 文件的第一部分添加一个 %pointer
声明,以确保它是一个指针而不是数组
我的解析器正在识别语法并使用 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?如果您使用的是 lex,yytext
是 char[],
而不是 char*.
EDIT 如果您没有使用 flex,您应该使用它,它在各个方面都非常出色,并且从它出现在将近 30 年前。 lex 在那一天被淘汰了。
根据您使用的 lex 版本,yytext
可能是一个数组,也可能是一个指针。由于它是在不同的编译单元中定义的,如果它是一个数组并且您将其声明为指针,您将不会看到来自编译器或链接器的任何错误消息(链接器通常不进行类型检查)。相反,它会将数组中的前几个字符视为指针并尝试取消引用它并可能崩溃。
如果您使用的是 flex,您可以在 .l 文件的第一部分添加一个 %pointer
声明,以确保它是一个指针而不是数组