бизон / флекс: печать ошибочной строки - PullRequest
9 голосов
/ 24 июня 2011

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

Ответы [ 2 ]

9 голосов
/ 24 июня 2011

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

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

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

3 голосов
/ 24 июня 2011

yylineno дает вам льно, обрабатываемое

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

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

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

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

...