ANTLR:使用自定义对象和方法进行表达式评估
ANTLR: expression evaluation with custom object and method
是否可以在 Java 程序内部使用 ANTLR 并使用自定义 类 来执行实际操作?我希望能够解析简单的表达式并为它们执行自定义操作 Java 类.
示例表达式:
((AB1 op1 BC2)op2 BB)
AB1、BC2 和 BB 代表自定义 Java 类 例如 MyObj。 op1 和 op2 是非常简单的操作,可以认为是 + 或 -
假设我有:
interface Operation {
public MyObj operation(MyObj obj1, MyObj obj2);
}
class SomeOperation implements Operation {
public MyObj operation(MyObj obj1, MyObj obj2) {
};
}
class Some2Operation implements Operation {
public MyObj operation(MyObj obj1, MyObj obj2) {
};
}
SomeOperation 指的是 op1,Some2Operation 指的是 op2。
在评估 AB1、BC2 和 BB 的课程实际对象的表达式之前。
如果有 easier/simpler 方法可以完成此任务而不是使用 ANTLR,请告诉我。
编辑:继续...
grammar MyTest;
ID: [a-z]+;
Operator_I: 'I';
Operator_U: 'U';
prog: (expr)* #myProg;
expr: expr op=(Operator_I | Operator_U) expr #myExpr
| ID #myID
| '(' expr ')' #myWithPar
;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.*;
public class EvalVisitor extends MyTestBaseVisitor<Value> {
@Override
public Value visitMyProg(MyTestParser.MyProgContext ctx) {
// TODO Auto-generated method stub
System.out.println("prog:"+ctx.getText());
return super.visitMyProg(ctx);
}
@Override
public Value visitMyWithPar(MyTestParser.MyWithParContext ctx) {
// TODO Auto-generated method stub
System.out.println("par:"+ctx.getText());
return super.visitMyWithPar(ctx);
}
@Override
public Value visitMyID(MyTestParser.MyIDContext ctx) {
// TODO Auto-generated method stub
System.out.println("id:"+ctx.getText());
return super.visitMyID(ctx);
}
@Override
public Value visitMyExpr(MyTestParser.MyExprContext ctx) {
// TODO Auto-generated method stub
System.out.println("expr:"+ctx.getText());
return super.visitMyExpr(ctx);
}
private Map<String, Value> memory = new HashMap<String, Value>();
private Map<String, Value> values = new HashMap<String, Value>();
public EvalVisitor() {
values.put("a", new Value(new Double(5)));
values.put("u", new Value(new Double(9)));
}
}
public static void main(String[] args) throws Exception {
MyTestLexer lexer = new MyTestLexer(new ANTLRFileStream("c:\test.mu"));
MyTestParser parser = new MyTestParser(new CommonTokenStream(lexer));
ParseTree tree = parser.prog();
EvalVisitor visitor = new EvalVisitor();
visitor.visit(tree);
}
test.mu 包含:
(aIu)U(aUu)
程序输出:
prog:(aIu)U(aUu)
expr:(aIu)U(aUu)
par:(aIu)
expr:aIu
id:a
id:u
par:(aUu)
expr:aUu
id:a
id:u
ANTLR 只为您的语言提供解析器。实际的口译员(评估您的输入)由您决定。您可以使用 ANTLR 的访问者轻松创建解释器。可以在此问答中找到演示:If/else statements in ANTLR using listeners
如果您不想自己编写解释器,则需要找到适合您需要的库。有关可用库的列表,请参阅此问答:Evaluating a math expression given in string form
是否可以在 Java 程序内部使用 ANTLR 并使用自定义 类 来执行实际操作?我希望能够解析简单的表达式并为它们执行自定义操作 Java 类.
示例表达式:
((AB1 op1 BC2)op2 BB)
AB1、BC2 和 BB 代表自定义 Java 类 例如 MyObj。 op1 和 op2 是非常简单的操作,可以认为是 + 或 -
假设我有:
interface Operation {
public MyObj operation(MyObj obj1, MyObj obj2);
}
class SomeOperation implements Operation {
public MyObj operation(MyObj obj1, MyObj obj2) {
};
}
class Some2Operation implements Operation {
public MyObj operation(MyObj obj1, MyObj obj2) {
};
}
SomeOperation 指的是 op1,Some2Operation 指的是 op2。
在评估 AB1、BC2 和 BB 的课程实际对象的表达式之前。
如果有 easier/simpler 方法可以完成此任务而不是使用 ANTLR,请告诉我。
编辑:继续...
grammar MyTest;
ID: [a-z]+;
Operator_I: 'I';
Operator_U: 'U';
prog: (expr)* #myProg;
expr: expr op=(Operator_I | Operator_U) expr #myExpr
| ID #myID
| '(' expr ')' #myWithPar
;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.*;
public class EvalVisitor extends MyTestBaseVisitor<Value> {
@Override
public Value visitMyProg(MyTestParser.MyProgContext ctx) {
// TODO Auto-generated method stub
System.out.println("prog:"+ctx.getText());
return super.visitMyProg(ctx);
}
@Override
public Value visitMyWithPar(MyTestParser.MyWithParContext ctx) {
// TODO Auto-generated method stub
System.out.println("par:"+ctx.getText());
return super.visitMyWithPar(ctx);
}
@Override
public Value visitMyID(MyTestParser.MyIDContext ctx) {
// TODO Auto-generated method stub
System.out.println("id:"+ctx.getText());
return super.visitMyID(ctx);
}
@Override
public Value visitMyExpr(MyTestParser.MyExprContext ctx) {
// TODO Auto-generated method stub
System.out.println("expr:"+ctx.getText());
return super.visitMyExpr(ctx);
}
private Map<String, Value> memory = new HashMap<String, Value>();
private Map<String, Value> values = new HashMap<String, Value>();
public EvalVisitor() {
values.put("a", new Value(new Double(5)));
values.put("u", new Value(new Double(9)));
}
}
public static void main(String[] args) throws Exception {
MyTestLexer lexer = new MyTestLexer(new ANTLRFileStream("c:\test.mu"));
MyTestParser parser = new MyTestParser(new CommonTokenStream(lexer));
ParseTree tree = parser.prog();
EvalVisitor visitor = new EvalVisitor();
visitor.visit(tree);
}
test.mu 包含:
(aIu)U(aUu)
程序输出:
prog:(aIu)U(aUu)
expr:(aIu)U(aUu)
par:(aIu)
expr:aIu
id:a
id:u
par:(aUu)
expr:aUu
id:a
id:u
ANTLR 只为您的语言提供解析器。实际的口译员(评估您的输入)由您决定。您可以使用 ANTLR 的访问者轻松创建解释器。可以在此问答中找到演示:If/else statements in ANTLR using listeners
如果您不想自己编写解释器,则需要找到适合您需要的库。有关可用库的列表,请参阅此问答:Evaluating a math expression given in string form