Я работаю над улучшением отчетов об ошибках в моем назначении компилятора. Я обрабатываю незавершенные комментарии во Flex, используя следующий код:
<INITIAL>"/*" {BEGIN(COMMENT);}
<COMMENT>"*/" {BEGIN(INITIAL);}
<COMMENT>([^*]|\n)+ {}
<COMMENT><<EOF>> {yyerror("UNTERMINATED COMMENT"); BEGIN(INITIAL);}
Проблема в том, что синтаксический анализатор также печатает сообщение об ошибке:
$ ./comp tests/comments.cf
ERROR: UNTERMINATED COMMENT: 27
ERROR: syntax error: 27
Как я могу дать указание парсеру не продолжать свою работу? Добавление exit
после BEGIN(INITIAL)
дает мне то, что я хочу, но, похоже, это не способ справиться с этим.
<COMMENT>
правила неверны; ни одно правило не соответствует*
внутри комментария, так что это попадет в правило по умолчанию. Если ваше правило по умолчанию. { return yytext[0]; }
, это будет иметь особенно катастрофические последствия; если правилом по умолчанию является сгенерированное flex правило по умолчанию (ECHO
), это будет просто странно. Кроме того, набор символов[^*]
включает\n
, поэтому|\n
является избыточным. - person rici   schedule 10.05.2015