Работя върху подобряването на отчитането на грешки в задачата ми за компилатор. Обработвам незавършени коментари във 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