ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Учет составных переменных и вывод функции.Составные переменные - элементы массива, поля записей. Адрес делится на три части. Например, адрес А[ i, j ]- элемента двухмерного массива А [1.. m,1.. n ], содержит: 1) базу - адрес начала размещения всего массива; 2) смещение начала строки с номером i = (i -1)* n * size; 3) (j -1)* size смещение элемента внутри строки, где size = количество байт под один элемент. Значение базы определяется при загрузке модуля, а величина I =[(i -1)* n + j -1]* size – при трансляции, если – константы. Поэтому база хранится в базовом регистре, а I – в индексном. Для работы с массивами заводится специальный трансдуктор вычисления базового и индексного регистров. Имена? регистров записываются в стек. Для вызова функций используются индексные регистры и промежуточные переменные. Они нумеруются. Вводится ранг функции для экономии числа переменных и регистров: ранг= r, если она использует функции не выше (r -1) ранга. Ранг делается атрибутом и вычисляется при контекстном анализе. Все выражение получает максимальный ранг функций, которые в нем используются. Сначала вычисляются функции с высшим рангом: r 1 sin (x) + r 2 cos (r 1 ln (x)). 6.3. Генерация условий и условных операторов. Специфика условных операторов в том, что они используют вложенные конструкции.
Трансдуктор условного перехода состоит из четырех трансдукторов: 1) Трансдуктор if вызывает метатрансдуктор для генерации условия . 2) then записывает выходную строку, соответствующую then. 3) else генерирует строку, метки МВ и МF берутся из магазина. Если разбору подвергается выражение вида: if (a<b) & (x = y) then x:= a+b*c else y:= a+b*c, то получается следующее дерево разбора. 6.4. Генерация оператора перехода. Безусловный переход: БП 0, Метка, 0. Нет проблем, если Метка=const. С любым блоком программы связаны действия по инициализации и выходу. Переход с возвратом: ВП 0, М1, М2 (по адресу М2 генерируется команда возврата). Фрагменты статически нумеруются еще в контекстном анализе, и все метки получат номер фрагмента. При переходе на метку из другого фрагмента вызывается процедура завершения блока. Генерация операторов цикла. For i:=A to C step B do S; Оператор цикла м.б. записан с помощью условного оператора. Требуется 4 трансдуктора: начала цикла, элементов заголовка цикла, начала тела Ц, конца тела Ц. Трансдуктор начала цикла запускается при встрече с for, заводит магазин, метки, связанные с циклом, параметр цикла. Трансдуктор элементов заголовка цикла занимается выражениями. Трансдуктор начала тела: запускается при встрече с началом тела цикла. Трансдуктор конца цикла: вызывается при встрече конца цикла. Реально фактически всегда В=const, тогда генерировать код операции в зависимости от знака В, не вычисляя sign и *. Универсальный трансдуктор.? Пусть в теле цикла есть переменная с индексом а[i, j], расположенная в памяти: а[1,1],...,а[1,n],а[2,1],...,а[n,n] и нужно найти сумму диагональных элементов: S=S+а[i,i]. Тогда делаем цикл по памяти с шагом (n +1)´ количество байт. Для переиндексации нужно: 1) индексные параметры зависят только от параметров цикла, 2) значения самих параметров цикла в теле цикла не менялись. Если индексов регистров не хватает, то быстрая память используется для самых внутренних циклов. Не нашли, что искали? Воспользуйтесь поиском:
|