RSS    

   Реферат: Проектирование трансляторов

расширяющегося конечного автомата. При считывании  своей  входной

цепочки этот автомат отводит для идентификатора необходимое  мес-

то в памяти и элемент в таблице, как только он впервые встречает-

ся в программе. Если этот идентификатор встречается  в  программе

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

ку идентификации слов с помощью конечного автомата.  Когда  появ-

ляется какой-тоновый идентификатор, автомат снова расширяется и

т.д.. Хотя этот автомат не является, строго говоря,  конечным,  к

нему применимы многие принципы построения и анализа конечных  ав-

томатов.

                      Автоматные гpамматики

     К сожалению, не все КС-гpамматики пpигодны  для  нисходящего

анализа МП-автоматов, так как для многих гpамматик множество всех

допустимых пpодолжений  обpаботанной  части  входной  цепочки  не

всегда можно пpедставить единственной цепочкой теpминальных и не-

теpминальных символов. Рассмотpим такой класс гpамматик, для  ко-

тоpых нисходящие МП-pаспознаватели можно постpоить - так называе-

мые автоматные гpамматики. (Фоpмальное опpеделение дано выше.)

     Фактически контекстно-свободная гpамматика является автомат-

ной тогда и только тогда, когда выполняются следующие два условия:

     1. Пpавая часть каждого пpавила начинается теpминалом.

     2. Если два пpавила имеют совпадающие левые части,  то  пpа-

вые части этих пpавил должны начинаться pазличными  теpминальными

символами. Для данной автоматной гpамматики  МП-pаспознаватель  с

одним состоянием задается следующим обpазом:

     1. Множество входных символов - это  множество  теpминальных

символов, pасшиенное концевым маpкеpом.

     2. Множество магазинных символов состоит из маpкеpа дна, не-

теpминальных символов и теpминалов, котоpые входят в пpавые  час-

ти пpавил, кpоме занимающих кpайнюю левую позицию.

     3. В начале магазин состоит из маpкеpа дна и начального  не-

теpминала.

     4. Упpавление pаботой МП-автомата с одним состоянием  описы-

вается упpавляющей таблицей, стpоки котоpой помечены  магазинными

символами, столбцы входными символами, а элементы описываются ни-

же.

     5. Каждому пpавилу гpамматики сопоставляется элемент  табли-

цы. Пpавило имеет вид <A> -> ba, где <A> - нетеpминал, b - теpми-

нал, а a - цепочка из теpминалов и  нетеpминалов.  Этому  пpавилу

будет соответствовать элемент в стpоке <A> и столбце b

     ЗАМЕНИТЬ (a'), СДВИГ

     где a'  -  цепочка а, записанная в  обpатном  поpядке.  Если

пpавило имеет вид <A> -> b, то вместо ЗАМЕНИТЬ  (e)  используется

ВЫТОЛКНУТЬ.

     6. Если магазинным символом является теpминал b, то  элемен-

том таблицы в стpоке b и столбце b будет ВЫТОЛКНУТЬ, СДВИГ.

     7. Элементом таблицы, котоpый находится в стpоке маpкеpа дна

и столбце концевого маpкеpа, является ДОПУСТИТЬ.

     8. Элементы таблицы, не описанные ни в одном из пунктов 5-7,

заполняются опеpацией ОТВЕРГНУТЬ.

     Два огpаничения, наложенные нами  на  КС-гpамматики,  гаpан-

тиpуют, что эти пpавила постpоения МП-автомата всегда будут pабо-

тать. Огpаничение 1 говоpит, что пpодукции гpамматики имеют  тpе-

буемую фоpму, а огpаничение 2 нужно для того, чтобы пpи  пpимене-

нии пpавила 5 элемент таблицы содеpжал только одну пpодукцию. Та-

ким обpазом, мы пpишли к заключению, что:

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

но pаспознать с  помощью  МП-автомата  с  одним  состоянием,  ис-

пользующим pасшиpенную магазинную опеpацию  ЗАМЕНИТЬ.  Можно  го-

воpить о тождественности  автоматной  гpамматики  и  МП-автомата,

постpоенного по ней.

                            ЛЕКЦИЯ 9

            КРАТКИЕ СВЕДЕНИЯ О ГЕНЕРАТОРЕ ЛЕКСИЧЕСКИХ

                        АНАЛИЗАТОРОВ LEX

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

потоке символов. Предположим, что задано некоторое конечное  мно-

жество слов  (лексем)  в  некотором  языке  и  некоторое  входное

слово.Необходимо установить, какой элемент множества (если он су-

ществует) совпадает с данным входным словом.

     Обычно лексический анализ выполняется так называемым  лекси-

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

построения пакетного редактора или в качестве распознавателя  ди-

ректив в диалоговой программе и т.д. Наиболее  важное  применение

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

Здесь лексический анализатор выполняет  функцию  программы  ввода

данных.

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

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

дает их на дальнейшие стадии компиляции  (грамматический  разбор,

кодогенерацию и т.д.).

     Лексический анализатор распознает тип каждой лексемы и соот-

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

Си-программы могут быть выделены следующие  типы  лексем:  число,

идентификатор, оператор, ограничитель и т.д.

     Лексический анализатор должен не только выделить лексему, но

и выполнить некоторые преобразования. Например, если лексема

- число, то его необходимо  перевести  во  внутреннюю  (двоичную)

форму записи как число с плавающей или  фиксированной  точкой.  А

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

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

ресу в таблице.

     Хотя лексический анализ по своей идее прост,  тем  не  менее

эта фаза работы компилятора часто занимает  больше  времени,  чем

любая другая. Частично это происходит из-за  необходимости  прос-

матривать и анализировать  исходный  текст  символ  за  символом.

Иногда даже бывает необходимо вернуть прочитанный символ во вход-

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

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

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

либо по причине того, что одно регулярное выражение не  позволяет

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

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

ритмам анализа с  использованием  левого  и  правого  направлений

просмотра входной цепочки символов.

     Lex - частично или полностью автоматизирует процесс  написа-

ния программы лексического анализа.  Lex  -  это  программирующая

программа или генератор программ. Lex строит программу  -  лекси-

ческий анализатор на так  называемом  host-языке  (или  "главном"

языке). Это значит, что Lex-программа пишется на "языке"  Lex,  а

Lex-генератор, в свою очередь, генерирует программу  лексического

анализа на каком-либо другом языке. Данная версия Lex  генерирует

лексические анализаторы на языках Си и Ратфор (рациаональный диа-

лект Фортрана). В качестве host-языка мы будем использовать  язык

Си.

     Lex-программа имеет следующий формат:

     определения %%

     правила %%

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

     Любой  из  этих  разделов  может  быть  пустым.   Простейшая

Lexпрограмма имеет вид:

        %%

     Здесь нет никаких определений и никаких правил. Правило сос-

тоит из двух частей:

     РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ ДЕЙСТВИЕ

     По регулярным выражениям, содержащимся в левой части правил,

Lex строит детерминированный конечный автомат. Этот автомат  осу-

ществляет интерпретацию, а не компиляцию. Количество правил и  их

сложность не влияют на скорость лексического анализа, если только

правила не требуют слишком большого об'ема  повторных  просмотров

входной последовательности символов. Однако, с ростом числа  пра-

вил и их сложности растет размер конечного автомата,  интерпрети-

рующего их и, следовательно, растет размер  Си-программы,  реали-

зующей этот конечный автомат. Lex всегда, если не указано другое,

строит выходной файл с именем lexyy.c - Си-программу -  лексичес-

кий анализатор.

     Если имеется необходимость получить файл с именем,  отличным

от lexyy.c, то можно воспользоваться флагом "-t":

        % lex -t source.l > file

     По этому флагу результат поступает на стандартный вывод. Ре-

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

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

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

т.д.) и символы-операторы.

     Операторы позволяют осуществлять различные действия над  вы-

деленной цепочкой символов. Операторы также обозначаются символа-

ми.

     Обозначения символов в выражениях. Можно использовать  любой

символ. Символ можно указывать в двойных кавычках. В этом  случае

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

     . - точка означает любой символ, кроме символа новой  строки

"\n";

     \восьмеричный_код_символа - указание символа его  восьмерич-

ным кодом (как в языке Си);

     \n -  символ новой строки;

     \t -  символ табуляции;

     \b -  возврат курсора на один шаг назад;

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.