Главная

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

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

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

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

ТОР 5 статей:

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

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

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

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

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

КАТЕГОРИИ:






Функции yyless и yymore




 

В обычной ситуации содержимое yytext обновляется всякий

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

что в yytext всегда находятся символы распознанной последо-

вательности. Иногда возникает необходимость добавить к теку-

щему содержимому yytext следующую распознанную цепочку сим-

волов. Для этой цели используется функция yymore. Формат

вызова этой функции:

yymore ()

В некоторых случаях возникает необходимость использовать не

все символы распознанной последовательности в yytext, а

только необходимое их число. Для этой цели используется

функция yyless. Формат ее вызова:

yyless (n)

где n указывает, что в данный момент необходимы только n

символов строки в yytext. Остальные найденные символы будут

возвращены во входной поток.

 

Пример использования фунцкии yymore:

 

 

 

 

.

.

.

\"[^"]* {

if (yytext [ yyleng - 1] == '\\'){

yymore ();

} else {

 

/*

* здесь должна быть часть

* программы, обрабатывающая

* закрывающую кавычку.

*/

 

}

}

.

.

.

 

В этом примере распознаются строки симвoлов, взятые в двой-

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

строки может изображаться с предшествующей косой чертой.

Анализатор должен распознавать кавычку, ограничивающую

строку, и кавычку, являющуюся частью строки, когда она изоб-

ражена как \".

 

Допустим, на вход поступает строка "абв\"где". Сначала

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

в этой цепочке будет символ "\", выполнится вызов yymore ().

В результате к цепочке "абв\ будет добавлено "где, и в

yytext мы получим: "абв\"где, что и требовалось.

 

Пример использования фунции yyless:

 

.

.

.

=-[A-ZА-Яa-zа-я] {

 

printf ("Oператор (=-) двусмысленный.\n");

yyless (yyleng - 2);

 

/*

* здесь необходимо указать

* действия для случая "=-"

*/

}

.

.

.

 

В этом примере разрешается двусмысленность выражения "=-

 

 

 

 

буква" в языке Си. Это выражение можно рассматривать как

 

"=- буква" (равносильно "-=")

или

"= -буква"

 

Предположим, что желательно эту ситуацию рассматривать как

"= -буква" и выводить пердупреждение. Указанное в примере

правило распознает эту ситуацию и выводит предупреждение.

Затем, в результате вызова " yyless (yyleng - 2);" два сим-

вола "-буква" будут возвращены во входной поток, а знак "="

останется в yytext для обработки, как в нормальной ситуации.

Таким образом, при продолжении чтения входного потока уже

будет обрабатываться цепочка "-буква", что и требовалось.

 






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

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