normDDr (1158429), страница 9
Текст из файла (страница 9)
multidimensional-domain :
onedimensional-domain
[ name-multidimensional-domain : ] ( domain-product )
domain-product :
component-domain { ; component-domain }+
component-domain :
multidimensional-domain
name-unconditional-domain
Рекурсивно осуществляет разбор областей, входящих в domain-product и вызывает функцию onedim для обработки onedimensional-domain.
Информация об области записывается в Таблицу областей (Table of domains) функцией cokm, которая проверяет уникальность индексов в domain-product.
Функция фиксирует ошибки:
error code 12 'repeated index'<error context>
5.3.2.4Обработка описания новой области и диагональной области (Функция condm)
Осуществляет анализ и обработку new-domain и diagonal-domain. Синтаксис в языке Норма:
new-domain :
[ name-new-domain : ] new-domain-without-name
new-domain-without-name :
name-unconditional-domain / list-modification
modification :
name-index = value
name-onedimensional-domain { { +,- } boundary-function }+
boundary-function :
LEFT( const-expression )
RIGHT( const-expression )
declaration-of-diagonal-domain :
name-diagonal-domain : name-unconditional-domain / list-condition-on-index
Общая структура управления функции condm приведена на следующей схеме.
c
ondm inf listus con1 usl grank
mnoz alp1
uslnew
Функция inf выбирает информацию о корневой области name-unconditional-domain из Таблицы областей (Table of domains) (обработка new-domain и diagonal-domain ведется одинаково).
Функция фиксирует ошибки:
error code 409 ‘indefined domain’<error context>
Функция listus выделяет элементы list-modification или list-condition-on-index и заносит их в список list-condition.
Функция con1 анализирует результат работы функции inf: если корневая область не определена, обработка прекращается, иначе вызывается функция usl.
Функция usl анализирует тип условия в list-condition и вызывает функцию grank (обработка условий name-onedimensional-domain{{+,-}boundary-function}), либо функцию mnoz (см. 5.3.2.1) (обработка условий name-index = value), либо функцию uslnew (обработка условий condition-on-index).
Функция фиксирует ошибки:
error code 16 ‘incorrect conditional domain’<error context>.
Функция grank вызывает функцию wyc (см. 5.3.2.2) для вычисления значения const-expression из boundary-function, функцию graz для получения информации о name-onedimensional-domain, и функцию grana для получения модифицированной одномерной области.
Функция фиксирует ошибки:
error code 20 'incorrect name of domain '<error context>
error code 21 <error context>' is not one-dimensional domain'
error code 16 ‘incorrect conditional domain’<error context>
error code 22 'incorrect parameter '<error context>' of function LEFT or RIGHT'
error code 23 'negative boundary of range for index '<error context>
Функция uslnew строит Таблицу диагоналей (Table of diagonals) для declaration-of-diagonal-domain.
При этом для обработки list-condition-on-index используется функция zapu (см. п.5.3.2.6), для занесения информации о name-diagonal-domain в Таблицу диагоналей (Table of diagonals) используется функция con_2, информация о name-diagonal-domain для занесения в Таблицу областей (Table of domains) передается функции alp1.
Функция фиксирует ошибки:
error code 1 'constant '<error context>' in condition on index '<error context>
error code 2 'range for index '<error context>’consists from one point’
error code 3 <error context> ‘has not index’<error context>
error code 14 'domain with conditions on indexes '<error context>' and '<error context>' is empty'.
Функция alp1 записывает информацию о построенной в итоге области в Таблицу областей (Table of domains).
Функция фиксирует ошибки:
error code 18 'undefined subdomain '<error context>' in condition'.
error code 19 'undefined index '<error context>' in condition'.
5.3.2.5Обработка описаний переменных (Функция opisdef)
Осуществляет анализ и обработку описаний переменных, DISTRIBUTION INDEX, EXTERNAL. Синтаксис в языке Норма:.
declaration-of-scalar-variables :
VARIABLE list-name-scalar [ type ]
declaration-of-variables-on-domains :
VARIABLE list-name-variable-on-domain DEFINED ON name-unconditional-domain [ type ]
type :{ REAL, INTEGER, DOUBLE }
declaration-of-external-names :
declaration-of-external-functions
declaration-of-external-parts
declaration-of-external-functions :
EXTERNAL FUNCTION list-name-external-function [ type ]
declaration-of-external-parts :
EXTERNAL PART list-name-external-simple-part
declaration-of-distribution-indexes :
DISTRIBUTION INDEX name-index = simple-range , name-index = simple-range
simple-range : int-constant .. int-constant
Функция получает очередное предложение из группы c Cписка Норма предложений (List of Norma statements), вызывая функцию kbdef.
Результат работы функции opisdef - запись информации об именах переменных и внешних именах в Таблицу имен (Symbol table), информации Таблицу индексов распределения (Table of distribution indexes), либо запись информации об обнаруженных ошибках в Список ошибок (List of errors).
Общая структура управления функции opisdef приведена на следующей схеме.
opissk
opisve
o
pisdef rcodf
fcodf
ind_proc
Функции opisdef в зависимости от типа предлжония (declaration-of-scalar-variables, declaration-of-variables-on-domains, declaration-of-external-functions, declaration-of-external-parts, declaration-of-distribution-indexes) вызывает соответственно функции opissk, opisve, rcodf, fcodf, ind_proc.
Функции opissk выполняет анализ и обработку declaration-of-scalar-variables - заносит информацию о name-scalar в Таблицу имен (Symbol table).
Функция фиксирует ошибку:
error code 407 'incorrect list element of variables'<error context>
Функции opisve выполняет анализ и обработку declaration-of-variables-on-domains - заносит информацию о name-variable-on-domain в Таблицу имен (Symbol table).
Функция фиксирует ошибки:
error code 407 'incorrect list element of variables'<error context>
error code 412 'incorrect declaration of variable'<error context>’:undefined domain’
Функции rcodf выполняет анализ и обработку declaration-of-external-parts - заносит информацию о name-external-simple-part в Таблицу имен (Symbol table).
Функция фиксирует ошибку:
error code 170 'incorrect list element of external parts'<error context>
Функции fcodf выполняет анализ и обработку declaration-of-external-functions - заносит информацию о name-external-function в Таблицу имен (Symbol table).
Функция фиксирует ошибку:
error code 169 'incorrect list element of external functions'<error context>
Функции ind_proc выполняет анализ и обработку declaration-of-distribution-indexes - заполняет Таблицу индексов распределения (Table of distribution indexes).
Функция фиксирует ошибки:
error code 66 'incorrect distribution index:’ <error context>
error code 66 'incorrect distribution index:incorrect number’ <error context>
5.3.2.6Обработка описаний условной области (Функция opiska)
Осуществляет анализ и обработку conditional-domain. Синтаксис в языке Норма:
declaration-of-conditional-domain :
name-conditional domain , name-conditional-domain : name-domain / condition-on-domain
Функция получает очередное описание условной области из группы d Cписка Норма предложений (List of Norma statements) вызывая функцию kbc-domain.
Результат работы функции opiska - запись информации об области в Таблицу имен (Symbol table), Таблицу областей (Table of domains), Таблицу условий (Table of conditions) и Таблицу условных областей (Table of conditional domains), либо запись информации об обнаруженных ошибках в Список ошибок (List of errors).
Общая структура управления функции opiska приведена на следующей схеме.
o
piska uslset zapu usls1 protes usls2
Функция uslset проверяет, определена ли корневая область name-domain.
Функция zapu записывает condition-on-domain в Таблицу условий (Table of conditions) и возвращает <reference in Table of conditions >.
Функция usls1 записывает строку
| name-conditional domain | name-conditional-domain | name-domain | ref-on-condition |
в Таблицу условных областей (Table of conditional domains).
Функция protes получает в качестве аргумента name-domain и выдает в качестве результата истинную корневую область (это name-domain, если name-domain безусловная область, либо результат рекурсивного поиска в Таблице условных областей (Table of conditional domains) безусловной корневой области).
Кроме этого, функция проверяет, не противоречивы ли условия для name-conditional domain в цепочке условий, возникающей в случае, когда name-domain - условная область. Принцип проверки заключается в следующем. Из Таблицы условных областей (Table of conditional domains) выбирается строка, в которую входит name-conditional domain. Из этой строки выбирается ref-on-condition и определяется признак ‘Y’ или ‘N’ в зависимости от истинности или ложности этого условия для name-conditional domain. Кроме этого, выбирается name-domain и для него процедура выделения условий и признаков повторяется до тех пор, пока очередная name-domain не будет безусловной. Если в полученной цепочке условий и признаков есть по крайней мере две одинаковых ref-on-condition с различными признаками, то это означает, что условия противоречивы, и, следовательно, область name-conditional domain пустая. В этом случае
функция фиксирует ошибку:
error code 13 'domain’ <error context>’is empty’
Функция usls2 записывает информацию об обеих областях name-conditional domain в Таблицу имен (Symbol table) и Таблицу областей (Table of domains).
5.3.3Обработка предложений группы e (Функция kbbxo)
Осуществляет анализ и обработку declaration-of-input. Синтаксис в языке Норма:
declaration-of-input :















