ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

grammars-v4 中的 PlantUML 类图语法:基于 ANTLR4 的文本化 UML 类图解析器全解析

grammars-v4 中的 PlantUML 类图语法:基于 ANTLR4 的文本化 UML 类图解析器全解析 编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载本文以 plantUML/README.md 为骨架结合仓库内 PlantUMLParser.g4、PlantUMLLexer.g4、示例文件与 Maven 构建配置系统讲解 grammars-v4 仓库中 PlantUML 语法的设计意图、词法/语法结构、可解析的语言子集以及如何构建与回归测试。读完本文你将掌握如何阅读这份 ANTLR4 语法、理解其类图元素覆盖范围并能在本地复现其解析与测试流程。一、语法概述为 PlantUML 类图文本而生PlantUML 是一种以纯文本描述 UML 图形的标记语言。本仓库plantUML目录下提供的是一份面向 PlantUML 文本化 UML 类图表示法textual UML class diagram notation的 ANTLR4 语法版本对应 PlantUML 1.2020.22作者为 Kevin Lano。该语法由两个.g4文件组成PlantUMLLexer.g4词法规则负责把startuml ... enduml之间的类图文本切分成记号tokenPlantUMLParser.g4语法规则负责把记号流组织成类图结构类、枚举、关联、关联类等。需要特别指出的是这份语法只覆盖 PlantUML 类图class diagram子集而不是 PlantUML 的全部语法时序图、活动图、用例图等均不在范围内。这一点在 README 的 Description 一节中已明确说明理解这一边界有助于避免把该语法误用为通用 PlantUML 解析器。二、许可与作者信息作者Kevin LanoplantUML/README.mdAuthors 一节。许可证EPL-2.0Eclipse Public License 2.0。许可证声明也体现在两个.g4文件的文件头注释中例如 PlantUMLParser.g4 明确标注了Copyright (c) 2003--2025 Kevin Lano以及SPDX-License-Identifier: EPL-2.0展示了版权与 SPDX 标识的规范写法。三、词法设计PlantUMLLexer.g4 解析PlantUMLLexer.g4 承担全部词法工作其设计要点如下。3.1 关键字Keyword记号字面量用途ENUMenum枚举声明CLASSclass类声明STARTUMLstartuml图开始标记ENDUMLenduml图结束标记INTERFACEinterface接口类型ABSTRACTabstract抽象类类型MANY/ONEmany/one多重性说明词EXTENDSextends继承声明STATICstatic类体修饰符LISTList列表类型标识以上关键字见 PlantUMLLexer.g4。值得注意的是IDENT规则定义为[a-zA-Z][a-zA-Z0-9_]*PlantUMLLexer.g4关键字规则书写在IDENT之前ANTLR4 按规则出现顺序优先匹配从而保证class、enum等被识别为关键字而不是普通标识符。3.2 关系与结构符号关系符号家族非常直观、、-、.、..、*、o、^、|、|分别对应 PlantUMLLexer.g4 中的GT、LT、DASH、DOT、DOUBLE_DOT、STAR、O、CARET、PIPE_GT、LT_PIPE。这些单字符/双字符记号在解析器中被组合为继承、组合、聚合、依赖等语义关系。结构符号还包括,、(、)、[、]、#AMP、以及空值字面量nullPlantUMLLexer.g4。3.3 类体、原型与关联细节CLASS_BODY_START: { - pushMode(BODY)PlantUMLLexer.g4遇到类体左花括号后进入BODY模式。BODY模式中{...}单行内容被整体捕获为BODY_INLINE_BRACES跨行内容由BODY_CONTENT逐段捕获遇到}时popMode返回默认模式PlantUMLLexer.g4。STEREOTYPE_TEXT: ~[\r\n]* PlantUMLLexer.g4匹配...形式的构造型文本但不允许中间出现换行与。ASSOC_DETAIL: ~[\r\n]* PlantUMLLexer.g4匹配双引号包裹的关联细节文本如多重性标注。AFTER_COLON_TEXT: : ~[\r\n]*PlantUMLLexer.g4匹配冒号及其后到行尾的全部内容用于捕获成员声明或关联名。NOTE与DIAMOND被送入 HIDDEN 通道PlantUMLLexer.g4即词法上被识别、但不会出现在解析树中属于注释类内容。3.4 词法模式Lexer Modes除默认模式外词法器还定义了三个模式体现上下文相关的词法处理思路BODYPlantUMLLexer.g4类体内容ENUM_FREE_TEXTPlantUMLLexer.g4枚举自由文本以结束ASSOC_DETAIL_TEXTPlantUMLLexer.g4关联细节文本以结束。需要留意ENUM_FREE_TEXT与ASSOC_DETAIL_TEXT模式在词法文件中被定义但当前解析器版本并未显式触发从源码结构看应是为后续扩展或旧版解析预留的机制阅读时不必将其视为当前必经流程。四、语法设计PlantUMLParser.g4 解析PlantUMLParser.g4 定义了完整的类图语法结构核心规则如下。4.1 入口规则与 EOF 终止entry_: uml EOF;这一EOF终止的起始规则是必须存在的PlantUMLParser.g4。源码注释解释了原因自 ANTLR 4.6 起解析器规则必须至少包含一条以EOF结尾的起始规则否则会出现 report ok with invalid input非法输入被误报为合法的问题。这也意味着startuml ... enduml之后的任何非空白、非注释内容都会导致整个输入被判定为不合法。4.2 顶层结构 umluml: (NEWLINE | COMMENT)* STARTUML (IDENT)? (NEWLINE | class_dclr | enum_dclr | association_dclr | associative_class_dclr | COMMENT)* ENDUML (NEWLINE | COMMENT)* ;PlantUMLParser.g4图结构固定以startuml开头、enduml结尾中间允许任意顺序出现类声明class_dclr、枚举声明enum_dclr、关联声明association_dclr、关联类声明associative_class_dclr、换行与注释。STARTUML之后允许一个可选的IDENT可用于携带图名等附加标识。4.3 类声明与类体class_dclr: class_type? CLASS ident stereotype? extension_dclr? (NEWLINE? class_body)? ;PlantUMLParser.g4类声明支持可选前缀abstract/interfaceclass_type见 PlantUMLParser.g4、可选构造型...、可选的extends 父类扩展声明以及可选的类体。类体由{开始、}结束内部内容由body_content循环匹配PlantUMLParser.g4并支持嵌套花括号块。4.4 枚举声明enum_dclr: ENUM ident stereotype? class_body? ;PlantUMLParser.g4枚举声明同样支持可选构造型与类体。4.5 关联声明与 relation 规则association_dclr: association_left ( relation association_right association_name? | association_name // Replaced to allow parsing of functions. ) ;PlantUMLParser.g4关联声明有两种形态要么是左端 关系 右端 关联名要么仅左端 关联名——源码注释说明后者是为了允许解析函数methods而替换加入的分支。关系符号本身由relation规则定义relation: LT? (DOUBLE_DOT | DASH | PIPE_GT | LT_PIPE | O | CARET | STAR)* GT? ;PlantUMLParser.g4源码注释PlantUMLParser.g4坦诚地指出这是一个非常简单、但很可能不正确likely incorrect的正则式原规则基本是错的作者用该规则替换后强烈建议通过回归测试来确认关系运算符解析正确、不引入回归。这正是示例目录中classDiagramExamples期望解析树存在的原因。4.6 关联类声明associative_class_dclr: LPAREN leftident COMMA rightident RPAREN (DOT | DOUBLE_DOT) targetident association_name? | targetident (DOT | DOUBLE_DOT) LPAREN leftident COMMA rightident RPAREN association_name? ;PlantUMLParser.g4关联类支持两种书写顺序(A, B) -- C或C -- (A, B)均允许带关联名。规则中使用了带标签的替代项left、right、target便于监听器/访问器按标签提取端点。4.7 从解析树看语义分类示例文件 examples/classDiagramExamples 给出了 7 组输入与其期望解析树的对照见下节其中可以看到继承inheritance、关联association、依赖dependency、组合composition、聚合aggregation、属性attribute、方法method、可见性visibility、修饰符modifier static/abstract等语义分类标签——这些标签来自语法文件之外的处理逻辑但从解析树形态可以清晰推断出该语法的语义组织方式。五、示例7 个可解析的 .uml 文件examples/目录包含 7 个.uml示例与一个期望解析树对照文件它们是回归测试的输入素材desc.xml 声明inputs为examples/**/*.uml。逐一解读如下。5.1 关系符号组合x1.umlexamples/x1.uml 展示了关系符号的排列组合startuml Class11 |.. Class12 Class13 -- Class14 Class15 .. Class16 Class17 ..| Class18 Class19 --* Class20 enduml对应解析树中分别被识别为继承|..、关联--、依赖..、继承..|与组合--*——可见同一组基础符号通过不同组合表达不同的 UML 关系语义。5.2 多重性与关联名x2.umlexamples/x2.umlstartuml Class01 1 *-- many Class02 : contains Class03 o-- Class04 : aggregation Class05 -- 1 Class06 enduml这里使用了ASSOC_DETAIL双引号包裹的1、many与AFTER_COLON_TEXT: contains、: aggregation两类词法记号解析树中对应stringExpression与lineAnnotation节点。5.3 冒号式成员声明x3.umlexamples/x3.uml 展示了经典写法——先声明继承再以类名 : 成员形式逐行声明成员startuml Object |-- ArrayList Object : equals() ArrayList : Object[] elementData ArrayList : size() endumlAFTER_COLON_TEXT捕获: equals()这类文本解析树中区分为method与attributeObject[] elementData被解析为type Object [ ] 属性名。5.4 类体中的属性与方法x4.uml / x5.uml / x6.umlexamples/x4.uml类体{...}内的String data、void methods()分别成为internalAttribute与internalMethodflightNumber : Integer这类名 : 类型写法也被支持。examples/x5.uml类体内可见性前缀-、#、~、被解析为visibility节点。examples/x6.uml{static}、{abstract}花括号修饰符被解析为modifier static、modifier abstract。5.5 抽象类与继承组合x7.umlexamples/x7.uml 综合了本语法的典型能力startuml abstract class Person { name : String age : Real isAdult() : Boolean } Person |-- Employee class Employee { salary : Real } enduml即abstract前缀 类体 class关键字 类间继承 类型化成员的完整组合对应 4.3 节中class_type? CLASS ...规则链。六、构建与回归测试pom.xml 与 desc.xml6.1 Maven 构建配置plantUML/pom.xml 继承了仓库根 pom.xmlgroupId: org.antlr.grammars / artifactId: grammarsv4并配置了两个关键插件antlr4-maven-pluginpom.xml将PlantUMLLexer.g4与PlantUMLParser.g4作为输入sourceDirectory指向语法文件所在目录并开启visitor与listener代码生成。antlr4test-maven-pluginpom.xml回归测试插件entryPoint指定为entry_即 4.1 节的 EOF 终止规则、grammarName为PlantUML、exampleFiles指向examples/、testFileExtension为.uml。这意味着 Maven 测试阶段会自动用examples/下所有.uml文件驱动解析器验证每个示例都能成功解析。对应的回归验证方式即运行仓库标准测试脚本./test.sh plantUML脚本位于仓库根目录 test.sh其具体子命令用法可查阅 readme.md 了解。6.2 多目标语言声明desc.xml 声明本语法面向的目标语言包括CSharp; Cpp; Dart; Go; Java; JavaScript; PHP; Python3; TypeScript; Antlr4ng——即通过 ANTLR4 可以为这些目标生成对应的词法/语法代码测试输入则统一为examples/**/*.uml。这解释了示例目录中.uml扩展名的选取逻辑它既是 PlantUML 社区的习惯扩展名也是本仓库回归测试的识别标记。七、已知注意事项与边界README 的 Notes 一节给出了两条重要事实阅读和使用本语法时必须知晓语法来源独立PlantUML 社区存在一份 EBNF 语法描述puml.ebnf但本仓库的这份 ANTLR4 语法并非由该 EBNF 派生而来二者是独立的实现。因此遇到两者行为不一致时应以本仓库语法与示例为准。上游实现参考PlantUML 官方实现plantuml/plantuml是理解 PlantUML 语义行为的权威来源可用于校验本语法对特定输入的处理是否符合预期。官方 PlantUML 语言参考指南是查阅类图文本语法细节的补充资料。此外结合源码还可以补充三点工程层面的边界覆盖范围语法仅覆盖类图class diagram且是其中常见子集类、枚举、关联、关联类、成员声明不覆盖 PlantUML 的全部图类型与全部修饰语法。relation 规则的简单实现警告如 4.5 节所述源码注释明确提示该关系规则很可能不正确并建议以回归测试持续校验这是使用者最容易踩坑、也最值得关注的地方。HIDDEN 通道内容note ...与 ...形式的内容被词法器识别后送入 HIDDEN 通道PlantUMLLexer.g4不会出现在默认解析树中若需保留这些信息需要借助词法/解析监听机制另行提取。八、小结plantUML目录以两个.g4文件为核心为 PlantUML 文本化 UML 类图提供了一套结构清晰、可独立构建与回归测试的 ANTLR4 语法实现入口规则强制 EOF 终止以保证输入完整性词法层通过关键字、关系符号与多种模式支撑类体与自由文本语法层则覆盖类、枚举、关联与关联类四大类图元素。配合 7 个示例文件与 Maven 测试插件开发者可以在 grammars-v4 仓库内直接验证解析行为也可以以此为起点基于生成的 Listener/Visitor 构建自定义的 PlantUML 类图分析、转换与渲染工具。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐GFF3 文件解析基于 ANTLR4 的 gff3 语法在 grammars-v4 中的实践指南GFF3 文件解析基于 ANTLR4 的 gff3 语法在 grammars v4 中的实践指南 导读 本文围绕 grammars v4 仓库中的 gff3编程语言编译器开发工具P 语言文法解析grammars-v4 中最小图灵完备语言的 ANTLR4 实现P 语言文法解析grammars v4 中最小图灵完备语言的 ANTLR4 实现 本篇文章围绕 grammars v4 仓库中的 p/p.g4 https编程语言编译器开发工具Pydantic AI GoogleModel 接入指南Gemini API 与 Google CloudVertex AI模型的全配置与源码解析Pydantic AI GoogleModel 接入指南Gemini API 与 Google CloudVertex AI模型的全配置与源码解析 本指南编程语言编译器开发工具上一篇LLOneBot完整安装教程从零开始配置NTQQ机器人开发环境下一篇first-contributions 开源新手入门指南从 Fork 到 Pull Request 的完整首次贡献流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表