11.1 引言

OCL的结构、语法和语义分别在第8、9、10章进行了定义。本章增加OCL定义的另一部分内容:预定义的类型和操作。任何OCL的实心都必须包括这个库包。该方式也被例如,Java定义所采用,其中语言定义和标准库都是完整语义定义的必要部分。

OCL标准库定义了许多类型。它包括多个基本类型:UnlimitedNatural,Integer,Real,String和Boolean。这在许多其它语言中也很常用。标准库的第二部分包括集合类型。它们是Bag,Set,Sequence和Collection,其中Collection是一个抽象类型。注意,OCL标准库中定义的所有类型都是一个抽象语法类的实例。OCL标准库在建模层存在,也即M1层,抽象语法是元层或M2层。

除了类型定义,OCL标准库还定义了许多模板表达式。许多集合上定义的操作没有映射到元类FeatureCallExp的抽象语法,而是IteratorExp上。对于每一个模板表达式,在11.8 预定义的迭代器表达式 中定义了模板表达式所定义的名称和表达式格式。

标准库可以被新类型、新操作和新迭代器来扩展。尤其是可以定义在集合上的操作。

一些字符串操作依赖盛行的locale来核对字符串以适当的方式被解析。locale是一个由下划线分隔、最多三个字母序列的链接,第一个序列规定语言,第二个序列鉴别国家。第三个序列通常为空但可以编码为一个实现特定的变体。尾部的空字符串和分隔符可以被省略。

语言字符序列由ISO 639来定义。

国家字符序列由ISO 3166来定义。

因此 ‘fr_CA’ 谷底你改了加拿大的法语 locale。

字符串的比较和后续的Collection::sortedBy()的次序遵循Unicode Technical Standard#10定义的Unicode核对算法。

locale缺省是‘en_us’,但可以通过OclAny::oclLocale属性约束进行配置。

现有的locale由当前环境中oclLocale值决定;因此可以使用Let表达式来临时更改。

let oclLocale : String = 'fr_CA' in aString.toUpperCase()

results matching ""

    No results matching ""