什么是解析器模式
给定一种语言,定义它的文法表示,并定义一个解释器,该解释器使用该表示来解释语言中句子(通过解析器解析自定义的表达式返回解析后的信息)
示例图
图片.png示例场景
使用自定义的表达式进行相加 相减操作。
比如:e1=2 e2=8 e3=6, e1+e2=10, e2-e3=2, e1+e2-e3=4
示例代码
1.创建Expression解析器接口
public interface Expression {
int interpreter(Context context);
}
2.创建Context上下文类
public class Context {
private Map<Expression, Integer> map = new HashMap<>();
//添加解析器对象
public void add(Expression s, Integer value){
map.put(s, value);
}
//获取解析后的值
public int getValue(Expression s){
return map.get(s);
}
}
3.创建TerminalExpression终结表达式
public class TerminalExpression implements Expression{
@Override
public int interpreter(Context context) {
return context.getValue(this);
}
}
4.创建NonTerminalExpression非终结表达式
public abstract class NonTerminalExpression implements Expression{
Expression e1,e2;
public NonTerminalExpression(Expression e1, Expression e2){
this.e1 = e1;
this.e2 = e2;
}
}
5.创建非终结表达式实现类PlusOperation相加操作和MinusOperation相减操作
public class PlusOperation extends NonTerminalExpression {
public PlusOperation(Expression e1, Expression e2) {
super(e1, e2);
}
//将两个表达式相加
@Override
public int interpreter(Context context) {
return this.e1.interpreter(context) + this.e2.interpreter(context);
}
}
public class MinusOperation extends NonTerminalExpression {
public MinusOperation(Expression e1, Expression e2) {
super(e1, e2);
}
//将两个表达式相减
@Override
public int interpreter(Context context) {
return this.e1.interpreter(context) - this.e2.interpreter(context);
}
}
6.创建Client启动类
public class Client {
public static void main(String[] args) {
Context context = new Context();
TerminalExpression e1 = new TerminalExpression();
TerminalExpression e2 = new TerminalExpression();
TerminalExpression e3 = new TerminalExpression();
context.add(e1, 2);
context.add(e2, 8);
context.add(e3, 6);
System.out.println("------------------------------表达式相减操作");
MinusOperation minusOperation = new MinusOperation(e1, e2);
System.out.println(minusOperation.interpreter(context));
System.out.println("------------------------------表达式相加操作");
PlusOperation plusOperation = new PlusOperation(e1,e3);
System.out.println(plusOperation.interpreter(context));
System.out.println("------------------------------表达式先加再减操作");
Expression expression = new MinusOperation(new PlusOperation(e1, e2), e3);
System.out.println(expression.interpreter(context));
}
}
7.运行结果
图片.png
网友评论