如何从Java类调用JavaCC解析器及Gradle项目配置方法
JavaCC解析器调用及Gradle集成方案
问题说明
你当前的核心需求是实现两个目标:
- 从独立Java类调用已编写的JavaCC解析器,校验输入格式合法性
- 适配Gradle项目,实现JavaCC与Java代码的统一构建
你编写的parseOneLine方法要求输入必须以换行符<EOL>结束,这是调用时抛出异常的核心原因:你传入的测试字符串2+3没有携带换行符,解析器匹配不到结束标识就会抛出解析异常。
正确对接方式
方案1:不修改原有解析器规则
直接在测试输入末尾补充换行符即可:
import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.charset.StandardCharsets; public class Test { static Calculator parser = null ; public static void main(String args[]) throws ParseException { // 末尾加\n匹配<EOL>规则 String toAnalyze = "2+3\n"; InputStream is = new ByteArrayInputStream(toAnalyze.getBytes(StandardCharsets.UTF_8)); if(parser == null) { parser = new Calculator(is); } else { parser.ReInit(is); } parser.parseOneLine(); } }
方案2:新增专门的外部调用方法(更灵活)
推荐在.jj文件中新增不需要依赖换行符的校验/解析方法,适配不同调用场景:
// 加入到Calculator解析类的jj文件中 boolean validateInput() : {} { expr() <EOF> { return true; } | catch [ParseException e] { return false; } } double calculate() throws ParseException : {} { expr() <EOF> { return $expr.d; } }
修改后调用逻辑更简洁,不需要补换行符:
public class Test { public static void main(String[] args) { String input = "2*(3+5)"; InputStream is = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)); Calculator parser = new Calculator(is); // 校验格式 if (parser.validateInput()) { parser.ReInit(is); // 计算结果 double res = parser.calculate(); System.out.println("计算结果:" + res); } else { System.out.println("输入格式非法"); } } }
Gradle项目配置
使用JavaCC插件即可实现统一构建,配置步骤如下:
- 根目录
build.gradle配置:
plugins { id 'java' id 'application' // 引入JavaCC编译插件 id 'ca.coglinc.javacc' version '2.4.0' } repositories { mavenCentral() } dependencies { implementation 'net.java.dev.javacc:javacc:7.0.12' } sourceSets { main { // 指定javacc源文件存放目录 javacc.srcDir 'src/main/javacc' // 将javacc生成的代码加入Java编译路径 java.srcDir "${buildDir}/generated-sources/javacc" } } // 配置启动类,替换为你自己的启动类全限定名 application { mainClass.set('com.example.Test') } // 配置任务依赖,编译Java前先执行JavaCC代码生成 compileJava.dependsOn compileJavacc
- 调整项目目录结构:
- 将
.jj解析器定义文件放入src/main/javacc目录 - 手写Java类放入
src/main/java对应包路径下
配置完成后:
- 执行
./gradlew build会自动先生成JavaCC解析器代码,再编译所有Java代码 - 执行
./gradlew run会自动完成全量构建并运行启动类
内容的提问来源于stack exchange,提问作者Mystica
相关产品推荐
相关产品推荐

