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


FLEX(1) - часть 16


Дополнительный класс распознает пробел:

w[\t]*

Первое правило переводит double precision в real или DOUBLE PRECISION в REAL.

{d}{o}{u}{b}{l}{e}{W}{p}{r}{e}{c}{i}{s}{i}{o}{n}{ printf(yytext[0]=='d'?"real":"REAL"); }

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

^" "[^0] ECHO;

В обычном выражении пробел заключается в кавычки. Это распознается как начало строки, затем ставится пять пробелов, затем любой символ, кроме пробела или нуля. Здесь символ (^) выступает в двух значениях. Приводим пример программы, которая заменяет константы двойной точности на обычные константы с плавающей точкой:

[0-9]+{W}{d}{W}[+-}?{W}[0-9]+ | [0-9]+{W}"."{W}{d}{W}[+-]?{W}[0-9]+ | "."{W}[0-9]+{W}{d}{W}[+-]?{W}[0-9]+ { /*convert constants*/ for(p=yytext;*p!=0;p++) { if(*p=='d'*p=='D') *p+='e'-'d'; ECHO; }

После нахождения константы с плавающей точкой, она обрабатывается в цикле for с целью найти букву "d" или "D". Затем программа добавляет "'e'-'d'", что переводит ее в следующую букву алфавита. Модифицированная константа выводится снова, теперь уже одинарной точности. Далее приводится ряд имен, которые должны быть преобразованы с целью удалить начальную "d". При испльзовании массива yytext подобное действие удовлетворяет всем именам (здесь приводится только часть довольно длинного списка).

{d}{s}{i}{n} | {d}{c}{o}{s} | {d}{s}{q}{r}{t} | {d}{a}{t}{a}{n} | ... {d}{f}{l}{o}{a}{t}printf("%s",yytext+1);

Другой список имен изменяет начальную d на начальную a:

{d}{l}{o}{g} | {d}{l}{o}{g}10 | {d}{m}{i}{n}1 | {d}{m}{a}{x}1 { yytext[0]+='a'-'d'; ECHO; }

Еще одна подпрограмма изменяет начальную d на r:

{d}1{m}{a}{c}{h}{ yytext[0]+='r'-'d'; ECHO; }

Чтобы избежать восприятия таких имен, как имен dsinx, в качестве экземпляров dsin, некоторые конечные правила принимают более длинные слова как идентификаторы и копируют некоторые оставшиеся символы:




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



Книжный магазин