Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы трансляции.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.99 Mб
Скачать

Построение мп-автомата.

По заданной КС-грамматике, генерирующей некоторый язык , можно построить МП-автомат, принимающий этот язык. Будем строить автомат, выполняющий левосторонний разбор. Такой автомат должен строить вывод строки, начиная с аксиомы грамматики. Используем стек для размещения текущей сентенциальной формы, первоначально это аксиома. Очередная сентенциальная форма получается заменой верхнего нетерминала стека. Пусть, кроме того, автомат обладает только одним состоянием и принимает входную строку опустошением магазина. Описанный МП-автомат можно построить следующим образом.

Вход: КС-грамматика .

Выход: МП-автомат такой, что .

  1. Положить

  2. Для каждого правила вида , где , сформировать магазинную функцию вида . Эти функции предписывают замещать нетерминал в вершине стека по правилу грамматики.

  3. Для каждого сформировать магазинную функцию вида , которая выталкивает из стека символ, совпадающий с входным, и перемещает читающую головку. Эти функции обеспечивают опустошение стека.

Построение расширенного мп-автомата.

Будем строить расширенный МП-автомат, который выполняет правосторонний разбор входной строки, образованной из терминалов грамматики. Стек отведем для левой части текущей сентенциальной формы. Сначала это особый магазинный символ, маркер пустого стека (обозначим #). На каждом шаге автомат по правилу грамматики замещает нетерминалом строку верхних символов стека или дописывает в вершину входной символ. Помимо единственного текущего состояния, автомат имеет одно заключительное состояние. В этом состоянии стек пуст.

Вход: КС-грамматика .

Выход: Расширенный МП-автомат такой, что .

  1. Положить

  1. Для каждого правила вида , где , сформировать магазинную функцию вида , предписывающую заменять правую часть правила в вершине стека нетерминалом из левой части, независимо от текущего символа входной строки.

  2. Для каждого сформировать магазинную функцию вида , которая помещает символ входной строки в вершину стека, если там нет правой части правила, и перемещает читающую головку.

  3. Предусмотреть магазинную функцию для перевода автомата в заключительное состояние .

Параграф 5. Нисходящие распознаватели языков.

Пункт 1. Стратегия нисходящего анализа.

В основе стратегии нисходящего анализа лежит левосторонний разбор строки языка. Исходной сентенциальной формой является аксиома грамматики, а целевой – заданная строка языка. На каждом шаге разбора правило грамматики применяется к самому левому нетерминалу сентенциальной формы. Может возникнуть основная проблема нисходящего анализа - неоднозначность выбора правила грамматики. Эта проблема решается привлечением группы очередных символов входной строки.

Пример 1. Дана КС-грамматика , где , и множество состоит из шести правил:

1) 2) 3) 4) 5) 6) .

Требуется выполнить нисходящий анализ строки . Обратим внимание, что каждый нетерминал грамматики имеет по два правила, но они начинаются с разных терминалов. Этим свойством грамматики будем пользоваться при выборе правила, сопоставляя очередной символ входной строки с головным символом правой части. Построим дерево разбора:

Сначала в стек помещается аксиома , а читающая головка указывает на левый символ строки. На каждом шаге работы распознавателя выполняется следующая работа:

    1. читается символ входной строки (терминал);

    2. если в вершине стека находится такой же терминал, то он удаляется из стека; читающая головка перемещается на одну позицию вправо; шаг завершается;

    3. если в вершине стека находится нетерминал, то он замещается правой частью соответствующего правила, начинающейся с прочитанного терминала; шаг завершается;

    4. если во входной строке больше нет символов и стек пуст, то строка принята; анализ завершен;

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

Процесс нисходящего анализа сведем в таблицу:

№ п/п

Входная строка

Стек

Правило

1

1

2

3

3

4

5

3

6

7

4

8

9

10

11

-грамматиками называются КС-грамматики со следующими свойствами:

  1. правила грамматики имеют вид , где .

  2. альтернативные правые части правил, определяющие один и тот же нетерминал, начинаются с разных терминалов.

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

Пункт 2. LL(k)-грамматики.

В КС-грамматиках можно выделить обширное подмножество грамматик, обладающих сходными свойствами и обеспечивающих детерминированный нисходящий разбор строк порождаемых языков. Это подмножество называют LL(k)-грамматиками, причем буквы L, L, k означают следующее:

  • L – просмотр строки языка осуществляется слева направо (левосторонний просмотр);

  • L – строится левосторонний вывод (левосторонний разбор);

  • K – используется k предварительно просматриваемых символов входной строки для выбора очередного правила грамматики. Чем больше k, тем более сложные языки описывает грамматика и тем сложнее распознаватели этих языков.

В большинстве практических приложений можно ограничиться LL(1)-грамматиками. S-грамматики являются частным случаем LL(1)-грамматик. В LL(1)-грамматиках головными символами в правых частях правил наряду с терминалами могут быть и нетерминалы.

КС-грамматику называют LL(1)-грамматикой, если не пересекаются множества направляющих символов для правил, определяющих один и тот же нетерминал грамматики.

Обозначим - множество направляющих символов для правила , где и . Формально .

Множество называют множеством символов-предшественников для строки и определяют так:

.

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

Множество назовем множеством символов-последователей для нетерминала и определим его так:

Эта запись означает, что - это множество терминалов, которые могут появляться в сентенциальных формах непосредственно за нетерминалом . Напомним, что сентенциальная форма – это любое порождение начального символа грамматики. Множество принимается во внимание только в том случае, если существует вывод (то есть вывод пустой строки из правой части правила для нетерминала ).

Проверку принадлежности КС-грамматики классу LL(1)-грамматик можно выполнить на основе определения LL(1)-грамматики, то есть путем вычисления пересечения множеств направляющих символов для альтернативных правых частей правил нетерминала. Кроме того имеются признаки, по которым достаточно просто установить, что заданная КС-грамматика не является LL(1)-грамматикой. К таким признакам относятся:

  • одинаковые головные символы в альтернативных правых частях правил для нетерминала, например или ;

  • наличие левой рекурсии (прямой или косвенной), например .

Параграф 6. Восходящие распознаватели языков.

Пункт 1. Стратегия восходящего анализа.

В основе стратегии восходящего анализа лежит правосторонний разбор. Напомним: правосторонний разбор строки – это обратная последовательность правил грамматики, используемых для построения правостороннего вывода этой строки. Исходной сентенциальной формой разбора является заданная строка языка, а целевой сентенциальной формой – аксиома грамматики. Таким образом, вывод строится, начиная с его конца, а соответствующее дерево разбора «растет» от листьев к корню и слева направо.

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

Процесс выполнения операций «перенос» и «свертка» продолжается вплоть до получения аксиомы грамматики в результате последней свертки. В этом случае говорят, что распознаватель (МП-автомат) принял входную строку. Если аксиома не достигнута, то входная строка не принадлежит языку, для которого создан распознаватель.

Главной проблемой восходящего анализа является именно обеспечение однозначности определения строки в вершине стека для Светки к нетерминалу. Еще одна трудность возникает, когда грамматика содержит правила с одинаковыми правыми частями. Как и в случае нисходящего анализа, проблемы восходящего анализа решаются путем применения грамматик с особыми свойствами.

Пункт 2. -грамматики.

Имеется большой спектр грамматик, для которых всегда возможен детерминированный восходящий анализ типа «перенос-свертка». Эти грамматики обладают сходными свойствами и объединяются общим наименованием: -грамматики. В записи буквой обозначен левосторонний порядок чтения распознаваемой строки. Буква означает выполнение правостороннего разбора. Число указывает количество очередных символов входной строки, которые распознаватель дополнительно просматривает для принятия решения о свертке. Для построения детерминированных восходящих распознавателей языков программирования достаточно, чтобы грамматика обладала свойствами -грамматик.

В стратегии восходящего анализа ключевое место занимает понятие основа. Дадим его определение.

Пусть - КС-грамматика, - правый вывод в ней, причем .

Говорят, что правовыводимую сентенциальную форму можно свернуть слева к правовыводимой сентенциальной форме с помощью правила . Строка в данной сентенциальной форме называется ее основой. Справа от основы всегда располагается терминальная строка.

КС-грамматика будет LR(1)-грамматикой, если для произвольного правостороннего вывода , где , в каждой правовыводимой сентенциальной форме , читая ее слева направо, можно выделить основу и определить, каким нетерминалом ее можно заменить, используя для этого не более одного символа справа от основы.

Любая -грамматика является однозначной.

Пункт 3. Иерархия КС-грамматик.

Установлена иерархия КС-грамматик, гарантирующих существование достаточно простых детерминированных распознавателей, пригодных для языков программирования.

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

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

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

Современная технология производства компиляторов обеспечивает автоматизацию процесса преобразования грамматики и разработки анализаторов. Если отдельные свойства языка не удается описать правилами грамматики выбранного класса, то они обрабатываются особым образом в дополнение к основному алгоритму распознавателя. Синтаксические анализаторы многих компиляторов для языка Паскаль строились на основе грамматики . В настоящее время выбор метода определяется главным образом наличием хорошего доступного генератора анализаторов, поскольку именно он составляет основу компилятора компиляторов.

Параграф 7. Простое предшествование.

Пункт 1. Грамматика простого предшествования.

Такие грамматики являются подмножеством -грамматик. Они позволяют выделить основу правовыводимой сентенциальной формы с помощью особых отношений, которые называют отношениями предшествования Вирта-Вебера. Отношения предшествования определены на множестве , то есть на множестве символов словаря грамматики.

Для выделения основы используют 3 вида отношений, которые обозначают и называют «меньше с точкой», «равно с точкой» и «больше с точкой» соответственно. Если - правовыводимая сентенциальная форма и - основа, то , , и существуют следующие отношения предшествования между символами сентенциальной формы:

  • Между всеми смежными символами строки выполняется отношение либо , либо ;

  • Между последним символом строки и первым символом основы (строки ) выполняется отношение ;

  • Между смежными символами основы выполняется отношение ;

  • Между последним символом основы и первым символом строки выполняется отношение .

Грамматикой предшествования называют КС-грамматику, обладающую свойствами:

    1. грамматика – приведенная (не содержит -правил, бесполезных символов и циклов);

    2. для каждой пары символов словаря грамматики выполняется не более одного отношения предшествования;

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

Грамматики, обладающие свойством 3, называются обратимыми.

Пункт 2. Вычисление матрицы предшествования.

Отношения предшествования вычисляют и хранят в квадратной матрице. Ее называют матрицей предшествования. Рассмотрим алгоритм построения матрицы предшествования, основанный на использовании множества самых левых символов и множества самых правых символов относительно нетерминала .

, .

Эти формулы можно преобразовать в более удобные для программирования эквивалентные рекурсивные формулы:

,

, где .