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