The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Каталог документации / Раздел "Программирование в Linux" / Оглавление документа
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

АКЦИЯ! ПОДПИШИСЬ на журнал Linux Format до 31 января 2012 года и выиграй СУПЕРПРИЗ!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Подробнее о проведении акции вы можете прочитать на странице сайта.


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList