Unix Man (Справочное руководство)


FLEX(1) - часть 9


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

  • предпочитается самое длинное сопоставление;
  • предпочитается первое из правил, сопоставляющих одинаковое число символов.

Предположим, например, что даны слаедующие правила:

integer keyword action...; [a-z]+ identifier action...;

Если на входе intergers, это воспринимается как идентификатор, потому что

[a-z]+

сопоставляет восемь символов, в то время, как

integer

сопоставляет только 7. Если на входе integer, оба правила сопоставляют 7 символов, выбирается правило клавиатуры, поскольку оно задано первым. Что-либо более короткое (например, int) не сопоставляет выражение integer, поэтому используется интерпретация данных как идентификатора.

Принцип предпочтения наиболее длинного сопоставления делает некоторые конструкции, такие как

.*

опасными. Например,

`.*`

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

Представленное на входе выражение

`first`quoted string here,`second`here

подбирает

`first`quoted string here,`second`

Но это, возможно, не то, что требуется. Более приемлемо следующее правило:

`[^~\n]*`

которое, при описанном выше вводе, остановится после `first` Последствия подобных ошибок смягчаются тем, что оператор точки (.) не сопоставляется знаку новой строки. Поэтому таким выражениям всегда сопоставляется не более одной строки. Не пытайтесь применять выражение типа

[.\n]+

или их эквиваленты: программа, созданная lex, будет пытаться считать весь входной файл, что вызовет переполнение внутреннего буфера.

Заметим, что lex обычно разделяет входной поток, не исследуя все возможные сопоставления каждого выражения. Это значит, что каждый символ рассматривается только один раз. Предположим, что надо сосчитать все she и he во входном тексте. Это могут сделать несколько правил:




Начало  Назад  Вперед