next up previous contents
Next: yymore(). Up: Структура файла lex.yy.c Previous: yylook().   Contents

yywrap().

Функция используется для определения конца файла, из которого ЛА читает поток символов. Если 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, то это приводит к бесконечному циклу.



2004-06-22