首页/新闻资讯/正文详情

基于 ANTLR4 的电话号码语法 telephone:规则解析、示例验证与构建测试实践

发布时间:2026/9/25 3:27:20 来源:云帆数科 栏目:资讯中心
基于 ANTLR4 的电话号码语法 telephone:规则解析、示例验证与构建测试实践
编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载本篇文章以 grammars-v4 仓库中的 telephone 语法模块 为对象完整剖析其 telephone.g4 的语法规则结构、词法设计、示例输入与 Maven 构建测试链路帮助读者快速掌握如何用 ANTLR4 编写和验证一个支持北美编号计划NANP与日本电话号码格式的解析器并能在本地通过命令行与 Maven 插件直接运行验证。模块概览一个无 action 的纯描述性语法telephone 是 grammars-v4 仓库中用于解析电话号码的 ANTLR4 语法位于 telephone 目录。整个模块的文件组织非常精简telephone.g4唯一的语法源文件同时包含词法规则与语法规则examples4 个用于验证解析结果的示例输入文件pom.xml基于 Maven 的构建与自动化测试配置desc.xml声明该语法可生成的目标语言targetsREADME.md模块说明明确其定位是 An ANTLR4 grammar for Telephone numbers。与 grammars-v4 仓库的整体约定一致项目描述明确 expectation that the grammars are free of actionstelephone.g4 是全描述性descriptive语法它只描述电话号码的语言结构内部不含任何嵌入到规则中的目标语言 action 或 semantic predicate因此可以干净地为 CSharp、Cpp、Dart、Go、Java、JavaScript、PHP、Python3、TypeScript、Antlr4ng 等多语言目标生成解析器见 desc.xml。语法规则逐层拆解顶层入口与整体结构telephone.g4 从语法声明grammar telephone;开始定义了三个顶层规则test : number EOF ; number : 1? ? variation ; variation : nanp | japan ;test是模块约定俗成的入口规则要求一个完整的number后紧跟EOF即强制要求输入被整体消费不允许多余字符残留适合作为单元测试的入口点number是核心号码规则先处理可选的国际前缀再进入具体编号计划变体可选的1对应北美编号计划的国家码country code随后可选的一个允许输入中出现形如011 ...的写法见下文示例 2、3真正的主体由variation决定——要么是 NANP 格式要么是日本格式。北美编号计划NANP分支// North American Numbering Plan nanp : 011 areacode exchange subscriber ; areacode : DIGIT DIGIT DIGIT ; exchange : DIGIT DIGIT DIGIT ; subscriber : DIGIT DIGIT DIGIT DIGIT ;nanp分支telephone.g4采用011 区号 局号 用户号的固话拨号结构前缀字面量011模拟国际长途拨号前缀北美以外拨往北美常用areacode为 3 位区号如示例中的403exchange为 3 位局号如示例中的867subscriber为 4 位用户号如示例中的5309。三者合起来正好构成北美电话号码典型的NPA-NXX-XXXX即 3-3-4 数字分组。需要指出的是该语法中的区号、局号只是按位数建模并不校验真实号码分配规则例如区号首位不为 0/1 等约束并未在词法层体现。日本编号计划分支// Japan japan : 010 areacode exchange subscriber ; DIGIT : [0-9] ;japan分支telephone.g4与 NANP 结构对称前缀字面量换成010日本国际电话接入码同样复用areacode / exchange / subscriber三段式数字结构。值得注意的是该分支复用 NANP 的位数定义因此日本号码在此语法中被建模为010 3 3 4的等宽分组属于对实际日本号码如示例中的010 64 3 477 4000的简化抽象并不区分日本国内区域码位数的真实差异。从源码结构看variation通过纯文本前缀011vs010即可在语法层区分两种格式无需任何 action 参与决策。词法规则极简的数字与空白处理语法仅定义两个词法 tokentelephone.g4DIGIT : [0-9] ; WS : [ \r\n] - skip ;DIGIT匹配单个0-9字符语法规则中通过连续拼接DIGIT DIGIT DIGIT来表达定长数字这种写法使规则结构一目了然代价是 token 流较细碎一个数字一个 tokenWS匹配空格、回车与换行并通过- skip交给词法分析器丢弃因此示例文件中数字与数字之间的空白可以被任意数量地使用解析器无需感知空白位置。示例输入与解析预期examples 目录提供了 4 个验证文件分别覆盖了 NANP 与日本格式的多种前缀组合文件内容对应规则路径example1.txt011 403 867 5309number → variation → nanp不带1与example2.txt011 403 867 5309number命中可选的后进入nanpexample3.txt1 011 403 867 5309number同时命中可选的1与后进入nanpjapan1.txt010 64 3 477 4000number → variation → japan四个示例恰好穷举了number规则中两个可选前缀1?、?与两个variation分支nanp、japan的主要组合构成一组针对入口规则test的行为验证矩阵只要任何一个示例无法被完整解析到 EOF即说明语法回归或示例文件与语法不匹配。构建与自动化测试pom.xml 双插件链路telephone/pom.xml 以根项目 pom.xml 为父 POMorg.antlr.grammars:grammarsv4:1.0-SNAPSHOT通过两个插件形成生成 测试闭环antlr4-maven-plugin将sourceDirectory指向模块根目录明确只包含telephone.g4并同时开启visitor与listener两种遍历模式的代码生成即mvn generate-sources阶段即可产出对应目标语言的 Lexer/Parser/Listener/Visitor 骨架代码。antlr4test-maven-plugin这是模块的测试引擎关键配置包括grammarNametelephone指明被测语法entryPointtest即从test规则开始解析exampleFilesexamples/指向上述示例目录运行mvn test时插件会逐一读取该目录下的输入文件从test入口开始解析任何一个文件解析失败都会导致测试失败。这条双插件链路意味着克隆仓库后在telephone模块下执行mvn test即可自动完成语法生成 → 4 个示例文件全量解析 → 结果校验的完整回归流程无需手写任何 Java 测试类。本地快速体验antlr4-parse 与 grun 脚本如果不借助 Maven仓库也提供了无需安装 Java 即可运行 ANTLR 的 Python 工具链antlr4-tools见 _scripts/antlr4-tools/README.md。其核心命令antlr4-parse可直接以解释器模式解析语法并输出语法树例如在telephone目录下执行pip install antlr4-tools antlr4-parse telephone.g4 test -tree examples/example1.txt预期输出一棵以test为根、依次包含number → variation → nanp及各区号/局号/用户号子节点的语法树其中011等字面量 token 与DIGITtoken 均会显式出现在树中也可以改用-tokens查看 token 流或用-gui弹出可视化窗口。由于入口规则是test任何不以合法number结尾的输入如多余字符或位数不足都会在EOF处报错。此外仓库提供了跨平台的 ANTLR 测试辅助脚本 _scripts/grun.sh在配置好 ANTLR 环境后同样可以调用grun telephone test配合-tree、-tokens、-gui等参数进行交互式验证。局限与可扩展方向基于对源码的阅读可以谨慎地总结该语法的边界与可能的扩展点纯位数建模区号、局号、用户号均只约束为固定位数telephone.g4不校验号码是否真实有效例如不区分011与010之外的更多国际前缀仅两种编号计划variation目前只支持nanp与japan两个分支如需支持其他国家或移动号段如86、44等可仿照japan分支在variation中扩展新规则并在number中补充对应国家码字面量长度模型的简化日本分支复用了 3-3-4 分组若要精确覆盖日本国内可变长度的区号/局号需要引入更多规则层级而非简单的定长DIGIT拼接。总体而言telephone 是一个结构清晰、无 action、可编译到十余种目标语言的极简 ANTLR4 参考实现非常适合作为学习如何用词法/语法规则表达带可选前缀与分支的领域格式的入门范本其 pom.xml 与 examples 的组合也为快速回归验证提供了现成的工程模板。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐Action! 语言 ANTLR4 语法实现解析从语法规则、类型系统到示例验证Action! 语言 ANTLR4 语法实现解析从语法规则、类型系统到示例验证 导读 本文围绕 action/ https://link.gitcode.co编程语言编译器开发工具freeCodeCamp 电话号码校验器项目实战基于 freeCodeCamp 仓库构建 JavaScript 算法认证项目freeCodeCamp 电话号码校验器项目实战基于 freeCodeCamp 仓库构建 JavaScript 算法认证项目 本项目文件位于 curricul前端后端教育FOL 一阶逻辑 ANTLR4 语法语法结构、记号体系与构建测试实战FOL 一阶逻辑 ANTLR4 语法语法结构、记号体系与构建测试实战 本文以 grammars v4 仓库中的 FOLFirst Order Logic一编程语言编译器开发工具上一篇如何永久保存微信聊天记录WeChatMsg完整指南下一篇Minify测试套件完全解析如何确保压缩代码的正确性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Kimi K3 纯 CPU 推理中的无损 Trunk 压缩:一次被解码速度判死刑的 Huffman 压缩实验
Kimi K3 纯 CPU 推理中的无损 Trunk 压缩:一次被解码速度判死刑的 Huffman 压缩实验

人工智能大模型推理引擎本地部署 【免费下载链接】kimi-k3-in-c A 2.78-trillion-parameter Kimi K3 running inference on a single CPU in 8.24 GB of RAM. Portable C99: no BLAS, no framework, no GPU. 项目地址: https://gitcode.com/gh_mirrors/ki/kimi-k3-i… · 2026/9/25 3:27:20

rsuite Accordion 手风琴组件完全指南:折叠面板、受控展开与可访问性实践
rsuite Accordion 手风琴组件完全指南:折叠面板、受控展开与可访问性实践

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 手风琴(Accordion)是 rsuite 中用于在有限空间内展示大量内容的经典交互组件&am… · 2026/9/25 3:27:20

Agent-Native系统架构落地指南:从AI调用到智能体编排
Agent-Native系统架构落地指南:从AI调用到智能体编排

1. 为什么我开始认真对待"agent-native"这个词大概从去年下半年开始,我发现自己和团队在做AI应用时,陷入了一种很别扭的状态:产品经理给的需求还是老一套的"用户点击-后端处理-返回结果"逻辑,只是把中间某个环… · 2026/9/25 3:27:14

ODAC1120320Xcopy_32bit:可复位Oracle连接基线环境详解
ODAC1120320Xcopy_32bit:可复位Oracle连接基线环境详解

简介:本资源是面向.NET开发者与Oracle数据库运维人员的32位ODAC远程连接环境配置包,专为解决Windows平台下C#、ASP.NET等应用稳定连接Oracle数据库的部署难题。包内含ODAC 11.2.0.3.20核心组件(OLEDB、Oracle Managed Data Access、ASP.NET适… · 2026/9/25 4:23:47

J-Link隐藏技能:用VCOM虚拟串口一根线搞定调试与日志
J-Link隐藏技能:用VCOM虚拟串口一根线搞定调试与日志

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:23:47

videocache4cj LRU缓存清理策略详解:TotalSize与TotalCount怎么选
videocache4cj LRU缓存清理策略详解:TotalSize与TotalCount怎么选

videocache4cj LRU缓存清理策略详解:TotalSize与TotalCount怎么选 【免费下载链接】videocache4cj 一个支持边播放边视频缓存库,输入视频的URL就可方便快捷的实现视频边下边播功能 项目地址: https://gitcode.com/Cangjie-TPC/videocache4cj video… · 2026/9/25 4:23:41

ExternalDNS Node Source 实战:将 Kubernetes 节点 IP 自动同步到 DNS 托管区
ExternalDNS Node Source 实战:将 Kubernetes 节点 IP 自动同步到 DNS 托管区

云原生 【免费下载链接】external-dns Configure external DNS servers dynamically from Kubernetes resources 项目地址: https://gitcode.com/gh_mirrors/ex/external-dns 点击查看 免费下载 本文讲解如何在 ExternalDNS 中启用节点(Node&#xff09… · 2026/9/25 4:23:41

Cobalt Strike 4.5部署配置与红队实战避坑指南
Cobalt Strike 4.5部署配置与红队实战避坑指南

简介:Cobalt Strike 4.5是面向渗透测试、红队评估与安全研究的C2框架,支持HTTP/HTTPS/DNS/SMB等多种协议上线主机,内置提权、凭据导出、端口转发、Socket代理、Office攻击、文件捆绑、钓鱼等功能,并可调用Mimikatz等外部工具完成内… · 2026/9/25 4:23:35

宇树G1机器人SSH远程连接与网络调试实战指南
宇树G1机器人SSH远程连接与网络调试实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:23:29

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码