
- •1.1. Основные понятия
- •1.1.1. Трансляторы, интерпретаторы и компиляторы
- •1.1.2. Стадии работы компилятора
- •1.1.3. Построение компилятора
- •1.2. Определение формальной грамматики и языка
- •1.2.1. Первичные понятия
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в КС-грамматиках и правила построения дерева вывода
- •1.3.6. Синтаксический разбор
- •1.3.7. Левый и правый выводы
- •1.3.8. Неоднозначные и эквивалентные грамматики
- •1.4. Способы задания схем грамматик
- •1.4.1. Форма Наура-Бэкуса
- •1.4.2. Итерационная форма
- •1.4.3. Синтаксические диаграммы
- •2. Контекстно-свободные грамматики и автоматы
- •2.1. Приведенные грамматики
- •2.2. Удаление непроизводящих символов
- •2.3. Определение недостижимых символов
- •2.4. Определение бесполезных символов
- •2.5. Исключение леворекурсивных правил
- •2.6. Исключение цепных правил
- •2.7. Преобразование неукорачивающих грамматик
- •2.8. Магазинные автоматы
- •2.9. Работа магазинного автомата
- •2.10. Язык, допускаемый магазинным автоматом
- •2.11. Построение магазинного автомата
- •2.12. Пример построения автомата
- •3. Нисходящие распознаватели
- •3.1. Распознаватели и LL(K) - грамматики
- •3.2. Разделенные грамматики
- •3.3. Построение детерминированного нисходящего распознавателя
- •3.4. Множество выбора
- •3.4.1. Функции ПЕРВ, СЛЕД и множество ВЫБОР
- •3.4.2. Построение функции ПЕРВ(µ)
- •3.4.3. Построение функции СЛЕД(<B>)
- •3.4.4. Построение множества ВЫБОР
- •3.5. Слаборазделенные грамматики
- •3.6. LL(1) - грамматики
- •3.7. Построение магазинного автомата
- •3.8. Преобразование грамматик к виду LL(1)
- •3.8.1. Исключение леворекурсивных правил
- •3.8.2. Выделение общих частей
- •3.9. Восходящие распознаватели
- •4. Методы трансляции
- •4.1. Основные понятия
- •4.2. Синтаксически управляемые схемы
- •4.3. Перевод, определяемый СУ - схемой
- •4.4. Простая СУ – схема
- •4.5. Построение простой СУ - схемы
- •4.6. Транслирующие грамматики
- •4.7. Входная и выходная грамматики заданной транслирующей граммагики
- •4.8. Построение транслирующей грамматики по СУ - схеме
- •4.8.1. Бесскобочные выражения
- •4.8.1.1. Префиксная польская запись (ПрПЗ)
- •4.8.1.2. Вычисление префиксных польских записей
- •4.8.1.3. Постфиксная польская запись
- •4.8.1.4. Вычисление постфиксных записей
- •4.9. Магазинные преобразователи
- •4.9.1. Определение магазинного преобразователя
- •4.9.2. Описание работы магазинного преобразователя
- •4.9.5. Пример построения преобразователя
- •4.9.6. Порядок построения детерминированного магазинного преобразователя
- •5.1. Определение AT-грамматик
- •5.2. Пример АТ-грамматики
- •5.3. Вычисление значений атрибутов с левым выводом
- •5.4. L - атрибутные транслирующие грамматики
- •5.4.1. Форма простого присваивания АТ-грамматик
- •5.4.2. Преобразование LАТ-грамматики в LАТ-грамматику в форме простого присваивания
- •5.4.3. Расширенный вывод для АТ-грамматики
Используя функции ВЫБОР, построим соответствующие им команды искомого автомата.
( 1 ) f( s0, x , <A>) = ( s0, $ ),
( 2 ) f( s0, ( , <A> ) = ( s0, )<B> ),
( 3 ) f*( s0, ( , <B> ) = ( s0, <C><A> ), ( 3') f*( s0, x, <B> ) = ( s0, <C><A> ), ( 4 ) f( s0, + , <C> ) = ( s0, <C><A> ), ( 5 ) f*( s0, ), <C> ) = ( s0, $ ).
Учитывая, что закрывающая скобка расположена на последнем месте правила (2), построим команду
f( s0, ), ) ) = ( s0, $ ).
Кроме того, создадим команду для перехода в заключительное состояние: f( s0, $, h0 ) = ( s1, $ ).
Работу автомата проверим на примере входной цепочки ( x + x ). Получаем следующую последовательность конфигураций:
( s0, (x+x), h0<A> ) |--- |
( s0, x+x ), h0)<B> ) |--- |
( s0, x+x), h0)<C><A> ) |--- |
( s0, +x ), h0)<C>) |--- |
( s0, x), h0)<C><A> ) |--- |
( s0, ), h0)<C>)|--- |
(s0, ), h0 )) |--- ( s0, $, h0 ) |--- ( s0, $, $ ). |
|
Т.о. входная цепочка допускается построенным автоматом.
3.8. Преобразование грамматик к виду LL(1)
3.8.1. Исключение леворекурсивных правил
Возможность построения для LL(1) грамматики детерминированного автомата определяет важность этих грамматик для практических применений. Однако, при построении грамматики для заданного языка не всегда удается получить грамматику, принадлежащую классу LL(1). Это происходит, если неудачно выбраны правила грамматики, или потому, что для заданного языка принципиально нельзя построить LL(1) грамматику. В первом случае полученную грамматику можно попытаться преобразовать к LL(1) - грамматике. Имеется несколько преобразований, которые в некоторых случаях позволяют получить грамматику требуемого вида.
Первый вид преобразований заключается в исключении правил, содержащих левую рекурсию.
36
Покажем необходимость исключения таких правил.
•Допустим, что в схеме заданной грамматики имеются правила: <A> → <B> | <A><B>. По первому условию определения LL(1) грамматики функции ПЕРВ для правил с одинаковой левой частью не должны иметь одинаковых элементов, но для заданной грамматики это не так, поскольку
ПЕРВ(<A><B>) = ПЕРВ(<A>) = ПЕРВ(<B>).
Следовательно, грамматика, содержащая данные правила, не является LL(1) грамматикой.
•Рассмотрим другие правила, обеспечивающие получение такого же множества цепочек,
что и в первом случае: <A> → <A><B> | $. Первое условие выполняется, но имеем:
СЛЕД( <A> ) = ПЕРВ(<B>) и ПЕРВ(<A>) = ПЕРВ(<B>),
поскольку из A выводима $.
Эти равенства показывают, что нарушается второе условие из определения LL(1) грамматики.
Т.о. LL(1) грамматика не должна содержать леворекурсивных правил. Лучше не использовать леворекурсивные правила на этапе построения грамматики, но если они появились, то их можно исключить, пользуясь ранее описанным приемом.
3.8.2. Выделение общих частей
Второй вид преобразований, который называют выделением общих частей, применяют для устранения правил с одинаковыми левыми частями, правые части которых начинаются одинаковыми последовательностями символов.
Если заданная грамматика содержит правила
<A> → αµ1 | αµ2 | ... | αµn,
то, вводя дополнительный нетерминал <A'>, их можно преобразовать к виду:
<A> → α <A'>
<A'> → µ1 | µ2 | ... | µn.
Полученные правила могут быть использованы для построения LL(1) грамматики. Третий вид преобразования предполагает исключение аннулирующих правил и построе-
37