- •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. Расширенный вывод для АТ-грамматики
строение обеспечивает включение во входную цепочку выходных символов цепочки, порождаемой СУ-схемой. Следовательно, каждый шаг вывода в Т - грамматике будет добавлять к выводимой цепочке те же символы, что и СУ - схема добавляет к выходной цепочке.
Рассмотрим пример построения Т - грамматики по СУ - схеме Т4.4.
Используя фигурные скобки для представления выходных символов и выполняя преобразование, получаем:
R = {<A> → x{x}, <A> → (<B>), <B> → <A><C>,
<C> → +<A>{+}<C>, <C> → $ }.
Перевод цепочки (( x + x ) + x) с применением правил построенной грамматики может быть получен с помощью следующего вывода:
<A> (<B>) (<A><C>) ((<B>)<C>) ((<A><C>)<C>) ((x{x}<C>)<C>) ((x{x} +<A>{+}<C>)<C>) ((x{x} + x{x}{+}<C>)<C>) ((x{x} + x{x}{+})<C>) ((x{x} + x{x}{+}) + <A>{+}<C>) ((x{x} + x{x}{+}) + x{x}{+}<C>) ((x{x}+x{x}{+})+x{x}{+}).
Исключая из полученной цепочки вначале выходные, а затем входные символы, получаем выводимую пару
(((x + x) + x), {x}{x}{+}{x}{+}), т.е. (((x + x) + x), xx + x +)
которая совпадает с результатом вывода в заданной СУ - схеме.
4.8.1. Бесскобочные выражения
Обычные арифметические выражения, содержащие скобки, в которых знак операции располагается между операндами называются инфиксными выражениями. Порядок выполнения действий в таких выражениях определяется старшинством операций и скобками. Вычисление и компиляция таких выражений требует предварительного анализа с целью выявления порядка выполнения операций. Существуют формы записи арифметических выражений без скобок, в которых порядок действий задается порядком знаков операций в выражении. Такие формы записи называются польской или бесскобочной записью. Польская запись может быть префиксной, в которой знак операции предшест-
46
вует операндам, и постфиксной, в которой знак операции следует за операндом. Вычисление и компиляция бесскобочных выражений проще, чем выражений со скобками, поскольку операции выполняются в порядке описания и предварительный анализ не нужен.
4.8.1.1. Префиксная польская запись (ПрПЗ)
Определение. 1) Если инфиксное выражение Е представляет собой один операнд а, то ПрПЗ выражения Е будет а.
2) Если инфиксное выражение имеет вид Е1*Е2, где * - знак операции, а Е1 и Е2 инфиксные выражения для операндов, то ПрПЗ этого выражения будет*Е1'E2',
где E1', E2' - ПрПЗ выражений Е1 и Е2.
3) Если (Е) есть инфиксное выражение, то ПрПЗ этого выражения будет ПрПЗ Е
Это определение задает порядок построения ПрПЗ заданного инфиксного выражения. Например для выражения ( a + b ) * ( c – d ) построение ПрПЗ можно выполнить следующим образом. Обозначим операнды первой выполняемой операции:
E1 = (a + b) и E2 = (c - d).
Согласно определению префиксная запись выражения Е1 * Е2 - это * E1'E2', где Е1', Е2' - префиксные записи выражений Е1 и Е2. Выполнив построение префиксных записей для этих выражений,
E1' = +ab, E2' = -cd,
получим:
*+ ab - cd
4.8.1.2. Вычисление префиксных польских записей
Вычисление ПрПЗ можно представить следующим образом:
1.Просматриваем выражение слева направо, пока не найдем знак операции, за которым следуют два операнда.
2.Выполняем операцию и результат записываем на место выбранной тройки.
3.Повторяем пункт (1), пока не получим вместо выражения один результат. Вычисление префиксного выражения можно представить в виде:
47
1.*+ab-cd
2.*R1-cd
3.*R1R2
4.R3
Вычисление таких выражений на практике реализуется с использованием магазина.
4.8.1.3. Постфиксная польская запись
Определение. 1. Если инфиксное выражение Е представляет собой один операнд а, то ПоПЗ выражения Е будет а.
2.Если инфиксное выражение имеет вид Е1*Е2, где * - знак операции, E1, E2 - инфиксные выражения для операндов,
то ПоПЗ этого выражения будет - Е1'E2'*, где Е1',E2' - постфиксные выражения Е1,Е2.
3.Если (Е) есть инфиксное выражение, то постфиксная запись этого выражения будет постфиксная запись Е.
Построим ПоПЗ выражения
( a + b ) * (c – d ).
Обозначая операнды внешней операции
E1 = ( a + b ) и E2 = ( c – d ),
найдем постфиксные записи операндов, которые имеют вид:
E1' = ab + и E2' = cd -.
Подставляя полученные постфиксные записи в выражение
E1'E2'*,
окончательно получаем:
ab + cd - *.
4.8.1.4. Вычисление постфиксных записей
Вычисление постфиксной записи выражения можно представить следующим образом.
1.Просматриваем выражение слева направо пока не найдем два стоящих рядом операнда, за которыми следует знак операции.
2.Выполняем операцию и записываем результат вместо выбранных операндов и операций.
48
3. Повторяем пункт (1) пока не получим вместо выражения единственный результат. Вычисление постфиксного выражения можно представить в виде:
1.ab+cd-*
2.R1cd-*
3.R1R2*
4.R3
На практике вычисление постфиксных выражений реализуется с применением магазина. В этом случае вычисления выполняются по следующим правилам.
1.Прочитать очередной символ входной цепочки.
2.Если входной символ - операнд, то выполнить его запись в магазин.
3.Если входной символ - оператор,то прочитать два операнда из магазина, выполнить
операцию и результат занести в магазин как операнд.
4. Повторять п.1, пока во входной цепочке не будут прочитаны все символы. Последовательность вычислений продемонстрируем на примере входной цепочки
ab+cd-*
и изобразим ее в виде следующей схемы:
|
Вход |
Магазин |
Операция |
|
ab+cd-* |
|
|
1. |
b+cd-* |
a |
|
2. |
+cd-* |
ab |
|
3. |
cd-* |
R1 |
a+b=R1 |
4. |
d-* |
R1c |
|
5. |
-* |
R1cd |
|
6. |
* |
R1R2 |
c-d = R2 |
7. |
$ |
R3 |
R1*R2 = R3 |
49