9.3.36 PropertyCallExpCS
该产生式规则产生一个PropertyCallExp。在产生式[A]中,source是显式的,然而产生式[B]用于一个隐式的source。选项C涵盖静态属性的使用。选项D使用pathNameCS来允许使用限定的属性名来访问重定义的属性。
[A] PropertyCallExpCS ::= OclExpressionCS ‘.’ simpleNameCS isMarkedPreCS?
[B] PropertyCallExpCS ::= simpleNameCS isMarkedPreCS?
[C] PropertyCallExpCS ::= pathNameCS
[D] PropertyCallExpCS ::= OclExpressionCS '.' pathNameCS '::' simpleNameCS isMarkedPreCS?
抽象语法映射
PropertyCallExpCS.ast : PropertyCallExp
合成的属性
[A] PropertyCallExpCS.ast.referredAttribute =
OclExpressionCS.ast.type.lookupAttribute(simpleNameCS.ast)
[A] PropertyCallExpCS.ast.source = if isMarkedPreCS->isEmpty()
then OclExpressionCS.ast
else OclExpressionCS.ast.isPre = true
endif
[B] PropertyCallExpCS.ast.referredAttribute = env.lookupImplicitAttribute(simpleNameCS.ast)
[B] PropertyCallExpCS.ast.source =
if isMarkedPreCS->isEmpty()
then env.findImplicitSourceForAttribute(simpleNameCS.ast)
else env.findImplicitSourceForAttribute(simpleNameCS.ast).isPre = true
endif
[C] PropertyCallExpCS.ast.referredAttribute =
env.lookupPathName(pathNameCS.ast).oclAsType(Attribute)
[D] let owner : Classifier = pathNameCS.env.lookupPathName(pathNameCS.ast).referredElement.oclAsType(Classifier) in
PropertyCallExpCS.ast.referredAttribute = owner.lookupAttribute(simpleNameCS.ast)
[D] PropertyCallExpCS.ast.source = if isMarkedPreCS->isEmpty()
then OclExpressionCS.ast
else OclExpressionCS.ast.isPre = true endif
继承的属性
[A] OclExpressionCS.env = PropertyCallExpCS.env
[D] OclExpressionCS.env = PropertyCallExpCS.env
歧义消除规则
[1][A,B] 'simpleName' 是source的类型的一个属性名,或者如果source为空的话,是'self'的一个属性或在范围内的任意迭代器变量的名称。在OCL中:
not PropertyCallExpCS.ast.referredAttribute.oclIsUndefined()
[2][C] pathName指向一个类属性。
env.lookupPathName(pathNameCS.ast).oclIsKindOf(Attribute)
and
PropertyCallExpCS.ast.referredAttribute.ownerscope = ScopeKind::instance
[3][D] pathNameCS必须是当前环境中的一个分类符的名称。
OperationCallExpCS.env.lookupPathName(pathNameCS.ast).referredElement.oclIsKindOf(Classifier)
[4][D] source表达式的类型必须符合所引用属性的属主的类型。
let owner : Classifier = pathNameCS.env.lookupPathName(pathNameCS.ast).referredElement.oclAsType(Classifier) in
OclExpressionCS.ast.type.conformsTo(owner)