如何从简单的 java class 调用 javacc 解析器并执行

How to call the javacc parser from a simple java class and execute

我最近正在学习 javacc 相关概念以及编写标记和解析器。 我能够编写一个解析器,当我在终端中 运行 使用命令 javacc BusParser.jj //BusParser is file name javac *.java java Calculator //计算器是解析器名称 //然后输入input

这里我在运行解析器文件

时传递了一个输​​入文件

这里我想知道如何从另一个单独的 java class 调用此解析器文件,以便我们可以验证用户输入是否与预期格式匹配。

此处给出解析器文件:

options
{
    LOOKAHEAD=2;
}
PARSER_BEGIN(Calculator)
public class Calculator
{
    public static void main(String args[]) throws ParseException
    {
        Calculator parser = new Calculator(System.in);
        while (true)
        {
            parser.parseOneLine();
        }
    }
}
PARSER_END(Calculator)
SKIP :
{
    " "
|   "\r"
|   "\t"
}
TOKEN:
{
    < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? >
|   < DIGIT: ["0"-"9"] >
|   < EOL: "\n" >
}
void parseOneLine():
{
    double a;
}
{
    a=expr() <EOL>      { System.out.println(a); }
  | <EOL>
  | <EOF>               { System.exit(-1); }
}
double expr():
{
    double a;
    double b;
}
{
    a=term()
    (
        "+" b=expr()    { a += b; }
    |   "-" b=expr()    { a -= b; }
    )*
                        { return a; }
}
double term():
{
    double a;
    double b;
}
{
    a=unary()
    (
        "*" b=term()    { a *= b; }
    |   "/" b=term()    { a /= b; }
    )*
                        { return a; }
}
double unary():
{
    double a;
}
{
    "-" a=element()     { return -a; }
|   a=element()         { return a; }
}
double element():
{
    Token t;
    double a;
}
{
    t=<NUMBER>          { return Double.parseDouble(t.toString()); }
|   "(" a=expr() ")"    { return a; }
}

java class

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 //static method
   {
       String toAnalyze = "2+3";
       InputStream is = new ByteArrayInputStream(toAnalyze.getBytes());
       if( parser==null) {
           parser = new Calculator(is);
       }else
           parser.ReInit(is) ;

       parser.parseOneLine();
   }
}

我简单地 运行 尝试了 java 文件。 它抛出以下异常

因此我想知道正确的做法是什么,即连接解析器文件和 java 文件。如果是 gradle 项目,是否需要添加任何构建配置?

另外,如果使用gradle工程,进入时如何同时编译javacc和java gradle 构建和 ./gradlew 运行

您的语法要求表达式后有一个 EOL,因此请尝试 "2+3\n"