ТОР 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 для обработки, как в нормальной ситуации. Таким образом, при продолжении чтения входного потока уже будет обрабатываться цепочка "-буква", что и требовалось.
Не нашли, что искали? Воспользуйтесь поиском:
|