12.12 上下文声明的具体语法
本子章节描述了规定不同OCL表达式使用类型的上下文的具体语法。它使用了第9章(具体语法)中定义的文法规则。这里的每条产生式规则也通过属性ast与抽象语法相关联。然而,有时候我们必须引用UML的抽象语法以发现每条产生式的正确类型。
可见性规则必须在UML元模型中定义。这里,我们假定每个分类符都有一个操作visibleElements(),它返回一个环境类型的实例。
注意-本子章节描述的上下文声明在OCL表达式直接附加到UML模型的时候是不需要的。该上下文声明的具体语法只为了支持文本文件中单独的OCL表达式。
因为假定如下的具体语法是与UML模型分离来使用的,所以我们假定UML模型上存在一个操作getClassifier(),它可以使我们在相应模型的任意位置找到一个模型。该操作的签名定义如下:
context Model::findClassifier( pathName : Sequence(String) ) : Classifier
pathName不必是一个全限定名,只要在UML模型中它可以唯一指示该分类符即可。如果一个分类符名称出现多次,那么它需要用它自己的包来限定(嵌套的),直到可以唯一限定一个名称。如果找打多个分类符,那么该操作返回invalid。变量Model用来指示该UML模型。它被用做:Model.findClassifier()。
类似的,我们假定UML模型上存在一个操作getPackage()可以允许我们在相应模型的一个包。该操作的签名定义如下:
context Model::findPackage( pathName : Sequence(String) ) : Package
此处的pathName需要是全限定名。
注意-与文法相关的合成和继承属性的规则都依赖于UML 2.0元模型。只有在该元模型稳定后它们才能编写。因此这里只给出文法规则。
12.12.1 packageDeclarationCS
该产生式代表了一个包声明。
[A] packageDeclarationCS ::= “package” pathNameCS contextDeclarationCS*“endpackage”
[B] packageDeclarationCS ::= contextDeclarationCS*
12.12.2 contextDeclarationCS
该产生式规则带不了所有不同的上下文声明。
[A] contextDeclarationCS ::= propertyContextDeclCS
[B] contextDeclarationCS ::= classifierContextDeclCS
[C] contextDeclarationCS ::= operationContextDeclCS
12.12.3 propertyContextDeclCS
该产生式规则代表了一个耦合到一个属性的表达式的上下文声明。路径名指的是该属性的属主,简单名称指的是它的名称,类型声明了它的类型。
propertyContextDeclCS ::= ‘context’ pathNameCS ‘::’ simpleName’:’ typeCS initOrDerValueCS
12.12.4 initOrDerValueCS
该产生式规则代表了一个初始或衍生的值表达式。
[A] initOrDerValueCS[1] ::= ‘init’ ‘:’ OclExpression initOrDerValueCS[2]?
[B] initOrDerValueCS[1] ::= ‘derive’ ‘:’ OclExpression initOrDerValueCS[2]?
12.12.5 classifierContextDeclCS
该产生式规则代表了耦合到分类符的表达式的上下文声明。到分类符上下文的变量声明对于形式A是‘self’,在形式B只能够被显式地指定。
[A] classifierContextDeclCS ::= ‘context’ pathNameCS invOrDefCS
[B] classifierContextDeclCS ::= ‘context’ simpleNameCS ':' pathNameCS invOrDefCS
12.12.6 invOrDefCS
该产生式规则代表了ygie不变式或变量。
[A] invOrDefCS[1] ::= ‘inv’ (simpleNameCS)? ‘:’ OclExpressionCS invOrDefCS[2]
[B] invOrDefCS[1] ::= (‘static’)? ‘def’ (simpleNameCS)? ‘:’ defExpressionCS invOrDefCS[2]
12.12.7 defExpressionCS
该产生式规则代表了一个定义表达式。非终结符defExpressionCS的目的是在OCL中定义额外的属性或操作。它们直接映射到一个带有约束的UML属性或操作,该约束定义了属性的衍生或操作结果值。注意VariableDeclarationCS已经在第9章进行了定义。
[A] defExpressionCS ::= VariableDeclarationCS ‘=’ OclExpression
[B] defExpressionCS ::= operationCS ‘=’ OclExpression
12.12.8 operationContextDeclCS
该产生式规则代表了耦合到一个操作的的表达式的上下文声明。
operationContextDeclCS ::= ‘context’ operationCS prePostOrBodyDeclCS
12.12.9 prePostOrBodyDeclCS
该产生规则代表了一个前置或后置条件或body表达式。
[A] prePostOrBodyDeclCS[1] ::= ‘pre’ (simpleNameCS)? ‘:’ OclExpressionCS prePostOrBodyDeclCS[2]?
[B] prePostOrBodyDeclCS[1] ::= ‘post’ (simpleNameCS)? ‘:’ OclExpressionCS prePostOrBodyDeclCS[2]?
[C] prePostOrBodyDeclCS[1] ::= ‘body’ (simpleNameCS)? ‘:’ OclExpressionCS prePostOrBodyDeclCS[2]?
12.12.10 operationCS
该产生式规则代表了一个上下文声明或定义表达式中的操作。
[A] operationCS ::= pathNameCS ‘::’ simpleNameCS ‘(‘ parametersCS? ‘)’ ‘:’ typeCS?
[B] operationCS ::= simpleNameCS ‘(‘ parametersCS? ‘)’ ‘:’ typeCS?
12.12.11 parametersCS
该产生式规则代表了一个操作的形式参数。
parametersCS[1] ::= VariableDeclarationCS (‘,’ parametersCS[2] )?