- •Вопрос 1
- •Определение 1.3. Цепочка, которая не содержит ни одного символа, называется пустой цепочкой и обозначается .
- •Определение 1.13. Цепочка , для которой существует вывод s*, называется сентенциальной формой или сентенцией в грамматике .
- •Вопрос 2
- •Вопрос 3
- •Расширение допускает единственное -правило вида s, но в этом случае начальный символ грамматики s не должен встречаться в правых частях правил.
- •Вопрос 4
- •3.1.2 Дерево разбора
- •Вопрос 5
- •Вопрос 6
- •Вопрос 7
- •Вопрос 8
- •Существуют следующие три способа представления функции переходов.
- •Вопрос 9 Алгоритм 2.4. Построение ка по регулярной грамматике.
- •Выход: ка .
- •Вопрос 10
- •Алгоритм 2.1. Преобразование нка в дка.
- •Вопрос 11
- •Алгоритм 2.2. Устранение недостижимых состояний ка.
- •Алгоритм 2.3. Объединение эквивалентных состояний ка.
- •Вопрос12
- •3.2.1 Проверка существования языка грамматики
- •3.2.2 Удаление бесполезных символов грамматики
- •Алгоритм 3.2. Устранение нетерминалов, не порождающих терминальных строк. Вход: кс-грамматика .
- •Алгоритм 3.3. Устранение недостижимых символов грамматики. Вход: кс-грамматика .
- •Определим множество достижимых символов z грамматики g, т.Е. Множество:
- •Вопрос13
- •3.2.3 Устранение -правил грамматики Алгоритм 3.4. Устранение -правил. Вход: кс-грамматика .
- •3.2.4 Устранение цепных правил Алгоритм 3.5. Устранение цепных правил. Вход: кс-грамматика .
- •Вопрос 14 Алгоритм 3.6. Устранение левой факторизации правил. Вход: кс-грамматика .
- •Алгоритм 3.7. Устранение прямой левой рекурсии. Вход: кс-грамматика .
- •Вопрос 15
- •Вопрос 16 Алгоритм 3.9. Построение мп-автомата по кс-грамматике.
- •Вопрос 17
- •Вопрос 18
- •18. 3.4.1 Рекурсивный спуск
- •Теорема 3.1. Достаточные условия применимости метода рекурсивного спуска.
- •Вопрос 19
- •Вопрос 20
- •Вопрос 21
- •21. Функционирование распознавателя цепочек для ll(1)-грамматик.
- •Вопрос 22
- •Вопрос 23 Алгоритм 3.16. Построение множеств l(a) и r(a).
- •Вопрос 24
- •Вопрос 26
- •Вопрос 27
- •Вопрос28
- •Вопрос 29
- •Вопрос 30
- •Вопрос 31
- •Вопрос 32. Определение 4.1. Транслятор – это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке.
- •Вопрос 33 Общая схема работы компилятора
- •Вопрос 34 ЛекАнализ программы
- •Вопрос 35
- •Вопрос 36
- •Вопрос 37
- •Вопрос 38
- •Вопрос 39
- •Вопрос 40
- •Вопрос 41 Свертка объектного кода программы.
- •Вопрос 42
- •Вопрос 43
- •Вопрос 44
- •Вопрос 45 Схемы компиляции
- •Вопрос 46
- •Вопрос 47
- •Вопрос 48
- •Вопрос 49
- •Вопрос 50
Вопрос 36
Определение 4.7. Тетрады - это запись операций в форме из четырех составляющих: операции, двух операндов и результата операции.
Например, тетрады могут выглядеть так:
<операция>(<операнд1>, <операнд2>, <результат>).
Каждая тетрада в последовательности вычисляется так: операция, заданная тетрадой, выполняется над операндами и результат ее выполнения помещается в переменную, заданную результатом тетрады.
Определение 4.8. Триады – это запись операций в форме из трех составляющих: операция и два операнда.
Например, триады могут иметь вид:
<операция>(<операнд1>, <операнд2>).
Особенностью триад является то, что один или оба операнда могут быть ссылками на другую триаду в том случае, если в качестве операнда данной триады выступает результат выполнения другой триады. Каждая триада в последовательности вычисляется так: операция, заданная триадой, выполняется над операндами, а если в качестве одного из операндов (или обоих операндов) выступает ссылка на другую триаду, то берется результат вычисления той триады. Результат вычисления триады хранится во временной памяти.
Если какой-то из операндов в тетраде или триаде отсутствует, то он опускается или заменяется пустым операндом (в зависимости от принятой формы записи и ее реализации). Результат вычисления тетрады никогда опущен быть не может, иначе тетрада теряет смысл.
Тетрады и триады представляют собой линейную последовательность команд. При вычислении выражения, записанного в форме тетрад или триад, они вычисляются одна за другой последовательно. Порядок их вычисления может быть изменен, если допустить наличие тетрад и триад специального вида, например, вызывающих безусловный переход или переход по условию.
Линейную последовательность тетрад или триад проще преобразовывать в последовательность команд результирующей программы, чем синтаксические деревья. В отличие от команд ассемблера, тетрады и триады являются машинно-независимой формой внутреннего представления программы.
Тетрады требуют больше памяти для своего представления, чем триады. Триады, в отличие от тетрад, явно отражают взаимосвязь операций между собой. Возможны сложности с преобразованием тетрад в машинный код, так как они плохо отображаются в двухадресные команды ассемблера и машинные коды.
В отличие от тетрад, триады требуют разработки алгоритма, отвечающего за распределение памяти, необходимой для хранения промежуточных результатов вычисления, так как временные переменные для этой цели не используются.
Пример 4.4. Дано арифметическое выражение X:=Y/2-Z+X*5.
Выражение, записанное в виде тетрад, будет иметь вид:
/ (Y, 2, T1);
- (T1, Z, T2);
* (X, 5, Т3);
+ (Т2, Т3, Т4);
:= (X, Т4, ).
Идентификаторы Т1,…,Т4 обозначают временные переменные, используемые для хранения результатов вычисления тетрад. В последней тетраде, которая требует только одного операнда, в качестве второго операнда выступает пустой операнд.
То же выражение, записанное в виде триад, будет иметь вид:
1) / (Y, 2);
2) - (^1, Z);
3) * (X, 5);
4) + (^2, ^3);
5) := (X, ^4).
Здесь знак ^ означает ссылку операнда одной триады на результат другой.
