Причина
Я работал над проектом оболочки для своего курса, и я написал правило в моем файле 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
?