- •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. Расширенный вывод для АТ-грамматики
части соответствующего правила грамматики. Следовательно, автомат, последовательно заменяя нетерминалы, появляющиеся в вершине магазина, строит в магазине левый вывод входной цепочки, удаляя полученные терминальные символы, совпадающие с символами входной цепочки. Это означает, что каждая цепочка, которая может быть получена с помощью левого вывода в грамматике Г, допускается построенным автоматом М.
2.12. Пример построения автомата
Процедуру построения автомата рассмотрим на примере грамматики:
Г1. 9: R={<E> → <E> + <T> | <T>,
<T> → <T> * <F> | <F>, <F> → ( <E> ) | a}.
Для искомого автомата имеем:
M3: P = { a, +, *, ), ( }, H = {<E>, <T>, <F>, a, +, *, ), h0, ( }, S = { s0 }, F = {s0}
Для всех правил грамматики строим команды типа (1):
(1)f0(s0, ε, <E>) = {(s0, <T> + <E>), (s0, <T>)},
(2)f0(s0, ε, <T>) = {(s0, <F> * <T>), (s0, <F>)},
(3)f0(s0, ε, <F>) = {(s0, )<E>( ), (s0, a)},
Для всех терминальных символов строим команды типа (2):
(4)f( s0, a, a ) = ( s0, $ ),
(5)f( s0 , + , + ) = (s0 , $ ),
(6)f( s0 , * , * ) = (s0 , $ ),
(7)f( s0 , ( , ( ) = (s0 , $ ),
(8)f( s0 , ) , ) ) = (s0 , $ ),
Для перехода в конечное состояние построим команду:
(9) f*(s0 , ε , h0) = ( s0 , $ ).
Построенный автомат является недетерминированным.
Начальная конфигурация для цепочки a + a * a имеет вид: (s0, a+a*a , h0<E>).
26
Следующая последовательность тактов работы построенного автомата, показывает, что заданная цепочка допустима.
(s0, a + a * a, h0<E>) |-- (s0 , a + a * a , h0<T>+<E>) |--
(s0 , a + a * a, h0<T>+<T>) |-- (s0 , a + a * a, h0<T> + <F>) |-- (s0 , a + a * a, h0<T> + a) |-- (s0 , + a * a , h0<T> +) |--
(s0 , a * a, h0<T>) |-- (s0, a * a, h0<F> * <T>) |-- (s0, a * a, h0<F> * <F>) |-- (s0, a * a, h0<F> * a) |-- (s0, * a, h0<F> *) |-- (s0, a, h0<F>) |--
(s0 , a, h0a) |-- (s0 , $ , h0) |-- (s0 , $ , $).
Последовательность правил, используемая построенным автоматом, соответствует левому выводу входной цепочки:
<E> <E> + <T> <T> + <T> <F> + <T> a + <T> a + <T> * <F> a + <F> * <F> a + a * <F> a + a * a
По такому выводу можно построить дерево. Построение будет происходить сверху вниз, т.е. от корня дерева к листьям.
Такой способ построения дерева по заданной цепочке называется нисходящим. Магазинные автоматы часто называют распознавателями.
Учитывая характер построения вывода в магазине, автоматы рассмотренного типа назы-
27