ГОСТ Р ИСО 10303-11 — 2009
Используя схему import в качестве корневой схемы, получаем следующую промежуточную схему:
SCHEMA artifact;
ENTITY а;
а1: STRING;
END_ENTITY;
ENTITY b;
M : STRING;
END_ENTITY;
ENTITY ref;
aref: a; — реализация зависит от объектного типа данных ref
bref: b; — реализация зависит от объектного типа данных ref
END_ENTITY;
RULE validate_dependently_instantiable_entity_data_types FOR
(a, b); — !! здесь добавлены а и b !!
LOCAL
number_of_input_instances ; INTEGER;
: LIST OF GENERIC := [ ];
: SET OF STRING ;= [ ];
: SET OF GENERIC := [ ];
previous_in_chain
set_of_input_types
alljnstances
END_LOCAL:
alljnstances := a+b; — I! здесьдобавлены а и b И
number_ofJnputJnstances := SIZEOF(allJnstances);
(* Собираются все строки типов всех экземпляров FOR в одно множество. *)
REPEAT i:=1 ТО number_ofJnputJnstances;
set_ofJnputJypes := set_ofJnput_types + TYPEOF(allJnstances [ i ]);
END_REPEAT;
WHERE
WR1: dependencyJnstantiated(allJnstances, set_ofJnput_types, previousJn_chain);
END_RULE;
FUNCTION dependentlyjnstantiated (
set_ofJnputJnstances : SET OF GENERIC;igen;
set_ofJnput_types: SET OF STRING;
previousJn_chain; LIST OF GENERIC:cgen): BOOLEAN;
(’Функция «dependentlyjnstantiated» предназначена для проверки, на все ли экземпляры
в исходном set_ofJnputJnstances имеются ссылки от независимо реализуемых экземпляров.
Если да, то функция возвращает значение true. Set_ofJnputJypes содержит строки типов для
всех исходных экземпляров. Экземпляры в previous_in_chain используются для выявления цик
лических ссылок при рекурсивном вызове данной функции. Параметр содержит список уже
про веренных экземпляров в цепочке ссылок.
*)
LOCAL
numberofinputJnstances
number_of_referringJnstances
bag_of_referring_instances
dependentlyjnstantiated flag
previousJn_chain_plus
result
set_ofJypes
ENDJ.OCAL:
IF EXISTS(set_ofJnputJnstances) THEN
number_of_input_instances := SlZEOF(set_ofJnputJnstances);
(‘ Объявленный тип bag_of_referring_instances добавляется к множеству типов
импортированных посредством оператора REFERENCE экземпляров для последующего
сравнения подмножеств.
INTEGER;
INTEGER;
BAG OF GENERIC:igen := [ ];
BOOLEAN;
LIST OF GENERIC:cgen := [ ];
BOOLEAN := true;
SET OF STRING :=[];
*)
set_ofJnput_types := set_ofJnputJypes + ’ GENERIC ’;
REPEAT i:=1 TO number_ofJnputJnstances;
(‘ Определяются все ссылки на текущий исходный экземпляр. *)
bag..ofjeferringjnstances := USEOIN (set_of_inputJnstances [ i ]. ” );
IF EXISTS(bag_ofjeferringjnstances) THEN
number_ofjeferringjnstances := SIZEOF(bag_of_referringJnstances);
dependentlyjnstantiated_flag := false:
REPEAT j:=1 TO number_ofjeferringjnstances;
163