「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战」。
一、什么是解释器模式
解释器模式:给定一个语言,定义它的文法表示,并定义一个解释器。解释器用来解释语言中的句子。需要先了解什么是文法,句子,以及语法树。
ps:文法:文法是用于描述语言的语法结构的形式规则。就像我们语文中的句子,要求由主谓宾这样的规则。句子:句子是语言的基本单位,就相当于我们日常说的完整的句子,如:我把树砍了。句子可以由文法推导出来。语法树:句子的树形结构表示,它代表了句子的推导结果。上述只是简单介绍,可以直接学习编译原理进行了解。终结符就是不能在由句子进行推导了,句子是由终结符构成的,比如我把树砍了,我是主语,也是终结符。非终结符就是还可以分解。
二、解释器模式怎么实现
如果有红色或白色花纹,杯子口是园形或者正方形的就是花纹杯。可以分解成颜色and形状,颜色分解为红色或者白色,形状分解为圆形或者正方形。通过杯子的名字进行判断:正方形并且红色杯子,圆形并且白色杯子。
public interface Expression {
boolean interpret(String info);
}
抽象表达式
public class ColorExpression implements Expression{
private final String[] colors = {"红色杯子","白色杯子"};
@Override
public boolean interpret(String info) {
for (String color : colors) {
if (color.equals(info)){
return true;
}
}
return false;
}
}
具体表达式,终结符表达式,判断杯子颜色。
public class ShapeExpression implements Expression{
public final String[] shapes ={"圆形","正方形"};
@Override
public boolean interpret(String info) {
for (String shape : shapes) {
if (shape.equals(info)){
return true;
}
}
return false;
}
}
终结符表达式,判断杯子形状。
public class AndExpression implements Expression {
private Expression colorExpression;
private Expression shapeExpression;
public AndExpression(Expression colorExpression, Expression shapeExpression) {
this.colorExpression = colorExpression;
this.shapeExpression = shapeExpression;
}
@Override
public boolean interpret(String info) {
String[] s = info.split("并且");
return colorExpression.interpret(s[1]) && shapeExpression.interpret(s[0]);
}
}
非总结符表达式,由判断杯子颜色和判断杯子形状组成。
public class Context {
private final Expression andExpression;
public Context() {
ColorExpression colorExpression = new ColorExpression();
ShapeExpression shapeExpression = new ShapeExpression();
andExpression = new AndExpression(colorExpression, shapeExpression);
}
public void judge(String info) {
boolean interpret = andExpression.interpret(info);
if (interpret) {
System.out.println(info + "是花纹杯子");
} else {
System.out.println(info + "不是花纹杯子");
}
}
}
环境,提供了一个判断方法。
public static void main(String[] args) {
Context context = new Context();
String glass1 = "正方形并且红色杯子";
String glass2 = "圆形并且白色杯子";
String glass3 = "圆形并且蓝色杯子";
context.judge(glass1);
context.judge(glass2);
context.judge(glass3);
}
调用judge方法,判断杯子是否为花纹杯子。
三、总结
解释器模式的角色:
- 抽象表达式(abstract expression):包含抽象的解释方法interpret。
- 终结符表达式(terminal expression):抽象表达式的子类,用于实现文法中终结符相关的操作。
- 非终结符表达式(not terminal expression):抽象表达式的子类,用于实现文法中的非终结符相关的操作。
- 环境类(context):用于存储解释器的一些全局信息。