| |
Функция используется для определения конца файла, из которого ЛА читает
поток символов. Если yywrap
возвращает 1, ЛА прекращает работу. Однако
иногда появляется необходимость начать ввод данных из другого источника
и продолжить работу. В этом случае нужно написать свою подпрограмму
yywrap
, которая организует новый входной поток и возвращает 0, что
служит сигналом к продолжению работы ЛА. По умолчанию yywrap
всегда
возвращает 1 при завершении входного потока символов. В LEX-программе
невозможно записать правило, которое будет обнаруживать конец файла.
Единственный способ это сделать - использовать функцию yywrap
. Эта
функция также удобна, когда необходимо выполнить какие-либо действия
по завершению входного потока символов. Пример:
%START AA BB CC /* * Строится ЛА, который распознает наличие включений * файлов в Си-программе, условных компиляций, * макроопределений, меток и головной функции main. * Анализатор ничего не выводит * пока осуществляется чтение всего входного потока. * По завершении выводится статистика. */ БУКВА [A-ZА-Яa-zа-я_] ЦИФРА [0-9] ИДЕНТИФИКАТОР {БУКВА}({БУКВА}|{ЦИФРА})* int a1,a2,a3,b1,b2,c; %% {a1=a2=a3=b1=b2=c=0;} ^# BEGIN AA; ^[ \t]*main BEGIN BB; ^[ \t]*{ИДЕНТИФИКАТОР} BEGIN CC; \t ; \n BEGIN 0; <AA>define {a1++;} <AA>include {a2++;} <AA>ifdef {a3++;} <BB>[^\,]*","[^\,]*")" {b1++;} <BB>[^\,]*")" {b2++;} <CC>":"/[ \t] {c++;} %% yywrap() { if(b1==0&&b2==0) printf("В программе отсутствует функция main.\n"); if(b1>=1&&b2>=1) printf("Многократное определение функции main.\n"); else { if(b1==1) printf("Функция main с аргументами.\n"); if(b2==1) printf("Функция main без аргументов.\n"); } printf("Включений файлов: %d.\n",a2); printf("Условных компиляций: %d.\n",a3); printf("Определений: %d.\n",a1); printf("Меток: %d.\n",c); return(1); }Оператор
return(1)
в функции yywrap
указывает, что ЛА должен завершить
работу. Если необходимо продолжить работу ЛА для чтения данных из
нового файла, нужно ипользовать return(0)
, предварительно осуществив
операции закрытия и открытия файлов. Однако если yywrap
не возвращает
1, то это приводит к бесконечному циклу.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |