lex (813547), страница 10

Файл №813547 lex (Метода по лексу) 10 страницаlex (813547) страница 102020-11-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 10)

Они обеспечивают специальныевозможности по обработке внутренних переменных и управление входным потоком.В обычной ситуации содержимое символьного массива, адресованного внутренней переменнойyytext, обновляется всякий раз, когда лексический анализатор распознает во входном потокеочередную лексему, соответствующую регулярному выражению правила. Однако, в некоторыхслучаях возникает потребность добавить к текущему содержимому массива yytext следующуюпоследовательность символов входного потока. Для достижения этого результата в действииправила можно использовать стандартную функцию yymore. Она не имеет аргументов иобеспечивает накопление символьной информации в массиве yytext, а также соответствующимобразом увеличивает значение переменной yyleng, которая фиксирует его длину.Другая стандартная функция yyless позволяет получить обратный эффект.

Она применяется,когда возникает потребность сохранить в массиве yytext не все, а только необходимое числосимволов распознанной последовательности. Количество сохраняемых символов устанавливаетцелочисленный аргумент функции yyless. Остальные символы возвращаются обратно вовходной поток для последующей обработки. При этом соответствующим образом редуцируетсясодержимое массива yytext и уменьшается значение переменной yyleng.Совместное использование стандартных функций yymore и yyless иллюстрирует следующийпример лексического правила, которое обеспечивает обработку входной символьнойинформации, заключенной в кавычки, заменяя при этом ограничительные кавычки наапострофы.%%\”([^\\\n]|\\\”)*\”{ /* Обработка экранированной кавычки */if(yytext[yyleng – 2] == '\\') {yyless(yyleng – 1);yyleng--;yymore();} /* if */else { /* Обработка внешних кавычек */yytext[0] = yytext[yyleng –1] = '\'';printf(”%s”, yytext);} /* else */}Это правило ориентировано на обработку любой строки текста, ограниченной кавычками, вкоторой могут присутствовать внутренние кавычки, экранированные символом обратнойдробной черты (\” ).

Экранирование необходимо, когда внутренние кавычки являются частьютекста и не должны рассматриваться как ограничитель строки, имеющий специальный смысл.Например, в следующей строке внутренний символ экранированной кавычки используется дляобозначения размера в дюймах:”Монитор марки NEC MultiSync XE17 имеет размер 17\” по диагонали.”При обработке этой строки по правилу рассматриваемого примера, сначала распознаются всесимволы от начальной до экранированной кавычки, включительно.

Они заполняют массивyytext, который обрабатывается по альтернативе if действия правила. В процессе этойобработки вызов функции yyless возвращает во входной поток кавычку, завершающую массивyytext, неявно уменьшая его длину на один символ. Затем длина массива yytext уже явнымобразом уменьшается еще на один символ, чтобы исключит экранирующий символ обратнойдробной черты, но уже без возврата его во входной поток. Действие правила по альтернативе ifзавершает вызов функции yymore, которая обеспечивает дополнение массива yytextоставшимися символами входной строки при следующем обращении к данному правилу.

Такимобразом, после выполнения действия по альтернативе if в массиве yytext будут находитьсяпервые 49 символов рассматриваемой строки:”Монитор марки NEC MultiSync XE17 имеет размер 17В тоже время с учетом возврата кавычки во входном потоке остаются для последующейобработки 16 конечных символов исходной строки:” по диагонали.”Конец исходной строки, также как ее начало соответствуют регулярному выражениюрассматриваемого правила. Поэтому конечные символы строки добавляются к текущемусодержимому массива yytext. Таким образом, в результате двукратного применения данногоправила в массиве yytext будут сосредоточены все символы исходной строки, кромеэкранирующей дробной черты перед внутренними кавычками:”Монитор марки NEC MultiSync XE17 имеет размер 17” по диагонали.”Содержимое массива yytext обрабатывается по альтернативе else действия правила,обеспечивая стандартный вывод всех символов строки между ограничительными кавычками изамену ограничительных кавычек на апострофы.

В результате исходная строка преобразуется кследующему виду:'Монитор марки NEC MultiSync XE17 имеет размер 17” по диагонали.'Следует отметить, что исходная (с кавычками) и результирующая (с апострофами) строки будутодинаково интерпретироваться командным процессором sh из OS UNIX, который игнорируетспециальный смысл металитер внутри апострофов, но требует экранирования многих металитервнутри кавычек, чтобы исключить их специальный смысл.

Кроме того, рассмотренное правиломожет быть практически полезно для преобразования символьных строк из формата языка C вформат языка Pascal.Последняя из декларированных выше стандартных функций генератор LEX, функция reject,которая обеспечивает принудительный переход к обработке полученных символов входногопотока по следующему подходящему правилу.

При этом символы, полученные по текущемуправилу, в действии которого специфицирован вызов функции reject, возвращаются во входнойпоток и становятся доступны для последующей обработки.Функция reject обычно применяется для поиска перекрывающихся объектов входного потока.Например, следующие правила обеспечивает поиск и отображение через дефис всехдвухбуквенных сочетаний соседних букв во входном слове, которые начинаются на каждойбукве:%%[a-zA-Z][a-zA-Z]{printf("%s", yytext);putchar('-');reject();}[a-zA-Z]/[a-zA-Z];.printf("\b ");Первое правило отображает в потоке стандартного вывода текущую пару букв и символ дефиспосле нее, используя библиотечные функции printf и putchar системы программирования C.Функция reject в действии этого правила обеспечивает принудительный переход к обработкеих по второму правилу с постусловием и пустым действием, которое исключает первую буквупары.

Таким образом, обработка оставшейся части входного слова будет продолжена попервому правилу со второй буквы текущей пары. Последнее правило необходимо, чтобыподавить отображение дефиса, когда достигнут конец входного слова. Для этого в действииправила предусмотрен вызов библиотечной функции printf системы программирования C,аргумент которой обеспечивает возврат на одну позицию и заменяет пробелом текущий символстандартного вывода.В частности, при обработке по этим правилам входного слова SCANNER будут выделеныследующие 6 пар символов: SC-CA-AN-NN-NE-ER. Если из блока действий первого правилаисключить вызов функции reject, то при обработке того же входного слова будут обнаруженытолько 3 символьные пары: SC-AN-NE.В заключение следует отметить, что во многих версиях генератор LEX стандартная функцияreject реализована в форме макроса (оператора) REJECT.

В этих версиях рассмотренныйпример остается корректным при замене функции reject оператором REJECT.ОПЕРАТОРЫ ДЕЙСТВИЙКроме встроенных переменных и стандартных функций генератор LEX предоставляетспециальные операторы для использования в действиях правил. Наиболее часто в действияхправил применяются операторы ECHO и BEGIN.Оператор ECHO введен для сокращенной записи стандартного вывода содержимого массиваyytext, потому что эта операция особенно часто используется в действиях правил. В исходномтекстелексическогоанализатораоператорECHOопределяетсяпрепроцессора системы программирования C следующим образом:#define ECHOfwrite(yytext, yyleng, 1, stdout)директивой#defineТехнику применения оператора ECHO демонстрирует следующий пример спецификацииправил лексического анализатора, который должен формировать список слов входного текста,располагая каждое слово в отдельной строке стандартного вывода:%%[A-Za-z0-9]+ECHO;/* Отображение слова */[^A-Za-z0-9]+putchar('\n');/* Перевод строки между словами */Вправилахэтогопримераподсловомпонимаетсялюбаяалфавитно-цифроваяпоследовательность из десятичных цифр и латинских букв.

Разделителями слов считаютсялюбые символы или комбинации символов ASCII, которые не являются буквами и цифрами.Первое правило примера обеспечивает стандартный вывод каждого слова входного текста спомощью оператора ECHO. Второе правило компрессирует все соседние разделители слов водин символ перевода строки, который отображается библиотечной функцией putchar системыпрограммирования C.Если оператор ECHO может быть использован в действиях любой системы правил, то операторBEGIN целесообразно применять при наличии правил с предусловиями.

Эти правиланеобходимы, когда важно обеспечить возможность обработки эквивалентных наборовсимволов по различным правилам в зависимости от предыстории входного потока, котораяопределяет состояние лексического анализатора. Например, целочисленные константы C-кодаимеют различные значения в зависимости от префикса системы счисления.Как отмечалось выше, для обозначения различных состояний лексического анализаторагенератор LEX использует метки предусловий. Они специфицируются директивой %Startсекции описаний и указываются в угловых скобках в регулярных выражениях секции правил.

Характеристики

Тип файла
PDF-файл
Размер
656,32 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6451
Авторов
на СтудИзбе
305
Средний доход
с одного платного файла
Обучение Подробнее