如何从简单的 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"
。
我最近正在学习 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"
。