总述
干嘛的呢?用来解释句子的。怎么解释呢?根据特定的语法来解释。该模式就是创建这么个解释器,根据这个特定的语法来解释该句子的。还是太抽象了,到底是干嘛的?很多问题遵循了特定模式,这种模式可以用相同的语法来表示,于是可以通过制造一种解释器来翻译这种语法,使之容易解决。
组成要素
- 终结符:就是不能再被拆分的语法单元。
- 非终结符:从终结符的概念可以推导出非终结符的概念,就是可以再被拆分的语法单元。于是可以知道,非终结符最终可以被拆分成终结符。
- 上下文:可以简单地理解为待翻译的内容。
示例
现在来做个一个加法——1+2,很简单,只不过用来说明一下问题而已,没别的意思。
大致过程
一个复杂的表达式属于非终结符,它接收一个完完全全没有被翻译的内容,然后逐层拆分,这有点类似于递归算法,就是把大问题拆分成小问题,最后再组合。
类图

结果
结果是:3
Process finished with exit code 0
使用
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Expression expression1 = new Terminator(1);
Expression expression2 = new Terminator(2);
Expression expression3 = new NormalExpression(expression1,expression2);
int result = expression3.explain(new Context("+"));
System.out.println("结果是:" + result);
}
}
抽象表达是借口
package com.company;
public interface Expression {
public abstract int explain(Context context);
}
终结符
package com.company;
public class Terminator implements Expression {
private int number;
public Terminator(int number) {
this.number = number;
}
@Override
public int explain(Context context) {
return this.number;
}
}
非终结符
package com.company;
public class NormalExpression implements Expression {
private Expression expression1;
private Expression expression2;
public NormalExpression(Expression expression1, Expression expression2) {
this.expression1 = expression1;
this.expression2 = expression2;
}
@Override
public int explain(Context context) {
if (!context.symbol.equals("")) {
return this.expression1.explain(context) + this.expression2.explain(context);
} else {
return 0;
}
}
}
上下文
package com.company;
public class Context {
public String symbol = "";
public Context(String symbol) {
this.symbol = symbol;
}
}
多谢捧场
如果您觉得我的文章有价值,那么赏脸打赏一个,鄙人感激不尽。不过,不打赏看看也是好的,如果有不对的地方,还请您多多指正。
![]()
网友评论