normDDr (1158429), страница 11
Текст из файла (страница 11)
Кроме этого, проводится дополнительная обработка для function calls.
1) Для call-reduction-function заносится информация в дополнительную таблицу summa, строка которой имеет вид
| statement number | name-reduction-domain |
Arithm-expression, к которому применяется reduction-function, передается на обработку функции b (см. п. ). При этом в стек mom заносится name-reduction-domain.
2) Для call-external-function заносится информация в дополнительную таблицу funpol, строка которой имеет вид
| statement number | name-external function |
и дополнительную таблицу exter, строка которой имеет вид
| name-external function |
Функция b1 фиксирует ошибки:
error code 74 'incorrect scalar expressiion'<error context>
error code 315 'incorrect index of variable'<error context>
error code 317 'incorrect index of scalar'<error context>
error code 5 'value of variable'<error context>’is not in declaration domain’
error code 55 'iteration index'<error context> of variable'<error context>’has false displacement’
Функция zapf заносит информацию об операторе в Таблицу функциональных зависимостей (Table of functional dependencies) и тело оператора в Таблицу тел операторов (Table of operators body).
Функция dopkdc заносит информацию об операторе в Таблицу ‘Что-вычисляется’ (What-compute table).
Функция dopgdc заносит информацию об операторе в Таблицу ‘Где-вычисляется’ (Where-compute table).
5.3.5.2Функция opv6 - обработка operator-ASSUME
Синтаксис в языке Норма:
operator-ASSUME
FOR domain ASSUME relation { ; relation }*
relation :
name-variable-on-domain = arithm-expression
Общая структура управления функции opv6 приведена на следующей схеме.
doprg
o
pv6 mnoz doplef a b opv1 zapf
dopkdc dopgdc
Функция mnoz (см. п. 5.3.2.1) обрабатывает область оператора. Если при этом обнаружены ошибки, обработка оператора прекращается, иначе token code области оператора заносится в стек mom.
Функция doplef (см. п. 5.3.3) осуществляет проверяет допустимости переменной в левой части -operator-ASSUME.
Остальные функции обрабатывают правую часть scalar--ASSUME.
Функция a (см. п. 5.3.5.1) строит польскую запись для арифметического выражения правой части оператора.
Функция b осуществляет проверку допустимости термов арифметического выражения, представленного в польской записи. Термами могут быть scalars, arithmetical constants, domain’s parameters, indexes, function calls, variables on domain. Для термов этих типов формируется строка для записи в Таблицу функциональных зависимостей (Table of functional dependencies). Функция b аналогична функция b1 (см. п. 5.3.5.1), за исключением дополнительной обработки для терма variable on domain. Эта обработка выполняется функцией doprg.
Функция b фиксирует ошибки:
error code 75 'incorrect expression'<error context>
error code 73 'value of index '<error context>' undefined'
Функция doprg проверяет правильность использования variable on domain в operator-ASSUME. Для этого проверяются три условия:
1) индексы в индексных выражениях переменной должны соответствовать индексам области определения переменной,
2) индексы в индексных выражениях переменной должны соответствовать индексам области оператора,
3) область need-domain для переменной должна входить в область определения величины.
Кроме проверки этих условий функция восстанавливает полные индексные выражения в случае, когда некоторые индексы заданы по умолчанию.
Функция doprg фиксирует ошибки:
error code 71 'incorrect expression'<error context>
error code 311 'incorrect value of index'<error context>
error code 312 'incorrect index of variable' <error context>': '<error context>' is not integer constant’
error code 313 'incorrect index of variable' <error context>': '<error context>' is not index’
error code 314 'incorrect index of variable' <error context>': there is not sign before constant expression'
error code 315 'incorrect index of variable'<error context>
error code 316 'incorrect index of variable'<error context>': '<error context>' <0’
error code 317 'incorrect index of scalar'<error context>
error code 319 'incorrect index '<error context>' of variable '<error context> ': in ITERATION ON '
Функция opv1 обрабатывает область в случае, если эта область является conditional-domain. Из Таблицы условий (Table of conditions) выбирается логическое условие и обрабатывается функциями a и b. Информация о термах логического условия также включается в Таблицу функциональных зависимостей (Table of functional dependencies) для анализируемого оператора функцией zapf.
Функция zapf заносит информацию об операторе в Таблицу функциональных зависимостей (Table of functional dependencies) и тело оператора в Таблицу тел операторов (Table of operators body).
Функция dopkdc заносит информацию об операторе в Таблицу ‘Что-вычисляется’ (What-compute table).
Функция dopgdc заносит информацию об операторе в Таблицу ‘Где-вычисляется’ (Where-compute table).
5.3.5.3Функция kvo2 - обработка call-part
Синтаксис в языке Норма:
call-part :
COMPUTE name-part [ ( actual-parameters )]
actual-parameters :
[ list-in-parameter ] [ RESULT list-out-parameter ]
Общая структура управления функции kvo2 приведена на следующей схеме.
k
vo2 mnoz kvoc paramt obrraz zapf
dopkdc dopgdc
Функция mnoz (см. п. 5.3.2.1) обрабатывает область оператора. Если при этом обнаружены ошибки, обработка оператора прекращается, иначе token code области оператора заносится в стек mom. При обработке call-part, не входящего в operator-ASSUME, функция mnoz не вызывается и стек mom пуст.
Функция kvoc анализирует actual-parameters и вызывает функцию paramt для обработки list-in-parameter и (или) list-out-parameter, устанавливая в первом случае признаки inout =’R’, env=’O’, во втором случае - inout =’L’, env=’O’.
Функция paramt является универсальной функцией для обработки list-parameter и дополнительно в качестве аргумента она получает признак inout (для list-in-parameter inout =’R’, для list-out-parameter inout =’L’), и признак env (тип окружения вызова: env =’O’ для call-part, заданного вне конструкции iteration, env =’B’ для call-part заданного в boundary-value конструкции iteration, env =’H’ для call-part заданного в initial-value конструкции iteration, env =’P’ для call-part заданного в body-of-iteration.
Функция выделяет очередной параметр из list-parameter и, в зависимости от типа параметра, вызывает соответствующую функцию (функции) обработки параметра:
in-parameter : function
arithm-expression b a
name-variable-on-domain ON domain-of -parameter espis3,espis4
iterated-variable-on-domain ON domain-of-parameter espis7,espis8
name-external-simple-part espis1
name-external-function espis1
out-parameter :
name-scalar espis2
name-variable-on-domain ON domain-of-parameter espis3,espis4
iterated-variable-on-domain ON domain-of-parameter espis7,espis8
iterated-scalar espis5
Эти функции осуществляет проверку допустимости параметров call-part и строят зависимости param-dependency, необходимые для занесения в Таблицу функциональных зависимостей (Table of functional dependencies). Кроме этого, для out-parameter:
функция dopkdc заносит информацию о параметре в Таблицу ‘Что-вычисляется’ (What-compute table), задавая значение <statement number> равным значению верха стека nom,
функция dopgdc заносит информацию о параметре в Таблицу ‘Где-вычисляется’ (Where-compute table) ), задавая значение <statement number> равным значению верха стека nom.
Функция paramt фиксирует ошибки:
error code 212 'incorrect parameter-result of part '<error context>
error code 213 'missed parameter of part'
error code 214 'incorrect parameter of part: '<error context>' is not declared or declared twice’'
error code 216 'incorrect parameter-result of part '<error context> ': computation on precede (-1) step of ITERATION'
error code 217 'incorrect parameter-result of part : reassignment '<error context>
error code 218 'incorrect parameter of part : incorrect variable'<error context>
error code 219 'incorrect parameter of part : domain'<error context>' is conditional’'
error code 220 'incorrect parameter-result of part :’ <error context>' is not iterated'’
error code 222 'incorrect parameter of part : domain of parameter'<error context>' is not in declaration domain’'















