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)

results matching ""

    No results matching ""