Unix Man (Справочное руководство)


FLEX(1) - часть 15


%% int k [0-9]+ { k=atoi(yytext); if(k%7==0) printf("%d",k+3); else printf("%d",k); }

Правило [0-9] узнает строки цифр; atoi (см. atof(2)) - преобразует цифры в двоичные и накапливает результат в k. Оператор остатка (%) используется для проверки, является ли k кратным 7; если да, то к нему добавляется 3. Можно показать, что эта программа будет искажать входные данные типа 49.63 или X7

Более того, она увеличивает абсолютное значение всех отрицательных чисел, кратных семи. Чтобы избежать этого, надо добавить несколько правил к имеющимся, как это показано ниже:

%% int k; -?[0-9]+ { k=atoi(yytext); printf("%d",k%7==0?k+3:k); } -?[0-9.]+ ECHO; [A-Za-z][A-Za-z0-9]+ ECHO;

Числовые строки, содержащие десятичные точки или начинающиеся с букв, будут отбираться одним из двух последних правил и изменяться не будут. if-else для экономии места замещается условным оператором СИ. Конструкция a?b:c означает: если a, то b, иначе c.

Следующая программа производит статистическую обработку. Она строит гистограмму длин слов, считая словом строку букв..

int lengs[100]; %% [a-z]+ lengs[yyleng]++; . | \n ; %% yywrap() { int i; printf("Length No. words\n"); for(i=0;i0) printf("%5d%10d\n",i,lengs[i]); return(1); }

Эта программа накапливает гистограмму, не выводя ничего в процессе работы. По окнчании ввода она печатает таблицу. Последняя команда return(1) означает, что lex должен выполнить цикл. Если yywrap() выдает нуль ("ложь"), это значит, что имеются еще входные данные и следует продолжать ввод и обработку. Если yywrap() никогда не получит значение "истина", программа впадет в бесконечный цикл.

В качестве примера большего обьема, приведем части программы, предназначенной для преобразования чисел двойной точности FORTRANа в одинарную. Так как FORTRAN не различает заглавные и строчные буквы, эта подпрограмма начинается с определения набора классов, включающих оба варианта каждой буквы:

a [aA] b [bB] c [cC] . . . . . . z [zZ]




Начало  Назад  Вперед