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


FLEX(1) - часть 8


=-[a-zA-Z { printf("Operator(=-)ambiguous\n"); yyless(yyleng-2); ...action for=... }

Заметим, что выражения в этих случаях могут быть записаны как

=-/[A-Za-z]

в первом случае, и

=/-[A-Za-z]

во втором. В правилах, действия которых описаны выше, не требуется возврата. Для раскрытия неопределенности нет необходимости в распознавании всего идентификатора. Тем не менее, в случае =-3 лучше использовать правило

=-/[^\t\n]

В дополнение к этим программам, lex также разрешает доступ своим собственным подпрограммам ввода/вывода:

  1. input(), которая возвращает следующий вводимый символ;
  2. output(с), которая выводит символ c;
  3. unput(с), которая помещает символ c обратно во входной поток, чтобы затем считать его с помощью input().

По умолчанию эти подпрограммы рассматриваются как макроопределения, но пользователь может заменить их собственными версиями. Эти подпрограммы устанавливают взаимосвязь между внешними файлами и внутренними символами, поэтому они все должны сохраняться или видоизменяться согласованно. Они могут быть переопределены, чтобы вызвать перемещение выходных или входных данных в другие области, включая другие программы или оперативную память. Но используемые наборы символов во всех подпрограммах должны быть согласованы. Нулевое значение, возвращаемое input(), должно означать конец файла. Связь между unput() и input() должна сохраняться, иначе просмотр вперед не будет осуществляться. lex вообще не будет выполнять просмотр вперед, если ему это не предписано. Но каждое провило, содержащее косую черту (/) или оканчивающееся одним из следующих символов подразумевает просмотр:

+ * ? $

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

Еще одна подпрограмма библиотеки lex, которую иногда желательно переопределить, - это yywrap(), вызываемая каждый раз, когда lex достигает конца файла. Если yywrap() обращает 1, lex продолжает обычную работу до конца ввода. Иногда, тем не менее, удобно принять дополнительные входные данные из нового источника. В этом случае пользователь должен вызвать подпрограмму yywrap(), которая принимает новые входные данные и возвращает 0. Это заставит lex продолжить обработку. По умолчанию yywrap() всегда возвращает 1.

Эта подпрограмма также удобна для печати в конце программы таблиц, кратких пояснений и т.д. Заметим, что нельзя написать обычное правило которое распознает конец файла. Единственный сделать это - использовать yywrap(). В действительности, если не установлена собственная версия input(), то файлом, содержащим пустые указатели, нельзя управлять, поскольку значение 0, возвращаемое input(), воспринимается как конец файла.

Обработка неоднозначностей источника





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