基于 ANTLR v4 的 OCL 2.4 文法解析OCL.g4 与 UML-RSDS 集成实战指南【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址: https://gitcode.com/gh_mirrors/gr/grammars-v4本文以grammars-v4仓库中的 OCL 文法实现OCL.g4 与 UMLRSDS.g4为对象系统讲解如何用 ANTLR v4 为对象约束语言Object Constraint Language, OCL2.4 构建解析器并借助 UML-RSDS 文法在纯文本层面完成 UML 类图、用例与 OCL 约束的联合建模。读完本文你将掌握该仓库中文法的模块划分、表达式优先级规则、-箭头操作符设计哲学、上下文规约写法以及通过 Maven 与示例文件验证文法正确性的完整方法。OCL 2.4 文法仓库概览本仓库ocl/目录提供面向OCL 2.4的 ANTLR v4 文法并与UML-RSDS工具集成——该工具支持 UML 2.5 类图记法与 OCL 2.4 约束。文法的目标是提升 OCL 的精确性与易用性同时降低其与 UML 建模工具的集成门槛。整个文法刻意拆分为两个文件以分离纯 OCL 表达式能力与UML 模型文本规约能力文件职责OCL.g4OCL 2.4 核心文法覆盖表达式、类型、字面量、上下文规约invariant / derived attributeUMLRSDS.g4通过import OCL;继承核心文法扩展出包、类、接口、用例、枚举、操作契约等 UML 建模构件这种拆分既保证每个文件职责单一、易于理解和维护又通过 ANTLR 的import机制支持两者的组合使用——即既可以单独用 OCL 写表达式也可以在完整建模场景下联合使用。文法作者为 Kevin Lano版权声明见两个.g4文件头时间跨度 2003–2025SPDX 标识符为 EPL-2.0这与 README 中Main Contributors: Kevin Lano, 2022的记录一致。核心设计-箭头操作符的统一化本仓库文法最鲜明的设计决策是箭头操作符-被一致地用于所有非原始类型字符串、集合、函数、映射等上的操作而不像标准 OCL 那样仅限集合操作。例如字符串匹配str-isMatch(patt)对应的文法规则位于 OCL.g4 的postfixSuffix中该规则以- ID ( ... )的通用形式兜底允许任意-op(args)调用并支持后续链式访问(. ID)?同时内建了大量常用操作符如size、isEmpty、sum、first、last、any、collect、select、reject、forAll、exists、iterate、closure、sortedBy、isUnique、union、intersection、includes、excludes等覆盖集合、字符串、数值转换toInteger/toReal/toBoolean与反射查询oclIsKindOf/oclAsType等场景。例外字符串拼接仍保留传统中缀写法s1 s2布尔与数值操作符同样保留传统的中缀或前缀记法例如 README 给出的示例a xor b a * bm div netc.这些记法由 OCL.g4 中按优先级分层的表达式规则体现详见下文表达式优先级一节xor位于logicalExpression层*与div位于multiplicativeExpression层。README 之所以专门强调这一设计是因为它将 OCL 从集合操作专用-的旧惯例中解放出来字符串、函数、映射等类型上的操作符同样获得一致的箭头语法表达式因此更统一、可读性更强。表达式优先级与解析顺序OCL.g4 在注释中明确给出了最低优先级在前的分层设计从上到下优先级逐层升高逻辑层logicalExpressionand、、or、xor、、implies与implies同义相等/比较层equalityExpression、、、、、/、、:、/:、:加法层additiveExpression、-、..区间、|-映射键值对乘法层multiplicativeExpression*、/、mod、div一元层unaryExpressionnot、-、、?、!其中|-被归入加法层用于Map字面量键值对的书写。所有层级规则均为左递归 ANTLR 写法如equalityExpression : additiveExpression (( | ...) additiveExpression)*ANTLR v4 会将其转换为标准的左结合解析。顶层规则expression则支持三种形式OCL.g4logicalExpression——纯逻辑/算术表达式conditionalExpression——if ... then ... else ... endif条件表达式letExpression——let b1, b2 in expr局部绑定表达式letBinding支持ID (: type)? expression关于左结合的修正示例仓库的 examples/expressions/expressionExamples.txt 中有一处非常有价值的注释2*x - 3*y 4*z; /* This is now correctly parsed as (2*x - 3*y) 4*z The original version of the grammar gave 2*x - (3*y 4*z) */它说明本仓库版本的分层规则已修正了旧版文法的结合性问题——2*x - 3*y 4*z现按标准左结合解析为(2*x - 3*y) 4*z。这一细节提醒读者表达式语法中优先级分层 左递归的实现方式直接决定了解析结果的正确性验证文法时应对此类多操作符混合表达式重点测试。后缀导航与链式调用OCL.g4 用navigationExpression处理后缀链式表达式其注释说明它是直接的左递归后缀表达式可以出现在-的左侧。其结构为navigationExpression : primaryFactor (postfixSuffix)* ; primaryFactor : setExpression | basicExpression ;basicExpression支持字面量null、布尔、整型、浮点、单/双引号字符串、枚举、标识符、括号表达式、属性导航.ID、方法调用(args)与下标访问[expr]setExpression支持Set{...}、Sequence{...}、Bag{...}、OrderedSet{...}、Map{...}五种集合字面量。postfixSuffix提供了大量可链式拼接的后缀既有标准 OCL 反射操作oclType、oclIsUndefined、oclIsInvalid、oclIsNew、oclAsType、oclIsTypeOf、oclIsKindOf、oclAsSet、allInstances也有通用点操作与箭头操作. ID(args)与- ID(args)的通用形式均支持(. ID)?尾部链式访问例如-any(...)之后可继续.value、.id等属性。高阶迭代操作OCL.g4统一支持可选的迭代变量声明前缀(identOptType |)?或(identOptTypeList |)?-collect(x | expr)、-select(x | expr)、-reject(x | expr)-forAll(x1, x2 : T | expr)、-exists(...)、-one(...)-closure(...)、-sortedBy(...)、-isUnique(...)-iterate(x; acc : Integer 0 | expr)——OCL 经典 iterate 语义上下文规约不变量与派生属性OCL.g4 提供两种入口规则用于书写 OCL 约束规约contextSpecification : (singleInvariant | singleDerivedAttribute) EOF ; multipleContextSpecifications : (singleInvariant | singleDerivedAttribute) EOF ;不变量context ID inv ID? : expression派生属性context qualified_name : type (init: expression)? derive: expressionqualified_name由ENUMERATION_LITERAL形如ID :: ID承担因此派生属性的上下文可以写成Product::lowestPrice这类限定名。仓库的 examples/multipleContextSpecifications/contextExamples.txt 提供了 30 余个真实规约样例覆盖上述两类规则例如context Product::lowestPrice: Price derive: sellingPrice-sortedBy(valueInEUR)-first() context MyClass::derivedAttribute: Integer derive: attribute1 attribute2 context Company inv: self.employee-select(p : Person | p.age 50 )-notEmpty() context Company inv: self.employee-forAll( e1, e2 : Person | e1 e2 implies e1.forename e2.forename) context SET inv: let variableReference : VariableReference self.referenceOwner.oclAsType(VariableReference), ... in if self.referenceOwner.oclIsKindOf(EObjectReference) then ... endif这些样例还演示了let多绑定、嵌套if/endif、oclAsType/oclIsKindOf反射、-iterate累加器、多迭代变量forAll(e1, e2 : Person | ...)等高级组合是验证文法覆盖度的理想测试输入。UML-RSDS 集成文法从 OCL 表达式到 UML 建模单独的 OCL 表达式若不配合工具文法来指定 UML 模型往往难以在实际工程中落地。为此 UMLRSDS.g4 通过import OCL;复用全部 OCL 规则并新增以下建模构件顶层规则为specificationspecification : package ID { classifier* } EOF ;classifier分支包含classDefinition、interfaceDefinition、usecaseDefinition、datatypeDefinition、enumeration。类与接口定义classDefinition : class identifier (extends identifier)? (implements idList)? { classBody? } ;类体元素classBodyElement包括属性、操作、不变量与构造型stereotype属性attribute identifier (identity | derived)? : type ;以及静态属性static attribute ...操作契约(static)? operation identifier ( parameterDeclarations? ) : type pre: expression post: expression (activity: statementList)? ;——操作自带前置条件pre:、后置条件post:与可选的活动体activity:不变量invariant expression ;构造型stereotype identifier ( STRING_LITERAL | identifier)? ;用例定义usecaseDefinition支持两种形态无参数usecase identifier (: type)? { usecaseBody? }与带参数usecase identifier ( parameterDeclarations ) (: type)? { usecaseBody? }。用例体元素包括参数声明、前置条件precondition expression ;、扩展关系extends/extendedBy、活动体activity: statementList ;以及直接书写的:: expression。语句与表达式入口UMLRSDS 还提供expressions入口expressionOrLambda (; ...)* ;? EOF支持以分号分隔的表达式序列并引入lambda 表达式lambdaExpression : lambda identifier : type in expression ;例如 examples/expressions/expressionExamples.txt 中的lambda x : double in x*x*x;。statement规则则定义了活动体中的命令式语句skip、return、continue、break、变量声明var ID : type、赋值basicExpression : expression、if/while/for控制流、execute、call、语句块与语句序列。完整建模示例债券定价应用examples/specification/bondApp.km3 给出了一个端到端的 UML-RSDS 规约文件package app5 { ... }包含class Bond带identity标识属性id、derived派生属性yield/duration以及多个带pre:/post:契约与activity:活动体的操作如discount、value、macaulayDuration、bisection活动体中使用var、for i : 1..upper do ...、return、self.discount(...)递归调用两个usecasefindDuration、findYield通过extendedBy findDuration;建立用例扩展关系活动体内使用Bond[bondId]对象查找、call persistBond(bond)调用与字符串拼接该文件同时演示了stereotype persistent;、stereotype application;等构造型用法覆盖了classDefinition、operationDefinition、usecaseDefinition、statement等绝大多数 UMLRSDS 规则。类型系统与词法细节类型规则OCL.g4 的type规则支持泛型化类型构造type : Sequence ( type ) | Set ( type ) | Bag ( type ) | OrderedSet ( type ) | Ref ( type ) | Map ( type , type ) | Function ( type , type ) | identifier ;可以看到本仓库在标准 OCL 集合类型之外还扩展了Ref引用类型、Map(K,V)与Function(A,B)函数类型这与 README 提到的字符串、集合、函数、映射箭头操作支持一一对应。词法记号Lexer词法规则定义了以下记号OCL.g4BOOLEAN_LITERALtrue/falseFLOAT_LITERALDigits . DigitsSTRING1_LITERAL/STRING2_LITERAL分别以双引号与单引号包裹支持EscapeSequence含八进制与\uXXXX十六进制转义ENUMERATION_LITERALID :: IDNULL_LITERALnullINT[0-9]ID[a-zA-Z_$] [a-zA-Z0-9_$]*注释与空白处理/* ... */块注释进入HIDDEN通道以--开头的行注释被skip这与 SQL/OCL 社区习惯一致换行与空白均被skip。构建、测试与快速验证通过 Maven 构建与测试ocl目录是仓库 Maven 多模块工程父 POM 见 pom.xmlartifactIdocl下的独立模块其 pom.xml 配置了两个关键插件antlr4-maven-plugin仅编译UMLRSDS.g4includeUMLRSDS.g4/include。由于 UMLRSDS 通过import OCL;引用了 OCL 文法ANTLR 会自动加载并合并 OCL 规则因此只需指定入口文法即可。antlr4test-maven-plugin以UMLRSDS为文法名、specification为入口规则对examples/specification/下的.km3文件执行解析测试。仓库根目录还维护了统一的测试脚本test.sh、_scripts/checklists.sh、_scripts/test.sh可在仓库根目录执行./test.sh或bash _scripts/test.sh运行包含 ocl 在内的全部文法测试。依据 desc.xml 的测试矩阵desc.xml 声明了三个测试组并给出了每个测试的入口规则与输入目录这是验证文法正确性的官方清单测试名入口规则输入文件specspecificationexamples/specification/*.km3exprexpressionsexamples/expressions/*.txtcontextspecsmultipleContextSpecificationsexamples/multipleContextSpecifications/*.txt同时desc.xml声明目标语言为Java;CSharp即该文法面向 Java 与 C# 生成解析器。手动快速验证可选若需脱离 Maven 快速体验可参照仓库 _scripts/grun.sh 的流程先用java org.antlr.v4.Tool -no-listener -visitor -o out UMLRSDS.g4生成解析器源码并javac编译再通过org.antlr.v4.gui.TestRig UMLRSDS specification -gui -tree file查看解析树。例如对examples/specification/bondApp.km3执行即可看到package app5 {...}完整展开的语法树。未来扩展方向README 指出当前仓库聚焦 OCL 核心文法与 UML-RSDS 集成未来可考虑纳入其他 OCL 工具的文法如 USE-OCL进一步扩展本仓库的实用性与覆盖面。这意味着ocl/目录的设计具有可插拔性——新增工具文法时可沿用核心 OCL 文法 import集成的既有模式。小结OCL.g4提供了完整的 OCL 2.4 表达式解析能力分层优先级、-箭头操作符统一语法、集合字面量、let/if表达式、反射操作与高阶迭代操作。UMLRSDS.g4通过import OCL将表达式能力提升为完整的文本建模语言可书写包、类、接口、用例、枚举、操作契约与活动体。仓库以 desc.xml、pom.xml 与三组示例文件表达式、上下文规约、完整建模规约构建了可复现的验证闭环是研究 ANTLR 文法模块化设计与 OCL 工具链集成的优质参考实现。【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址: https://gitcode.com/gh_mirrors/gr/grammars-v4创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考