• для работы с триадами уже имеются необходимые структуры данных (соответствующие программные модули созданы при выполнении лабораторной работы № 4);
• алгоритмы оптимизации, которые предполагается использовать, основаны на внутреннем представлении программы в форме триад.
В данной работе создается простейший компилятор, поэтому другие формы внутреннего представления программы не понадобятся. Результирующая программа будет порождаться на языке ассемблера на самой последней стадии компиляции, ее внутреннее хранение и обработка не предусмотрены.
Описание используемого метода порождения результирующего кода
Для порождения результирующего кода будет использоваться рекурсивный алгоритм порождения списка триад на основе дерева синтаксического разбора. Схемы СУ-перевода для такого алгоритма были рассмотрены ранее (при выполнении лабораторной работы № 4).
В данном входном языке мы имеем следующие типы операций:
• логические операции (or, xor, and и not);
• операции сравнения (<, >, = и <>);
• арифметические операции (сложение, вычитание, унарное отрицание);
• оператор присваивания;
• полный условный оператор (if… then … else …) и неполный условный оператор (if… then…);
• оператор цикла с предусловием (while(…)do…);
• операции, не несущие смысловой нагрузки, а служащие только для создания синтаксических конструкций исходной программы (заголовок программы, операторные скобки begin…end, круглые скобки и точка с запятой).
Схемы СУ-перевода для арифметических операций (которые являются линейными операциями), оператора присваивания и условных операторов были построены при выполнении лабораторной работы № 4. Здесь их повторять не будем.
Схему СУ-перевода для оператора цикла с предусловием построим аналогично схемам СУ-перевода для условных операторов (которые были приведены на рис. 4.1 в лабораторной работе № 4).
Генерация кода для цикла с предусловием выполняется в следующем порядке:
• Порождается блок кода№ 1, вычисляющий логическое выражение, находящееся между лексемами while ((первая и вторая нижележащие вершины) и) (четвертая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для третьей нижележащей вершины.
• Порождается команда условного перехода, которая передает управление в зависимости от результата вычисления логического выражения:
– в начало блока кода № 2, если логическое выражение имеет ненулевое значение;
– в конец оператора, если логическое выражение имеет нулевое значение.
• Порождается блок кода № 2, соответствующий операциям после лексемы do (пятая нижележащая вершина) – для этого должна быть рекурсивно вызвана функция порождения кода для шестой нижележащей вершины.
• Порождается команда безусловного перехода в начало блока кода № 1. Схема СУ-перевода для оператора цикла с предусловием представлена на рис. 5.2.
Рис. 5.2. Схема СУ-перевода для оператора цикла с предусловием.
Таким образом, для реализации оператора цикла достаточно иметь те же типы триад, которые необходимы для реализации условных операторов:
• IF(<���операнд1>,<���операнд2>) – триада условного перехода;
• JMP(1,<���операнд2>) – триада безусловного перехода.
Смысл операндов для этих триад был описан при выполнении лабораторной работы № 4.
Отдельно следует остановиться на генерации кода для операций сравнения и логических операций. При выполнении лабораторной работы № 4 логические операции рассматривались как линейные операции и код для них строился соответствующим образом (аналогично коду для арифметических операций). Иной подход тогда не был возможен, поскольку тогда речь шла о побитовых логических операциях над целыми числами.
Однако в данном случае во входном языке логические операции выступают как операции булевой алгебры, которые выполняются только над двумя значениями: «истина» (1) и «ложь» (0). Исходными данными для них служат операции сравнения, результатом которых тоже могут быть только два указанных значения (константы типа «истина» (TRUE) и «ложь» (FALSE) во входном языке отсутствуют, но даже если бы они и были, суть дела это не меняет). При таких условиях возможно иное вычисление логических выражений, поскольку нет необходимости выполнять все операции:
Читать дальше
Конец ознакомительного отрывка
Купить книгу