bison/flex: напечатать ошибочную строку

Я использую bison+flex для разбора файла. При ошибке вызывается yyerror(). Как я могу получить номер строки или строку, нарушающую правила, чтобы напечатать ее с сообщением об ошибке?


person Jakub M.    schedule 24.06.2011    source источник


Ответы (2)


Номер строки прост: yylineno — это номер строки. Укажите %option yylineno в верхней части файла .l.

Ну, почти легко. Lookahead иногда может привести к тому, что номер строки будет смещен на единицу. Вместо того, чтобы говорить что-то вроде «Ошибка произошла в строке #xxx», вы можете сказать, что ошибка произошла рядом со строкой #xxx.

Что касается остального, это зависит от вас. Вам придется перехватить не совсем допустимый синтаксис и вызвать соответствующее предупреждение или обработчик ошибок. Подробнее см. в книге O'Reilly "flex & bison"; в нем есть целая глава, посвященная сообщениям об ошибках. Целая глава — это слишком много, чтобы воспроизвести ее на этом сайте вопросов и ответов.

person David Hammen    schedule 24.06.2011
comment
Спасибо за быстрый ответ. А в остальном решать вам : ) ну в этом и суть моего вопроса - как зафиксировать нарушающую линию то? - person Jakub M.; 24.06.2011
comment
@ user497208: Запоздалый ответ на ваш последний вопрос: вы (непреднамеренно) просите меня написать книгу или главу книги. Написание книги или даже главы или раздела книги немного выходит за рамки интернет-сайтов вопросов и ответов, таких как Stack Overflow. Я дал название книги, которая подробно освещает эту тему. Прочитайте это! - person David Hammen; 26.06.2011

yylineno дает вам обрабатываемое lineno

Вы также можете сообщить пользователю, какой текст выдал ошибку с помощью yytext на стороне flex:

0|([1-9]{DIG}*)    {
                    String msg("some error with number: "); msg.append(yytext);
                    yyerror(msg.c_str());
                   }

yytext содержит только текст совпадающего правила.

Если вы хотите указать всю строку, вам придется сделать это самостоятельно, открыв файл в поисках строки с номером yylineno и распечатав ее. Хороший способ сделать это — предоставить собственную реализацию функции yyerror.

person GriffinHeart    schedule 24.06.2011