su4sml/src/xmi_ocl.sml

154 lines
8.1 KiB
Standard ML

(*****************************************************************************
* su4sml --- an SML repository for managing (Secure)UML/OCL models
* http://projects.brucker.ch/su4sml/
*
* xmi_ocl.sml ---
* This file is part of su4sml.
*
* Copyright (c) 2005-2007, ETH Zurich, Switzerland
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************)
(* $Id$ *)
(* ---------------------------------------------------------------------------
* The types in these structures are supposed to define a representation of
* the XML elements found in UML-XMI files. It is reasonably close to the UML
* metamodel and the XMI representation of it, while simplifying some kinds
* of references.
* --------------------------------------------------------------------------*)
structure XMI_OCL =
struct
(* FIX: LiteralExp should probably be renamed to PrimitiveLiteralExp *)
(* FIX: there should be also EnumLiteralExp and TupleLiteralExp *)
datatype OCLExpression = LiteralExp of { symbol : string,
expression_type : string }
| CollectionLiteralExp of { parts: CollectionLiteralPart list,
expression_type : string}
| IfExp of { condition : OCLExpression,
thenExpression : OCLExpression,
elseExpression : OCLExpression,
expression_type : string }
| AssociationEndCallExp of { source : OCLExpression,
referredAssociationEnd : string,
expression_type : string }
| AssociationClassCallExp of { source : OCLExpression,
referredAssociationClass : string,
expression_type : string }
| AttributeCallExp of { source : OCLExpression,
referredAttribute : string,
expression_type : string }
| OperationCallExp of { source : OCLExpression,
arguments : OCLExpression list,
referredOperation : string,
expression_type : string }
| OperationWithTypeArgExp of { source :OCLExpression,
name : string,
typeArgument: string,
expression_type: string}
| VariableExp of { referredVariable: string,
expression_type : string }
| LetExp of { variable : VariableDeclaration,
inExpression : OCLExpression,
expression_type : string }
| IterateExp of { iterators : VariableDeclaration list,
result : VariableDeclaration ,
body : OCLExpression,
source : OCLExpression,
expression_type : string}
| IteratorExp of { name : string,
iterators : VariableDeclaration list,
body : OCLExpression,
source : OCLExpression,
expression_type : string}
and CollectionLiteralPart = CollectionItem of { item : OCLExpression,
expression_type: string }
| CollectionRange of { first: OCLExpression,
last: OCLExpression,
expression_type: string}
(* from OCL 2.0 Expressions: -------------------------------------------------
* A VariableDeclaration declares a variable name and binds it to a type. The
* variable can be used in expressions where the variable is in scope. This
* metaclass represents amongst others the variables self and result and the
* variables defined using the Let expression.
* not supported: initExpression
* --------------------------------------------------------------------------*)
withtype VariableDeclaration = { xmiid: string,
name: string,
declaration_type: string,
init: OCLExpression option}
fun expression_type_of (LiteralExp{expression_type,...}) = expression_type
| expression_type_of (CollectionLiteralExp{expression_type,...}) = expression_type
| expression_type_of (IfExp{expression_type,...}) = expression_type
| expression_type_of (AssociationEndCallExp{expression_type,...}) = expression_type
| expression_type_of (AssociationClassCallExp{expression_type,...}) = expression_type
| expression_type_of (AttributeCallExp{expression_type,...}) = expression_type
| expression_type_of (OperationCallExp{expression_type,...}) = expression_type
| expression_type_of (OperationWithTypeArgExp{expression_type,...}) = expression_type
| expression_type_of (VariableExp{expression_type,...}) = expression_type
| expression_type_of (LetExp{expression_type,...}) = expression_type
| expression_type_of (IterateExp{expression_type,...}) = expression_type
| expression_type_of (IteratorExp{expression_type,...}) = expression_type
fun expression_source_of (AssociationEndCallExp{source,...}) = source
| expression_source_of (AssociationClassCallExp{source,...}) = source
| expression_source_of (AttributeCallExp{source,...}) = source
| expression_source_of (OperationCallExp{source,...}) = source
| expression_source_of (OperationWithTypeArgExp{source,...}) = source
| expression_source_of (IterateExp{source,...}) = source
| expression_source_of (IteratorExp{source,...}) = source
| expression_source_of _ = Logger.error ("expression has no source")
(* from UML 1.5 Core: --------------------------------------------------------
* A constraint is a semantic condition or restriction expressed in text.
* not supported:
* --------------------------------------------------------------------------*)
datatype ConstraintType = Inv | Pre | Post | Def | Body
(* We put Constraint into OCL, not into XMI_Core because we only use *)
(* OCL Constraints. *)
type Constraint = { xmiid : string,
name : string option,
constraint_type : string, (* xmi.idref to stereotype *)
body : OCLExpression }
end