Lex (flex) генерирует предупреждение об опасном концевом контексте при использовании шаблона соответствия конца строки `$` в правиле - PullRequest
0 голосов
/ 12 июля 2020

Причина

Я работал над проектом оболочки для своего курса, и я написал правило в моем файле lex, как показано ниже, чтобы соответствовать специальному ключевому слову, когда оно было введено пользователем:

^"key_word"$ { /* Do something here */ }

Когда я скомпилировал свой файл lex (используя flex -l), он затем выдает следующее предупреждение в строке этого правила:

warning, dangerous trailing context

Затем я просмотрел руководство по flex, и там было сказано следующее, как мне кажется, не соответствует используемому мною шаблону.

Некоторые шаблоны конечного контекста не могут быть правильно сопоставлены и генерировать предупреждающие сообщения («опасный конечный контекст»). Это шаблоны, в которых окончание первой части правила совпадает с началом второй части, например «zx * / xy *», где «x *» соответствует «x» в начале конечного контекста. (Обратите внимание, что в проекте POSIX указано, что текст, соответствующий таким шаблонам, не определен.)

Проблема

Из руководства я также знал, что test$ эквивалентно test/\n поэтому я создал следующий тестовый файл lex, чтобы провести некоторый эксперимент и скомпилировать его с помощью flex -l:

%{
    int nFirstMatch;
    int nSecMatch;
    int nThirdMatch;
%}

%%

"first"/\n { nFirstMatch++; }
"second"$ { nSecMatch++; }
"third"\n { nThirdMatch++; }

%%

int yywrap(void) {
    return 1;
}

int main(int argc, char *argv[]) {
    yylex();
    fclose(yyin);
}

Результат гибкости (обе версии 2.6.4 и 2.5.35 Apple (flex-32 )) выглядит следующим образом (строка 10 - второе правило выше):

eol.l:10: warning, dangerous trailing context

Однако из руководства test$ эквивалентно test/\n, поэтому они должны генерировать тот же результат. Более того, когда я удалил флаг -l (максимальная совместимость с исходным lex), предупреждение исчезло.

Question

Итак, мой вопрос: это что-то вроде внутренней ошибки внутри реализация гибкости при использовании флага -l?

...