当前位置: 首页 > news >正文

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 类

输出解析结果

示例输出:
("name"="John","friends"={"Tom","Lily"})

下载antlr代码生成器

antlr java下载地址
https://github.com/antlr/antlr4/blob/master/doc/java-target.md

https://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依赖

<dependency><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>4.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{CharStreaminput=CharStreams.fromPath(Paths.get("antlr-learn/test.json"));JSONLexerlexEngine=newJSONLexer(input);CommonTokenStreamtokens=newCommonTokenStream(lexEngine);JSONParserjsonParser=newJSONParser(tokens);JSONParser.JsonContextjson=jsonParser.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){List<JSONParser.ValueContext>value=arrContext.value();StringBuilderbuilder=newStringBuilder("{");booleanfirst=true;for(JSONParser.ValueContextvalueContext:value){Stringprint=print(valueContext);if(print!=null&&!print.isBlank()){if(first){first=false;}else{builder.append(",");}builder.append(print);}}builder.append("}");returnbuilder.toString();}StringBuilderbuilder=newStringBuilder("(");booleanfirst=true;for(inti=0;i<json.getChildCount();i++){ParseTreechild=json.getChild(i);if(childinstanceofParserRuleContextcontext){Stringprint=print(context);if(print!=null&&!print.isBlank()){if(first){first=false;}else{builder.append(",");}builder.append(print);}}}builder.append(")");returnbuilder.toString();}}

测试

我使用的测试数据如下:

{"name":"John","friends":["Tom","Lily"]}

测试结果:

("name"="John","friends"={"Tom","Lily"})
http://www.jsqmd.com/news/430167/

相关文章:

  • 2026年江苏徐州电子皮带秤厂家深度评测与选型指南 - 2026年企业推荐榜
  • Java SpringBoot+Vue3+MyBatis Web就业管理系统系统源码|前后端分离+MySQL数据库
  • SpringBoot+Vue Web及游戏管理平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 2026年天津防火涂料优质厂商选择指南与市场洞察 - 2026年企业推荐榜
  • 前瞻2026:湖北居住区景观工程五大实力公司深度解析与选型指南 - 2026年企业推荐榜
  • 2026年湖北园林工程服务商综合评测与选型指南 - 2026年企业推荐榜
  • 2026年安徽农业科技服务商综合评估:三强谁主沉浮? - 2026年企业推荐榜
  • Java Web 农产品预售平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • KaiwuDB初体验:从安装到性能测试全记录
  • JAVA攻防-内存马技术手搓代码调试反射Tomcat中间件Servlet路由器Valve管道器
  • 394. 字符串解码
  • 梦醒时分
  • RK809调试
  • 为什么有这么多设备树文件
  • 程序员脱单实录:那个在车里跟我表白的代码仔,成了我男朋友
  • Linux的学习之路——进程(二)
  • 【毕业设计】SpringBoot+Vue+MySQL web铁路订票管理系统平台源码+数据库+论文+部署文档
  • SpringBoot+Vue .js高校学生选课系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 2026年口碑好的养殖专用石墨烯地暖/家用石墨烯地暖制造厂家哪家靠谱 - 品牌宣传支持者
  • 2026年评价高的防水石墨烯地暖制造厂家哪家靠谱 - 品牌宣传支持者
  • 2026年质量好的铝合金压铸电池包壳体/铝合金压铸齿轮箱制造厂家哪家靠谱 - 品牌宣传支持者
  • 2026年口碑好的洁净室起重机实力工厂推荐 - 品牌宣传支持者
  • 2026年热门的起重机高口碑品牌推荐 - 品牌宣传支持者
  • 2026年质量好的龙门机床焊接件/五轴机床焊接件实力工厂推荐 - 品牌宣传支持者
  • 2026年衡水日语培训中心深度评测与权威推荐 - 2026年企业推荐榜
  • 2026年比较好的蓄电池电焊机/固态电池电焊机高口碑品牌推荐 - 品牌宣传支持者
  • 2026年评价高的固态电池焊接逆变两用机可靠供应商推荐 - 品牌宣传支持者
  • 《全球算力主权宪章》(The Universal Computational Sovereignty Charter)
  • 《全球算力主权宪章》Global Charter of Computational Sovereignty (GCCS)
  • 基于Java+SSM+Django网上花店系统(源码+LW+调试文档+讲解等)/在线花店系统/网络花店平台/网上订花服务/网上花店软件/网上购买花卉系统/网上鲜花预定系统/网上花店管理系统