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


FLEX(1) - часть 7


yytext[yyleng-1]

Иногда lex может решить, что правило не обнаружило соответствующий набор символов. Существуют две программы, помогающие в этой ситуации. Во-первых, может быть вызвана подпрограмма yymore(), предписывающая присоединить следующее вводимое выражение к концу текущего ввода. Обычно следующая вводимая символьная строка затирает текущий элемент в yytext. Во-вторых, может быть вызвана подпрограмма yyless(n), определяющая, что не все символы, подбираемые текущим выражением, требуются прямо сейчас. Ар гумент n указывает число символов, содержащихся в yytext. После дующие символы, которые уже были сопоставлены, возвращаются обратно на ввод. Это обеспечивает способ просмотра данных, ана логичный задаваемому оператором (/), но в другой форме.

Например, рассмотрим язык, который определяет группу симво лов, заключенных в кавычки, как символьную строку. Если в эту строку надо включить знак кавычек, то ему должна предшествовать обратная косая черта (\). Регулярные выражения, используемые для такого сопоставления, довольно сложны, поэтому предпочтительнее ввести:

\"[^"]* { if(yytext[yyleng-1]==`\\`) yymore(); else ...normal user processing }

При этом, если встретится

"abc\"def"

то будут сопоставляться первые пять символов

"abc\

Затем, вызов yymore() перенесет следующую часть символьной строки

"def

в конец. Заметим, что последний знак кавычки, завершающий строку, будет представлен в коде, соответствующем обычной обработке.

Функция yyless() в различных обстоятельствах может быть использована для повторной обработки текста. Рассмотрим проблему определения неоднозначного выражения =-a в старом варианте СИ. Допустим, что это требуется представить как =- a для последующей печати. Можно применить следующее правило:

=-[a-zA-Z] { printf("Operator(=-)ambiguous\n"); yyless(yyleng-1); ...action for=-... }

Будет печататься сообщение, после каждого оператора буква будет возвращаться во входной поток, а оператор будет трактоваться как =-.

Наоборот, может потребоваться трактовать это как = -a; чтобы добиться этого, уберите знак минус и букву для ввода. Интерпретация будет выполнена следующими строками:




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