Я использую bison+flex для разбора файла. При ошибке вызывается yyerror(). Как я могу получить номер строки или строку, нарушающую правила, чтобы напечатать ее с сообщением об ошибке?
bison/flex: напечатать ошибочную строку
Ответы (2)
Номер строки прост: yylineno
— это номер строки. Укажите %option yylineno
в верхней части файла .l.
Ну, почти легко. Lookahead иногда может привести к тому, что номер строки будет смещен на единицу. Вместо того, чтобы говорить что-то вроде «Ошибка произошла в строке #xxx», вы можете сказать, что ошибка произошла рядом со строкой #xxx.
Что касается остального, это зависит от вас. Вам придется перехватить не совсем допустимый синтаксис и вызвать соответствующее предупреждение или обработчик ошибок. Подробнее см. в книге O'Reilly "flex & bison"; в нем есть целая глава, посвященная сообщениям об ошибках. Целая глава — это слишком много, чтобы воспроизвести ее на этом сайте вопросов и ответов.
yylineno
дает вам обрабатываемое lineno
Вы также можете сообщить пользователю, какой текст выдал ошибку с помощью yytext на стороне flex:
0|([1-9]{DIG}*) {
String msg("some error with number: "); msg.append(yytext);
yyerror(msg.c_str());
}
yytext содержит только текст совпадающего правила.
Если вы хотите указать всю строку, вам придется сделать это самостоятельно, открыв файл в поисках строки с номером yylineno
и распечатав ее. Хороший способ сделать это — предоставить собственную реализацию функции yyerror
.