Невозможно сопоставить правило при запуске flex для генерации лексического анализатора - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь написать спецификацию для гибкого лексического анализатора. Одно из правил заключается в том, что идентификатор (например, «foo», «Foo_Bar», «year_2020», «Jan30») не может заканчиваться на «_», например «foo_». До сих пор у меня есть следующее, чтобы поймать эту ошибку:

letter [A-Za-z]
digit [0-9]
identifier {letter}({letter}|{digit}|\_)*({letter}|{digit})*
number {digit}+
character [0-9a-zA-Z_]

...

    /*Ends with underscore*/
{letter}({character}*({letter}|{number})+)?\_
{
    printf("Error at line %d, column %d: identifier \"%s\" cannot end with an underscore.\n", num_lines, num_cols, yytext);
    exit(1);
}

Однако я получаю сообщение об ошибке "mini_l.lex: 89: предупреждение, правило не может быть соответствует », строка 89 - {letter}({character}*({letter}|{number})+)?\_.

Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 31 января 2020

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

Также, пожалуйста, помните, что в гибкое определение, действие должно начинаться на той же строке, что и шаблон. Невозможно поместить действие в следующую строку, как вы сделали; это приведет к тому, что действие будет неверно истолковано как шаблон. Таким образом, возможно, что проблема на самом деле в шаблоне {, так как flex иногда сообщает об ошибках с немного неправильным номером строки.

...