基本介紹
- 在編譯原理中悍缠, -一個(gè)算術(shù)表達(dá)式通過詞法分析器形成詞法單元,而后這些詞法單元再通過語法分析器構(gòu)建語法分析樹诀黍,最終形成-顆抽象的語法分析樹髓抑。這里的詞法分析器和語法分析器都可以看做是解釋器
- 解釋器模式(Interpreter Pattern) :是指給定一一個(gè)語言 (表達(dá)式)咙崎,定義它的文法的一種表示,并定義一個(gè)解釋器吨拍,使用該解釋器來解釋語言中的句子(表達(dá)式)
- 應(yīng)用場景
● 應(yīng)用可以將一個(gè)需要解釋執(zhí)行的語言中的句子表示為一個(gè)抽象語法樹
● 一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來表達(dá)
● 一個(gè)簡單語法需要解釋的場景 - 這樣的例子還有褪猛,比如編譯器、運(yùn)算表達(dá)式計(jì)算羹饰、正則表達(dá)式伊滋、機(jī)器人等
例子:
使用解釋器模式完成加減運(yùn)算
public abstract class Expression {
public abstract int interpret(HashMap<String, Integer> var);
}
public class VarExpression extends Expression{
private String key;
public VarExpression(String key) {
super();
this.key = key;
}
@Override
public int interpret(HashMap<String, Integer> var) {
// TODO Auto-generated method stub
return var.get(this.key);
}
}
public class SymbolExpression extends Expression{
protected Expression left;
protected Expression right;
public SymbolExpression(Expression left, Expression right) {
super();
this.left = left;
this.right = right;
}
@Override
public int interpret(HashMap<String, Integer> var) {
// TODO Auto-generated method stub
return 0;
}
}
public class AddExpression extends SymbolExpression {
public AddExpression(Expression left, Expression right) {
super(left, right);
// TODO Auto-generated constructor stub
}
@Override
public int interpret(HashMap<String, Integer> var) {
// TODO Auto-generated method stub
return super.left.interpret(var)+super.right.interpret(var);
}
}
public class SubExpression extends SymbolExpression{
public SubExpression(Expression left, Expression right) {
super(left, right);
// TODO Auto-generated constructor stub
}
@Override
public int interpret(HashMap<String, Integer> var) {
// TODO Auto-generated method stub
return super.left.interpret(var) - super.right.interpret(var);
}
}
public class Caculator {
Expression expression;
Expression left;
Expression right;
public Caculator(String expStr) {
// TODO Auto-generated constructor stub
Stack<Expression> stack = new Stack<>();
char[] cs = expStr.toCharArray();
for(int i=0; i<cs.length;i++){
switch (cs[i]) {
case '+':
left = stack.pop();
right = new VarExpression(String.valueOf(cs[++i]));
stack.push(new AddExpression(left, right));
break;
case '-':
left = stack.pop();
right = new VarExpression(String.valueOf(cs[++i]));
stack.push(new SubExpression(left, right));
break;
default:
expression = new VarExpression(String.valueOf(cs[i]));
stack.push(expression);
break;
}
}
this.expression = stack.pop();
}
public int run(HashMap<String, Integer> var){
return this.expression.interpret(var);
}
}
public class Client {
public static void main(String[] args) {
String expStr ="a+b-c+d";
HashMap<String, Integer> var = new HashMap<>();
var.put("a", 10);
var.put("b", 50);
var.put("c", 80);
var.put("d", 40);
Caculator caculator = new Caculator(expStr);
System.out.println(caculator.run(var));
}
}
解釋器模式的注意事項(xiàng)和細(xì)節(jié)
- 當(dāng)有一個(gè)語言需要解釋執(zhí)行,可將該語言中的句子表示為一個(gè)抽象語法樹,就可以考慮使用解釋器模式,讓程序具有良好的擴(kuò)展性
- 應(yīng)用場景:編譯器戴卜、運(yùn)算表達(dá)式計(jì)算、正則表達(dá)式燥撞、機(jī)器人等;
- 使用解釋器可能帶來的問題:解釋器模式會引起類膨脹、解釋器模式采用遞歸調(diào)用方法,將會導(dǎo)致調(diào)試非常復(fù)雜物舒、效率可能降低.