Разработка компиляторов




Другие возможности Lex'а


Рассмотрим еще один пример - подсчет числа слов и строк в файле:

/***************** Раздел определений *********************/

NODELIM [^" "\t\n] /* NODELIM означает любой символ, кроме разделителей слов */ int l, w, c; /* Число строк, слов, символов */

%% /******************** Раздел правил ***********************/

{ l=w=c=0; /* Инициализация */ } {NODELIM}+ { w++; c+=yyleng; /* Слово */ } \n { l++; /* Перевод строки */ } . { c++; /* Остальные символы */ }

%% /******************* Раздел программ **********************/

int main() { yylex(); }

yywrap() { printf( " Lines - %d Words - %d Chars - %d\n", l, w, c ); return( 1 ); }

Внутри действий в правилах можно использовать некоторые специальные конструкции и функции Lex'а:

yytext - указатель на отождествленную цепочку символов, оканчивающуюся нулем; yyleng - длина этой цепочки yyless(n) - вернуть последние n символов цепочки обратно во входной поток; yymore() - считать следующие символы в буфер yytext после текущей цепочки yyunput(c) - поместить байт c во входной поток ECHO - копировать текущую цепочку в yyout yylval - еще одно возвращаемое значение




Содержание  Назад  Вперед