Порядок приоритета сопоставления токенов во Flex

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

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

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

При вводе "//!‹" будет возвращено ПЕРВОЕ или ВТОРОЕ? Или оба?

ПЕРВАЯ строка будет достигнута до ВТОРОЙ строки, но кажется, что возвращение ВТОРОЙ строки было бы правильным поведением.


person Casey Patton    schedule 18.07.2011    source источник


Ответы (1)


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

Из 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 содержит //!<.

person Bart Kiers    schedule 18.07.2011
comment
Я использовал {1}, надеясь, что он будет соответствовать строкам where where ! или / произошло ТОЛЬКО 1 раз. У меня сложилось впечатление, что это будет работать таким образом на этом веб-сайте: regular-expressions.info/reference.html. где написано Повторяет предыдущий элемент ровно n раз. - person Casey Patton; 18.07.2011
comment
@Casey, правильно, a{1} будет соответствовать a ровно один раз, как и шаблон a. Таким образом, вы можете поставить {1} после него, но это только добавит шума регулярному выражению. - person Bart Kiers; 18.07.2011
comment
@Casey, посмотри мой исправленный ответ. - person Bart Kiers; 18.07.2011