You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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插件即可实现统一构建,配置步骤如下:

  1. 根目录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
  1. 调整项目目录结构:
  • 将.jj解析器定义文件放入src/main/javacc目录
  • 手写Java类放入src/main/java对应包路径下

配置完成后:

  • 执行./gradlew build会自动先生成JavaCC解析器代码,再编译所有Java代码
  • 执行./gradlew run会自动完成全量构建并运行启动类

内容的提问来源于stack exchange,提问作者Mystica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:30:02