Рассмотрим еще один пример - подсчет числа слов и строк в файле:
/***************** Раздел определений *********************/
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 - еще одно возвращаемое значение