normDDr (1158429), страница 12
Текст из файла (страница 12)
error code 223 'incorrect parameter of part : index' <error context>' with two conditions'
error code 225 'incorrect parameter of part :variable'<error context>' has not index’ <error context>
error code 226 'incorrect parameter of part : domain of operator ASSUME has not index '<error context>' of variable’<error context>
error code 229 'incorrect parameter of part : incorrect condition’ <error context>' on domain’'
error code 230 'incorrect parameter of part : incorrect index’ <error context>' in condition’'
error code 231 'incorrect parameter of part : incorrect variable’ <error context>' in condition on index ’ <error context>
error code 233 'incorrect parameter of part : incorrect condition on index’ <error context>' of variable’'<error context>
Функция obrraz формирует значение поля <parameter-dependencies> Таблицы функциональных зависимостей (Table of functional dependencies) из списка зависимостей param-dependency, построенных функцией paramt.
Функция zapf заносит информацию об операторе в Таблицу функциональных зависимостей (Table of functional dependencies) и тело оператора в Таблицу тел операторов (Table of operators body).
5.3.6Обработка итерации (Функция kbiter)
Осуществляет анализ и обработку iteration. Синтаксис в языке Норма:
iteration :
head-of-iteration
[ boundary-value ]
initial-value
body-of-iteration
exit-condition
end-iteration
Функция получает очередное описание итерации, представленной в Списке итераций (List of iterations), вызывая функцию kb1.
Общая структура управления функции kbiter приведена на следующей схеме.
k
biter iterzag itergr iternzn itpolag itexit
kvo1it kvo1it kvo1it
5.3.6.1Дополнительные структуры данных для обработки iteration
При обработке итерации используются следующие вспомогательные структуры данных.
Стек ite, вершина которого содержит <iteration number> обрабатываемой iteration. Используется при обработке вложенных iteration.
Признак env, определяющий тип окружения: env =’B’ при обработке boundary-value, env =’H’ при обработке initial-value, env =’P’ при обработке body-of-iteration.
Таблица итерируемых переменных (Table of iterated variables) предназначена для хранения имен итерируемых переменных и соответствующих им имен переменных-результатов (с предыдущего и текущего шагов итерации). Используется для оптимизации обработки итерируемых переменных. Структура строки Таблицы итерируемых переменных (Table of iterated variables):
| iterated variable name | first result variable name | second result variable name |
Таблица операторов переписи (Table of copy operators) предназначена для хранения информации о дополнительных операторах, генерируемых компилятором при реализации конструкции iteration.
Для хранения значений каждой итерируемой переменной в генерируемой компилятором Fortran-программе вводятся переменные-результаты (first result variable - для хранения значений с шага итерации n, и second result variable - для хранения значений с шага итерации n-1). При завершении очередного шага итерации (очередного витка цикла в Fortran-программе) необходимо обеспечить перепись значений second result variable в first result variable. Для этой цели компилятор генерирует оператор переписи, <statement number> которого и хранится в Таблице операторов переписи (Table of copy operators). После определения компилятором порядка выполнения операторов операторы переписи размещены в соответствующем месте Fortran-программы.
Структура строки Таблицы операторов переписи (Table of copy operators):
| iteration number | <statement number><ref-on-body> | … | <statement number><ref-on-body> |
<statement number>::=<integer>
<ref-on-body>::=<reference in Table of operators body >
5.3.6.2Функция iterzag - обработка head-of-iteration
Синтаксис в языке Норма:
head-of-iteration :
ITERATION list-iterated-element ON name-iteration-index .
iterated-element :
name-variable [ ( list-name-result ) ]
Функция заносит в стек ite <iteration number>, анализирует head-of-iteration, осуществляет описание в Таблице имен (Symbol table) переменных из list-name-result.
Функция фиксирует ошибку:
error code 53 'incorrect list element of iterated variables'<error context>
5.3.6.3Функция itergr - обработка boundary-value
Устанавливает env =’B’ и вызывает функцию kvo1it обработки Норма-предложений, входящих в iteration.
5.3.6.4Функция iternzn - обработка initial-value
Устанавливает env =’H’ и вызывает функцию kvo1it обработки Норма-предложений, входящих в iteration.
5.3.6.5Функция itpolag - обработка body-of-iteration
Устанавливает env =’P’ и вызывает функцию kvo1it обработки Норма-предложений, входящих в iteration.
5.3.6.6Функция kvo1it - обработка Норма-предложений, входящих в iteration
Функция kvo1it аналогична функции kvopr1 (см. п. 5.3.5)
scopit
k
vo1it kvit
kvo2i
Функция kvopr1 в зависимости от типа оператора вызывает функцию scopit (обработка scalar-operator, аналог функции scop (см. п. 5.3.5.1)), kvit (обработка operator-ASSUME, аналог функции opv6 (см. п.5.3.5.2)) или kvo2i (обработка call-part в operator-ASSUME или вне operator-ASSUME, аналог функции kvo2 (см. п.5.3.5.3)).
Эти функции отличаются от своих аналогов действиями, которые необходимо выполнить при завершении обработки оператора.
В случае, когда вычисляемая в операторе переменная не является итерируемой переменной, дополнительных действий не требуется.
В случае, когда вычисляемая в операторе переменная является итерируемой переменной в текущей итерации, дополнительные действия связаны с согласованием iterated variable name и result variable name.
Для операторов, заданных в initial-value, необходимо заменить в левой части оператора iterated variable name на result variable name и занести информацию в Таблицу функциональных зависимостей (Table of functional dependencies), в Таблицу ‘Что-вычисляется’ (What-compute table) и в Таблицу ‘Где-вычисляется’ (Where-compute table) с учетом этой замены.
Для операторов из body-of-iteration функцией perzap генерируется оператор переписи для итерируемой переменной. Функция perzap заносит текст оператора в виде последовательности лексем в группу g Cписка Норма предложений (List of Norma statements) и в Таблицу тел операторов (Table of operators body), а также заносит информацию об операторе в Таблицу операторов переписи (Table of copy operators).
5.3.6.7Функция itexit - обработка exit-condition
Синтаксис в языке Норма:
exit-condition :
EXIT WHEN log-expression
Конструкция exit-condition рассматривается как scalar-operator с пустой левой частью.
Функция анализирует log-expression, вызывая функции b1 и a (см. п. 5.3.5.1), заносит информацию (вызывая функцию zapf) в Таблицу функциональных зависимостей (Table of functional dependencies) и тело log-expression в Таблицу тел операторов (Table of operators body).
Вершина стека ite очищается.
5.4Построение графа информационных зависимостей (Data dependencies graph builder).
Функция graf является входной точкой блока Data dependencies graph builder и вызывается функцией endlex блока Part unit scanner в случае, если на предыдущих этапах трансляции не было обнаружено ошибок (т.е. счетчик ошибок osh=0).
Блок Data dependencies graph builder состоит из двух основных компонентов:
-
Построение DDG.
Функции: построение графа информационных зависимостей (DDG), входная точка graf.
-
Построение RDDG.
Функции: построение редуцированного графа информационных зависимостей (RDDG), входная точка mssg.
Data dependencies graph builder consists of two main blocks:
Структура управления блока Data dependencies graph builder:
g
raf mssg pord
Функция pord - входная точка блока Data dependencies graph analyser
5.4.1Построение DDG
Входная точка блока DDG constructor - функция graf. Общая структура управления функции graf приведена на следующей схеме.
g
raf reassign strdep pre posl test
Функция reassign проверяет свойство однократного присваивания (single assignment): любая переменная может вычисляться в каждой точке области ее определения не более одного раза. Исходной информацией дл япроверки этого свойства служит Таблица ‘Где-вычисляется’ (Where-compute table). Для каждой строки этой таблицы выполняются следующие действия.
Если строка соответствует переменной скалярного типа, то эта строка должна содержать ровно одну запись вида
| statement number | name-domain |
Если строка соответствует переменной, определенной на области, то осуществляется проверка пустоты пересечения всех <name-domains>, указанных в этой строке.
Функция фиксирует ошибку:















