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


FLEX(1) - часть 6


[\t\n];

которое вызывает игнорирование трех символов (пробел, знак табуляции, знак новой строки).

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

" " | "\t" | "\n" ;

Это приведет к тому же результату, только представлено в другом виде. Кавычки вокруг \n и \t не обязательны. Для задания более сложных действий часто нужно знать текущий текст, сопоставляемый выражениям типа

[a-z]+

lex хранит этот текст во внешнем символьном массиве с именем yytext. Так, чтобы напечатать найденное имя, используется правило типа

[a-z]+printf("%s",yytext);

которое печатает символьную строку, хранящуюся в yytext. Функция языка СИ printf(2) позволяет печатать формальные параметры и данные. В этом случае форматом является print string, где знак процента (%) указывает на преобразование данных, s обозначает тип символьной строки. Данными являются символы из yytext. Это переводит подобранную строку в выходные данные. Это действие настолько заурядно, что может быть написано через ECHO. Например:

[a-z]+ ECHO;

аналогично предыдущему примеру. Так как действие по умолчанию печатает только найденные символы, то может возникнуть вопрос: зачем нужно правило, описывающее только действие по умолчанию? Такие правила нужны, чтобы избежать сопоставления каких-то других, нежелательных правил. Например, если есть правило, которое сопоставляет read, то оно будет сопоставлять экземпляры read, заключенные в bread или readjust. Чтобы избежать этого, требуется правило

[a-z]+

Этот вопрос будет подробнее разобран далее.

Иногда бывает удобным знать конец найденных данных, поэтому lex подсчитывает число сопоставленных символов в переменной yyleng. Чтобы подсчитать и число слов и число символов, следует написать:

[a-zA-Z]+ {words++;chars+=yyleng;}

Будет произведен подсчет символов в словах, а результат будет передан переменной chars. Обращение к последнему символу сопоставляемой строки может произведено следующим образом:




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