ARTICLE DETAIL

资讯详情

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

ANTLR v4 仓库中的 Unicode 9.0.0 码点分类语法:classify16 / classify21 的设计原理与实战解读

ANTLR v4 仓库中的 Unicode 9.0.0 码点分类语法:classify16 / classify21 的设计原理与实战解读 编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载导读本文以 grammars-v4 仓库中 unicode/README.md 为核心系统讲解基于 unicode.org 权威规范数据自动生成的 ANTLR v4 Unicode 码点codepoint分类语法16 位版本的classify16.g4与理论上完整的 21 位版本classify21.g4。你会了解到码点范围与 16/21 位编码的取舍逻辑、Unicode 9.0.0 的 38 类字符分类体系gc 列表、以及仓库内可实际引用的实现文件与配套的字素簇grapheme cluster语法。读完即可理解为何 ANTLR4 的 Unicode 支持存在宽度限制以及如何在词法规则中直接复用这些分类。Unicode 的权威数据源与码点模型Unicode 联盟unicode.org维护着全部 Unicode 数据的权威/规范来源normative sources。这些数据存放于受到严格变更规则约束的维护文件中最新版本文件被视为最终定论final word。Unicode 是包含所有现役世界语言字母表以及部分人造字母表的通用元字母表meta-alphabet。每个 Unicode 字符被分配一个码点codepoint即一个唯一的序数ordinal。码点被约束在 0 到 1114111即 0 到0x10FFFF之间英文字母表被直接映射进 ASCII 的 0–1270x00–0x7F其他字母表则被安排在**一个或多个码点块codepoint blocks**中随着 Unicode 演进此前版本遗漏的字符会通过新增码点块的方式被纳入。正是这种按块扩展的机制决定了任意词法/语法工具若要完整支持 Unicode必须能寻址全部 21 位的码点空间。核心矛盾16 位 Java 与 21 位 UnicodeUnicode 元字母表需要21 位才能完整表示而大量 Unicode 支持软件被限制在16 位码点上。这对 lexer/parser 构成了两难一些重要语言的码点块需要超过 16 位例如部分增补平面字符ANTLR4 所使用的 Java 运行时基于 16 位char实现字符集处理。原文档对两个语法文件给出了明确的定位文件定位classify16.g4与现有 16 位 Java ANTLR4 协同工作必要但不充分necessary but insufficientclassify21.g4面向理论上完整的 21 位 Java ANTLR4必要且充分necessary and sufficient但因 ANTLR4 所用 Java 的 Unicode 宽度限制而无法直接运行也就是说在当前的 ANTLR4Java 运行时下classify21.g4因 Java 16 位char的宽度限制而失败classify16.g4则是当下可实际使用的兼容方案。这一点在仓库中也有印证实际存放的、可供编译使用的是classify16模块中的 unicode/unicode16/classify.g4其文件头注释明确写着 Automatically generated Unicode 9.0.0 codepoint classification grammar。Unicode 9.0.0 的 38 类字符分类体系gc 列表除维护字符码点列表外unicode.org 还维护码点分类。Unicode 9.0.0 中共有38 个分类其中31 个直接作用于码点8 个用于聚合其他分类例如Ll小写字母与Lu大写字母在 lexer 中被聚合为L字母但L并不作为直接分类出现。这些分类记录在UnicodeData.txt第 3 列并在PropertyValueAliases.txt的 gc 列表中使用。原文档完整列出了该 gc 列表是理解分类命名与聚合关系的第一手资料gc ; C ; Other # Cc | Cf | Cn | Co | Cs gc ; Cc ; Control ; cntrl gc ; Cf ; Format gc ; Cn ; Unassigned gc ; Co ; Private_Use gc ; Cs ; Surrogate gc ; L ; Letter # Ll | Lm | Lo | Lt | Lu gc ; LC ; Cased_Letter # Ll | Lt | Lu gc ; Ll ; Lowercase_Letter gc ; Lm ; Modifier_Letter gc ; Lo ; Other_Letter gc ; Lt ; Titlecase_Letter gc ; Lu ; Uppercase_Letter gc ; M ; Mark ; Combining_Mark # Mc | Me | Mn gc ; Mc ; Spacing_Mark gc ; Me ; Enclosing_Mark gc ; Mn ; Nonspacing_Mark gc ; N ; Number # Nd | Nl | No gc ; Nd ; Decimal_Number ; digit gc ; Nl ; Letter_Number gc ; No ; Other_Number gc ; P ; Punctuation ; punct # Pc | Pd | Pe | Pf | Pi | Po | Ps gc ; Pc ; Connector_Punctuation gc ; Pd ; Dash_Punctuation gc ; Pe ; Close_Punctuation gc ; Pf ; Final_Punctuation gc ; Pi ; Initial_Punctuation gc ; Po ; Other_Punctuation gc ; Ps ; Open_Punctuation gc ; S ; Symbol # Sc | Sk | Sm | So gc ; Sc ; Currency_Symbol gc ; Sk ; Modifier_Symbol gc ; Sm ; Math_Symbol gc ; So ; Other_Symbol gc ; Z ; Separator # Zl | Zp | Zs gc ; Zl ; Line_Separator gc ; Zp ; Paragraph_Separator gc ; Zs ; Space_Separator从列表中可以清晰看到三层结构大类L、M、N、P、S、Z、C、子类Ll、Lu、Nd等以及别名如digit、cntrl、punct。词法规则中通常按需引用子类分类而大类用于聚合判断。原文档还说明在所有这些分类之外额外增加了__作为 ERROR 分类用于标记未分类或不在规范列表内的码点。这一约定在生成的语法文件中以CLASSIFY___规则呈现见下文。仓库实现classify16.g4的规则结构在仓库中classify16对应的实际文件为 unicode/unicode16/classify.g43100 行由 UniGrammar.py 于 2017-06-23 自动生成提取自UnicodeData.txt与PropList.txt。其核心结构如下入口规则语法以file_ : codepoint EOF作为入口即单次匹配一个被分类的码点直至文件结束码点分类规则codepoint规则以|列出全部 32 个CLASSIFY_*规则分支31 个分类子类 CLASSIFY___错误分类例如codepoint : CLASSIFY___ // Error | CLASSIFY_Cc // Control | CLASSIFY_Cf // Format | CLASSIFY_Ll // Lowercase_Letter | CLASSIFY_Lm // Modifier_Letter ... ;分类词法规则每个CLASSIFY_*规则由一系列\uXXXX ..\uXXXX或单码点区间组成并按码点块注释来源例如CLASSIFY___中包含\u0378 ..\u0379 // Greek_and_Coptic、\u0530 // Armenian等正是对码点块扩展机制的直接体现手写辅助规则文件末尾补充了几条 hand-written 规则将分类直接组合为实用词法单元CLASSIFY_WS : CLASSIFY_Z ; // 空白 分隔符类Z序列 CLASSIFY_ID0 : CLASSIFY_L | _ ; // 标识符起始 字母或下划线 CLASSIFY_ID1 : CLASSIFY_ID0 | CLASSIFY_N ; // 标识符后续 上者或数字 ID : CLASSIFY_ID0 CLASSIFY_ID1* ; // 完整标识符可见该语法不仅是码点分类表还示范了如何把L、N、Z等聚合分类组装成真正可用的词法规则标识符、空白可以直接被其他 ANTLR 语法以import方式复用。配套能力字素簇Grapheme Cluster语法仓库的 unicode 模块还包含字素簇分割语法 unicode/graphemes/Graphemes.g4它利用 ANTLR4 的 Unicode 属性转义\p{...}实现 Unicode 文本分割UAX #29与码点分类语法互补emoji 序列EmojiZWJSequenceZWJ 连接、EmojiCoreSequence修饰符、组合、区域旗帜、EmojiTagSequence标签序列以及Extend/ZWJ/SpacingMark尾随规则CRLF 与韩文字节块CRLF规则匹配 CRLF 组合HangulSyllable按 L/V/T/LV/LVT 结构匹配韩文音节组合规则grapheme_cluster将Prepend*、emoji_sequence/HangulSyllable/NonControl与尾随修饰组合起来graphemes则负责完整扫描至EOF。该模块下 unicode/graphemes/examples 提供了ascii.txt、emoji.txt、udhr.txt及对应的.tree解析结果示例可作为验证 Graphemes 语法行为的最小测试集。在仓库中如何组织与使用整个 unicode 模块由 Maven 聚合管理见 unicode/pom.xml父pom声明unicode模块包含unicode16与graphemes两个子模块子模块 unicode/unicode16/pom.xml连同 unicode/graphemes/pom.xml从根 pom.xml 继承org.antlr.grammars:grammarsv4构建配置。各子模块的 desc.xml 还声明了运行时要求antlr-version为^4.7targets覆盖CSharp;Cpp;Dart;Go;Java;PHP;Python3表明这些语法面向多语言目标生成器。因此如果你的词法语法需要 Unicode 码点分类能力可以直接以 ANTLR 的import机制引入classify16即 unicode/unicode16/classify.g4中的ID、CLASSIFY_WS等规则若要按字素簇而非单码点切分文本则可参考 Graphemes.g4 的属性转义写法但需注意其依赖运行时的 Unicode 属性支持版本。小结选择哪个文件在**当前 ANTLR4 Java 运行时16 位 char**下应使用classify16.g4路径的实现即仓库中的 unicode/unicode16/classify.g4它是必要但非充分的兼容方案若未来出现理论上完整的 21 位 Java ANTLR4 运行时则可切换至classify21.g4实现必要且充分的完整 Unicode 覆盖对于文本分割需求可进一步结合 Graphemes.g4 按 UAX #29 字素簇规则处理 emoji、韩文与 CRLF 等组合字符序列。原文档所参考的 PLDB 概念页与生产工具用于从 unicode.org 规范数据自动生成这些语法的生成器属于外部资源其权威依据始终是 unicode.org 维护的规范数据文件本身。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐使用 ANTLR v4 解析 EVM 字节码grammars-v4 中 evm-bytecode 语法的设计与实战使用 ANTLR v4 解析 EVM 字节码grammars v4 中 evm bytecode 语法的设计与实战 导读 本文围绕 grammars v4 h编程语言编译器开发工具ANTLR v4 中的 XDR 与 ONCRPCv2 语法实现grammars-v4 仓库 oncrpc 模块全解析ANTLR v4 中的 XDR 与 ONCRPCv2 语法实现grammars v4 仓库 oncrpc 模块全解析 XDRExternal Data Re编程语言编译器开发工具Zig 语言 ANTLR v4 文法grammars-v4 仓库中 ZigGrammar 的完整解析Zig 语言 ANTLR v4 文法grammars v4 仓库中 ZigGrammar 的完整解析 导读 本篇指南围绕 grammars v4 仓库中 Zi编程语言编译器开发工具上一篇Lightbox图片预加载机制深度解析提升用户体验的关键技术点下一篇LlamaIndex BM25Retriever 完全指南基于 bm25s 的稀疏词法检索器实现原理与实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表