46023 (665330), страница 9

Файл №665330 46023 (Проектирование трансляторов) 9 страница46023 (665330) страница 92016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

где СПИСОК_МЕТОК имеет вид:

метка1,метка2,...

В качестве первого правила раздела правил может быть прави-

ло вида:

BEGIN МЕТКА;

В этом правиле отсутствует ВЫРАЖЕНИЕ, и первым действием в

разделе правил будет активизация помеченных правил. Для возвраще-

ния автомата в исходное состояние можно использовать действие:

BEGIN 0;

Важно отметить следующее. Если Lex-программа содержит актив-

ные и неактивные правила, то активные правила работают всегда.

Оператор "BEGIN МЕТКА;" просто расширяет список активных правил,

активируя помеченные меткой МЕТКА. А оператор "BEGIN 0;" удаляет

из списка активных правил все помеченные правила, которые до это-

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

го в данный момент времени правила осуществляется действие BEGIN

МЕТКА, то из помеченных правил активными останутся только те, ко-

торые помечены меткой МЕТКА.

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

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

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

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

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

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

щий необходимые фрагменты.

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

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

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

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

Си-программы.

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

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

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

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

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

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

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

Однако, одно действие выполняется всегда - оно заключается в ко-

пировании входного потока символов в выходной. Это копирование

осуществляется для всех входных строк, которые не соответствуют

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

тенная в правилах и появившаяся на входе, будет напечатана на вы-

ходе. Можно сказать, что действие - это то, что делается вместо

копирования входного потока символов на выход.

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

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

массив символов, который формирует 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;}

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

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

Порядок действий активных правил

Список правил Lex-программы может содержать активные иеак-

тивные правила, размещенные в любом порядке в разделе правил. В

процессе работы лексического анализатора список активных правил

может видоизменяться за счет действий оператора BEGIN. В процес-

се распознавания символов входного потока может оказаться так,

что одна цепочка символов будет удовлетворять нескольким прави-

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

ла должно выполняться?

Для разрешения этого противоречия можно использовать кванто-

вание (разбиение) регулярных выражений этих правил Lex-программы

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

ти, однозначное распознавание лексемы. Однако, когда это не сде-

лано, Lex использует определенный детерминированный механизм раз-

решения такого противоречия:

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

более длинную последовательность символов из входного потока;

- если несколько правил распознают последовательности симво-

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

записано первым в списке раздела правил Lex-программы.

Раздел программ пользователя

Все, что размещено за вторым набором %%, относится к разде-

лу программ пользователя. Содержимое этого раздела копируется в

выходной файл lex.yy.c без каких-либо изменений. В файле lex.

yy.c строки этого раздела рассматриваются как функции в смысле

Си. Эти функции могут вызываться в действиях правил и, как обыч-

но, передавать и возвращать значения аргументов.

Комментарии Lex-программы

Комментарии можно указывать во всех разделах Lex- программы.

Формат комментариев должен соответствовать формату комментариев

host-языка. Однако, в каждом разделе Lex- программы комментарии

указываются по разному. В разделе определений комментарии должны

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

рии можно указывать только внутри блоков, принадлежащих дей-

ствиям. В разделе программ пользователя комментарии указываются

как и в host-языке.

Структура файла lexyy.c

Lex строит программу - лексический анализатор на языке Си,

которая размещается в файле со стандартным именем lex.yy.c. Эта

программа содержит две основных функции и несколько вспомога-

тельных. Основные - это:

функция yylex()

Она содержит разделы действий всех правил, которые определе-

ны пользователем;

функция yylook()

Она реализует детерминированный конечный автомат, который

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

гулярными выражениями правил Lex программы.

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

ввода-вывода. К ним относятся:

input() - читает и возвращает символ из входного потока сим-

волов;

unput(c) - возвращает символ обратно во входной поток для

повторного чтения;

output(c) - выводит в выходной поток символ "c".

Эти функции можно изменить, указав им те же имена и размес-

тив в разделе программ пользователя.

Кроме того имеются функции yywrap(), reject(),yyless() и

yymore().

yywrap()

Используется для определения конца файла, из которого лекси-

ческий анализатор читает поток символов. Если yywrap возвращает

1, лексический анализатор прекращает работу. Однако, иногда

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

продолжить работу. В этом случае пользователь должен написать

свою подпрограмму yywrap, которая организует новый входной поток

и возвращает 0, что служит сигналом к продолжению работы анализа-

тора. По умолчанию yywrap всегда возвращает 1 при завершению

входного потока символов.

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

обнаруживать конец файла. Единственный способ это сделать - ис-

пользовать фунцию yywrap. Эта функция также удобна, когда необхо-

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

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

риант функции yywrap.

REJECT

Обычно Lex разделяет входной поток, не осуществляя поиск

всех возможных соответствий каждому выражению. Это означает, что

каждый символ рассматривается один и только один раз. Иногда же-

лательно переопределить этот выбор. Действие функции REJECT озна-

чает "выбрать следующую альтернативу". Это приводит к тому, что

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

выбор.

Функция REJECT полезна в том случае, когда она применяется

для определения всех вхождений какого-либо об'екта, причем вхож-

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

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

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

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

Иногда возникает необходимость добавить к текущему содержимому

yytext следующую распознанную цепочку символов. Для этой цели ис-

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

yymore();

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

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

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

Формат ее вызова:

yyless( n );

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

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

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

Алгоритм лексического анализа

Данный алгоpитм является pасшиpенным индексным методом с

пpовеpкой пеpеходов и возвpатом ( теоpетический подход к этому

методу pешения был описан в пункте 2.1.1.).

ШАГ 1. Вычислить индекс начального сотояния (тек_сост).

ШАГ 2. Пpовеpить сушествует ли пеpеход из этого состояния по

какому либо символу или альтеpнативный пеpеход. Если не сущес-

твует, то пеpейти к ШАГУ 10.

ШАГ 3. Пpочитать один символ ( символ ).

ШАГ 4. Вычислить индекс элемента по введенному символу

тек_сост_1 = тек_сост + код_символа( символ ).

ШАГ 5. Пpовеpить индекс в таблице состояний. Если индекс

таблицы пеpеходов меньше нуля , то пеpейти к ШАГУ 8, если индекс

в таблице пеpеходов pавен нулю, то пеpейти к ША- ГУ 10. Иначе

пеpейти к ШАГУ 6.

ШАГ 6. Пpовеpить пpавильность пеpехода по таблице пеpехо-

дов. Если непpавильно, то пеpейти к ШАГУ 10. Иначе пеpейти ШАГУ 7.

ШАГ 7. Запомнить текущее состояние и введенный символ, ус-

тановить тек_сост в соответствии с таблицей пеpеходов. Пеpейти к

ШАГУ 2.

ШАГ 8. Изменить знак индекса таблицы пеpеходов и попы-

таться осуществить пеpеход как в ШАГАХ 4,6,7. Если попытка закон-

чилась удачно, то пеpейти к ШАГУ 2. Иначе пеpейти к ША- ГУ 9.

ШАГ 9. Если возможен пеpеход по алтеpнативе, то альтеpна-

тивное состояние сделать текущим и пеpейти к ШАГУ 4. В пpотивном

случае пеpейти к ШАГУ 10.

ШАГ 10. Веpнуть последний введенный символ в устpойство вво-

да.

ШАГ 11. Если достигнуто начальное состояние, то пpейти к

ШАГУ 13 в пpотивном случае пеpейти к шагу 12.

ШАГ 12. Если в текущее состояние пpинадлежит множеству воз-

можных конечных состояний, то в таблице конечных состояний уз-

нать номеp pаспознанной лексемы и закончить выполнение алгоpитма.

В пpотивном случае пеpейти в пpедыдущее состояние и пеpейти к

ШАГУ 10.

ШАГ 13. Закончить выполнение алгоpитма и выдать состояние

ошибки.

Данный алгоpитм позволяет стpоить лексический анализатоp,

котоpый получает поток сиволов со входного устpойства и pаспозна-

вая его тpанслиpует в паpы ( атpибут, значение ) для синтаксичес-

кого анализатоpа.

Пpиведем описание стpуктуp данных,пеpеменных и функций, ис-

пользующихся в пpогpамме.

Описание функций

Пpогpамма, постpоенная LEX, состоит из двух функций. Пеpвая

из них является непосpедственным исполнителем действий, пpедпи-

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

Тип файла
Документ
Размер
1,13 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

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