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


FLEX(1) - часть 11


Иногда необходимо иметь несколько наборов лексических правил и обращаться к ним в различное время в процессе ввода. Например, препроцессор компилятора должен различать операторы препроцессора и анализировать их отдельно от других операторов. Для этого надо учитывать предыдущий контекст. Существует несклько способов решения таких проблем. Оператор (^) - это оператор предшествующего контекста. Он распознает непосредственно предшествующий левый контекст после того, как оператор знака доллара ($) распознает правый контекст. Принципы обработки прилегающего левого контекста могли бы быть расширены для обеспечения возможностей, аналогичных обеспечиваемым анализои прилегающего правого контекста. Но вряд ли это так же полезно, поскольку нужный левый контекст часто появляется раньше например, в начале строки.

Этот раздел описывает три способа работы с различными контекстами:

  1. Использование флагов, если при переходе от одной среды к другой меняются всего несколько правил.
  2. Использование в правилах стартовых условий.
  3. Использование нескольких лексических анализаторов, работающих совместно.

В каждом случае существуют правила, которые обнаруживают необходимость изменения среды, в которой анализируется входной текст, и устанавливают некоторые параметры для учета изменения. Это может быть флаг, явно проверяемый программой действия пользователя. Такой флаг наиболее просто разрешает проблему, так как lex вообще не привлекается. Тем не менее, есть еще более удобный способ - заставить lex запомнить флаги в качестве начальных условийначальных условий правил. Каждое правило может быть ассоциировано с определенным стартовым условием. Оно будет распознаваться только тогда, когда lex будет находиться в этом стартовом условии. Текущее стартовое условие может быть изменено в любой момент. Наконец, если наборы правил для различных сред неодинаковы, то самый лучший способ достигнуть ясности - это написать несколько различных лексических анализаторов и переключатся с одного на другой.

Допустим, имеется следующая задача: скопировать входные данные в выходные, заменяя в каждой строке, начинающейся с буквы a, слово magic на first; заменяя magic на second в каждой строке, начинающейся с буквы b; и заменяя magic на third в каждой строке, начинающейся с буквы c. Все остальные слова и строки оставляются без изменений.

Эта задача настолько проста, что лучше всего воспользоваться эфлогом:




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