Язык описания информационных моделей EXPRESS вобрал в себя возможности таких языков как Ada, Algol, Pascal и др. и позволяет оперировать такими общеизвестными конструкциями как константа, переменная, оператор условного ветвления IF, оператор CASE, циклы REPEAT, функции и процедуры.
Кроме возможности задания (или уточнения) типов данных EXPRESS и объектной модели, язык позволяет задавать интерпретируемые элементы, с помощью которых можно обеспечить расчёт т.н. унаследованных атрибутов (Derived Attribute) или провести проверку модели на целостность с помощью интерпретации правил, заданных уровне типов данных (Where Rule), заданных в схеме, на уровне объектов (Where Rule) приложения или на уровне модели в целом (Global Rule).
Но наиболее базовым понятием языка EXPRESS является тип данных. Основными типами языка EXPRESS являются:
- Простые типы данных (Simple Type): INTEGER, REAL, LOGICAL, BOOLEAN, STRING, BINARY, NUMBER, ENUM и SELECT. Объекты каждого из этих типов могут находиться внутри коллекций (Aggregation), а коллекции в свою очередь делятся на несколько типов, таких как ARRAY, BAG, LIST, SET. Назначение и функциональность коллекций в целом аналогична контейнерам STL языка С++ (ARRAY – это не аналог std::vector, но аналог массива c фиксированным размером, например, int[32]). В EXPRESS возможны и многомерные коллекции, например, для трёхмерной коллекции вещественных чисел нужно задать LIST OF LIST OF LIST OF REAL, причём в данном написании не накладывается никаких ограничений на количество элементов в каждой из коллекций.
- Кроме простых типов язык позволяет участнику процесса создания описания модели задавать свои унаследованные типы данных (Derived Type):
TYPE IfcLengthMeasure = REAL; END_TYPE;
Подобная запись означает объявление нового типа, унаследованного от простого типа REAL. Тип-наследник будет обладать всеми свойствами вещественных чисел, которыми обладает и его базовый тип REAL, а следующая запись:
TYPE IfcPositiveLengthMeasure = IfcLengthMeasure; WHERE WR1 : SELF > 0.; END_TYPE;
Означает, что тип IfcPositiveLengthMeasure обладает поведением своего базового типа IfcLengthMeasure, но на него наложено ограничивающее правило с именем WR1: значение этого типа должно быть больше нуля. Проверка ограничений, описанных правилами Where Rule – отдельный раздел работы с СИДД. Каждый пользовательский тип однозначно определяется своим именем и в СИДД называется Именованным Типом (Named Type).
- Тип ENUMERATION является первым из двух конструируемых типов (Constructed type) и в .exp файле задаётся следующим образом:
TYPE IfcAlignmentCantSegmentTypeEnum = ENUMERATION OF (BLOSSCURVE ,CONSTANTCANT ,COSINECURVE ,HELMERTCURVE ,LINEARTRANSITION ,SINECURVE ,VIENNESEBEND); END_TYPE;
Атрибуты этого типа могут принимать значения опций, заданные в схеме. С точки зрения СИДД работа со значениями типа ENUM ведётся посредством обычных строк. Не рекомендуется использовать значения по их индексу, потому что возможна ситуация, когда одноимённые значения перечисляемого EXPRESS типа находятся под разными индексами в разных схемах.
- Наиболее близкую аналогию типа SELECT можно провести с привычным всем типом Variant когда атрибут может хранить в себе значение одного из указанных в определении именованных типов, в том числе и других конструируемых типов, SELECT или ENUM:
TYPE JustSelect = SELECT (LengthMeasure ,ReferenceToInstance ,OtherSelect ,EnumType); END_TYPE;
- Именованные коллекции AGGREGATION в соответствии с синтаксисом языка задаются как
TYPE IfcComplexNumber = ARRAY [1:2] OF REAL; END_TYPE;
В данном случае в схеме IFC задан тип для хранения комплексных чисел как массива ровно из двух значений REAL. Типами элементов для аггрегатов могут быть совершенно любые другие EXPRESS типы, в т.ч. другие аггрегаты, что позволяет определять внутри схемы многомерные коллекции.
Далее рассмотрим каждый из типов в отдельности и рассмотрим нюансы, присущие каждому из типов