Порядок приоритета для сопоставления токенов в Flex - PullRequest
6 голосов
/ 18 июля 2011

Приношу свои извинения, если название этой темы немного сбивает с толку.Я спрашиваю о том, как Flex (лексический анализатор) решает вопросы приоритета?

Например, допустим, у меня есть два токена с похожими регулярными выражениями, записанные в следующем порядке:

"//"[!\/]{1}    return FIRST;
"//"[!\/]{1}\<  return SECOND;

Учитывая ввод "//! <", FIRST или SECOND будутвернулся?Или оба?ПЕРВАЯ строка будет достигнута до ВТОРОЙ строки, но кажется, что возвращение ВТОРОГО будет правильным поведением. </p>

1 Ответ

11 голосов
/ 18 июля 2011

Возвращается самое длинное совпадение.

С flex & bison, Инструменты для обработки текста :

Как Flex справляется с неоднозначными образцами

Большинство гибких программ довольно неоднозначны, с несколькими шаблонами, которые могут соответствовать тот же вход. Flex разрешает неоднозначность по двум простым правилам:

  • Сопоставлять максимально длинную строку каждый раз, когда сканер сопоставляет ввод.
  • В случае ничьей используйте шаблон, который появляется первым в программе.

Вы можете проверить это самостоятельно, конечно:

файл: demo.l

%%
"//"[!/]   {printf("FIRST");}
"//"[!/]<  {printf("SECOND");}
%%

int main(int argc, char **argv)
{
    while(yylex() != 0);
    return 0;
}

Обратите внимание, что / и < не нужно экранировать, а {1} является избыточным.

bart@hades:~/Programming/GNU-Flex-Bison/demo$ flex demo.l 
bart@hades:~/Programming/GNU-Flex-Bison/demo$ cc lex.yy.c  -lfl
bart@hades:~/Programming/GNU-Flex-Bison/demo$ ./a.out < in.txt 
SECOND

, где in.txt содержит //!<.

...