antlr入门指南
文章目录总体流程下载antlr代码生成器写g4文件执行命令添加maven依赖写编译代码测试总体流程5. 测试验证4. 项目开发与编译3. 生成 Java 代码2. 定义语法规则1. 环境准备开始下载 ANTLR Java 生成器antlr-4.13.2-complete.jar编写 json.g4 文件定义 Lexer 和 Parser 规则包含: STRING, NUMBER, obj, arr, value 等规则执行生成命令java -jar ... -visitor json.g4拷贝生成的 Java 文件到源代码包中添加 Maven 依赖antlr4-runtime 4.9.3编写 Main.java 编译代码实现 CharStream - Lexer - Parser - Visitor/Print准备测试数据 test.json运行 Main 类输出解析结果示例输出:(nameJohn,friends{Tom,Lily})下载antlr代码生成器antlr java下载地址https://github.com/antlr/antlr4/blob/master/doc/java-target.mdhttps://www.antlr.org/download/antlr-4.13.2-complete.jar写g4文件// 语法名称 grammar JSON; // 解析器规则 (小写开头) // 1. 入口规则匹配任何合法的 JSON 值 json : value ; // 2. 定义 JSON 的值类型 value : STRING # StringLiteral // 字符串 | NUMBER # NumberLiteral // 数字 | obj # JsonObject // 对象 | arr # JsonArray // 数组 | true # TrueLiteral // 布尔值 true | false # FalseLiteral // 布尔值 false | null # NullLiteral // null 值 ; // 3. 定义 JSON 对象结构 { key: value, ... } obj : { pair (, pair)* } | { } // 空对象 ; // 4. 定义键值对结构 pair : STRING : value ; // 5. 定义数组结构 [ value, value, ... ] arr : [ value (, value)* ] | [ ] // 空数组 ; // 6. 词法分析规则 (大写开头) // 字符串双引号包围支持转义字符 STRING : (ESC | ~[\\])* ; // 数字支持负数、小数、科学计数法 NUMBER : -? INT (. [0-9])? EXP? ; // 跳过空白字符 (空格, 换行, 制表符) WS : [ \t\n\r] - skip ; // 片段规则 (仅供其他词法规则使用不会单独匹配) // 转义字符处理 fragment ESC : \\ [\\/bfnrt] | UNICODE_ESCAPE ; // Unicode 转义 fragment UNICODE_ESCAPE : \\ u HEX HEX HEX HEX ; // 十六进制字符 fragment HEX : [0-9a-fA-F] ; // 整数部分 fragment INT : 0 | [1-9] [0-9]* ; // 科学计数法 fragment EXP : [Ee] [-]? [0-9] ;执行命令java -jar .\antlr-4.13.2-complete.jar -visitor json.g4然后将获得的java文件拷贝到源代码相应的包中。添加maven依赖dependencygroupIdorg.antlr/groupIdartifactIdantlr4-runtime/artifactIdversion4.9.3/version/dependency写编译代码packagecn.edu.ncepu.antlr;importorg.antlr.v4.runtime.*;importorg.antlr.v4.runtime.tree.ParseTree;importjava.io.IOException;importjava.nio.file.Paths;importjava.util.List;/** * 测试 * 2026-03-02 * * author 醒过来摸鱼 */publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{CharStreaminputCharStreams.fromPath(Paths.get(antlr-learn/test.json));JSONLexerlexEnginenewJSONLexer(input);CommonTokenStreamtokensnewCommonTokenStream(lexEngine);JSONParserjsonParsernewJSONParser(tokens);JSONParser.JsonContextjsonjsonParser.json();System.out.println(print(json.value()));}privatestaticStringprint(ParserRuleContextjson){if(jsoninstanceofJSONParser.StringLiteralContextstring){returnstring.STRING().toString();}if(jsoninstanceofJSONParser.JsonArrayContextjsonArrayContext){returnprint(jsonArrayContext.arr());}if(jsoninstanceofJSONParser.JsonObjectContextjsonObjectContext){returnprint(jsonObjectContext.obj());}if(jsoninstanceofJSONParser.PairContextpairContext){returnpairContext.STRING()print(pairContext.value());}if(jsoninstanceofJSONParser.ArrContextarrContext){ListJSONParser.ValueContextvaluearrContext.value();StringBuilderbuildernewStringBuilder({);booleanfirsttrue;for(JSONParser.ValueContextvalueContext:value){Stringprintprint(valueContext);if(print!null!print.isBlank()){if(first){firstfalse;}else{builder.append(,);}builder.append(print);}}builder.append(});returnbuilder.toString();}StringBuilderbuildernewStringBuilder(();booleanfirsttrue;for(inti0;ijson.getChildCount();i){ParseTreechildjson.getChild(i);if(childinstanceofParserRuleContextcontext){Stringprintprint(context);if(print!null!print.isBlank()){if(first){firstfalse;}else{builder.append(,);}builder.append(print);}}}builder.append());returnbuilder.toString();}}测试我使用的测试数据如下{name:John,friends:[Tom,Lily]}测试结果(nameJohn,friends{Tom,Lily})

相关新闻

为什么有这么多设备树文件

为什么有这么多设备树文件

这些设备树文件是为了适配 RK3568 芯片的不同硬件形态、板卡型号和系统场景 而存在的,本质是 “一套芯片,多种板卡,按需配置”。1. 为什么会有这么多?RK3568 是一颗通用 SoC,瑞芯微和众多厂商(包括 LubanCa…

2026/5/17 7:54:43 阅读更多 →
基于Java+SSM+Flask物流信息管理系统(源码+LW+调试文档+讲解等)/物流软件/信息管理/物流追踪/物流平台/物流系统/运输管理/仓储管理/配送管理/物流解决方案/物流技术/供应链管理

基于Java+SSM+Flask物流信息管理系统(源码+LW+调试文档+讲解等)/物流软件/信息管理/物流追踪/物流平台/物流系统/运输管理/仓储管理/配送管理/物流解决方案/物流技术/供应链管理

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

2026/7/3 16:44:42 阅读更多 →
Java SpringBoot+Vue3+MyBatis web铁路订票管理系统系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis web铁路订票管理系统系统源码|前后端分离+MySQL数据库

摘要 随着现代交通行业的快速发展,铁路运输作为高效、环保的出行方式,其票务管理系统的智能化需求日益增长。传统的铁路票务系统在高峰期往往面临高并发、数据冗余、响应延迟等问题,亟需一套高效、稳定的解决方案。本系统基于前后端分离架构&…

2026/7/4 1:07:56 阅读更多 →

最新新闻

Codex实战指南:从环境配置到高阶用法,打造你的AI编程副驾

Codex实战指南:从环境配置到高阶用法,打造你的AI编程副驾

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在整理本地开发环境时,我翻出了几个几个月前写的脚本,发现里面有些函数逻辑写得相当“奔放”,…

2026/7/5 4:37:17 阅读更多 →
ParsecVDisplay终极指南:免费创建Windows虚拟显示器的完整方案

ParsecVDisplay终极指南:免费创建Windows虚拟显示器的完整方案

ParsecVDisplay终极指南:免费创建Windows虚拟显示器的完整方案 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在Windows电脑上扩展显示空间却不想购买昂贵的物理…

2026/7/5 4:37:17 阅读更多 →
Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher Ketcher作为一款现代化的Web化学结构编辑器,其技术架构体现了对复…

2026/7/5 4:33:16 阅读更多 →
抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用?标题违规和低质标题怎么改 抖店商品标题写不好,会影响审核、搜索理解和买家点击。很多商家从 1688 搬标题时,原标题里带批发词、品牌词、极限词、无关热词,直接上架容易违规,也不一定适合抖店买家…

2026/7/5 4:29:15 阅读更多 →
如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署:终极自动化分析指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论分析而烦恼吗?面对繁琐的笔段划分和中枢识别,传…

2026/7/5 4:27:15 阅读更多 →
接口自动化测试项目框架详解

接口自动化测试项目框架详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 在选择接口测试自动化框架时,需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说,使用Python相关的测试框架更为便捷。无论选…

2026/7/5 4:25:15 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻