Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Действия в правилах Lex-программы




 

Действие можно представлять либо как оператор lex, нап-

ример, " BEGIN МЕТКА;", либо как оператор Си. Если имеется

необходимость выполнить достаточно большой набор преобразо-

ваний, то действие оформляют как блок Си-программы (он

 

 

 

 

начинается открывающей фигурной скобкой и завершается закры-

вающей фигурной скобкой), содержащий необходимые фрагменты.

 

Действие в правиле указывается через не менее, чем один

пробел или табуляцию после выражения (обязательно в той же

строке, где и выражение), а его продолжение может быть ука-

зано в следующих строках только в том случае, если действие

оформлено как блок Си-программы.

 

Область действия переменных, объявленных внутри блока,

распространяется только на этот блок. Внешними переменными

для всех действий будут являться только те переменные, кото-

рые объявлены в разделе определений Lex-программы.

 

Действия в правилах Lex-программы выполняются, если

правило активно, и если автомат распознает цепочку символов

из входного потока как соответствующую регулярному выражению

данного правила. Однако, одно действие выполняется всегда -

оно заключается в копировании входного потока символов в

выходной. Это копирование осуществляется для всех входных

строк, которые не соответствуют правилам, преобразующим эти

строки. Комбинация символов, не учтенная в правилах и поя-

вившаяся на входе, будет напечатана на выходе. Можно ска-

зать, что действие - это то, что делается вместо копирования

входного потока символов на выход. Часто бывает необходимо

не копировать на выход некоторую цепочку символов, которая

удовлетворяет некоторому регулярному выражению. Для этой

цели используется пустой оператор Си, например:

 

[ 0;

 

Это правило игнорирует (запрещает) вывод пробелов, табуляций

и символа новая строка. Запрет выражается в том, что на

указанныe символы во входном потоке осуществляется действие

";" - пустой оператор Си, и эти символы не копируются в

выводной поток символов.

 

Существует возможность для нескольких регулярных выра-

жений указывать одно действие. Для этого используется символ

"|", который указывает, что действие данного правила совпа-

дает с действием для следующего, например:

 

" " |

|

;

 

Результат будет тот же, что и в примере, указанном выше.

 

Когда необходимо вывести или преобразовать текст, соот-

ветствующий некоторому регулярному выражению, используется

внешний массив символов, который формирует lex. Называется

он yytext и доступен в действиях правил. Например:

 

 

 

[A-Z]+ printf (" %s ", yytext);

 

По этому правилу распознается слово, содержащее прописные

латинские буквы и выводится с помощью printf, если оно выде-

лено. Операция вывода распознанного выражения используется

очень часто, поэтому имеется сокращенная форма записи этого

действия:

 

[A-Z]+ ECHO;

 

Результат действия этого правила будет аналогичен результату

предыдущего примера. В выходном файле lex. yy. c ECHO опреде-

лено как макроподстановка:

 

#define ECHO fprintf (yyout, " %s ", yytext);

 

Когда необходимо знать длину обнаруженной последовательности

символов, используется счетчик найденных символов yyleng,

который также доступен в действиях. Например:

 

[A-Z]+ printf (" %c ", yytext [ yyleng -1]);

 

В этом примере будет выводится последний символ слова, соот-

ветствующего регулярному выражению [A-Z]+. Рассмотрим еще

один пример:

 

[A-Z]+ { число _ слов ++; число _ букв += yyleng;}

 

Здесь ведется подсчет числа распознанных слов и количества

символов во всех словах.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных