简介
解释器模式基本介绍
1)在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过词法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。
2)解释器模式(Interpreter Pattern):是一种行为模式,指给定一个语言表达式,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
角色
抽象表达式角色(Expression):声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称作解释操作。
终结符表达式角色(Terminal Expression):实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面的R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
非终结表达式角色(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。
环境角色(Context):这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息都需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就够了。
简单示例
(不包含终结符表达式角色(Terminal Expression))
1.创建抽象表达式角色(Expression)。
public abstract class Expression {
Context context;
public abstract void interpret(Context context);
}
2.创建所需环境角色(Context)
public class Context {
private String input;
private String output;
public Context(String input) {
this.input = input;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getOutput() {
return output;
}
public void setOutput(String output) {
this.output = output;
}
@Override
public String toString() {
return "Context{" +
"input='" + input + '\'' +
", output='" + output + '\'' +
'}';
}
}
3.创建非终结符表达式(NonterminalExpression)
// -1 表达式
public class Expression1 extends Expression{
@Override
public void interpret(Context context) {
this.context = context;
String input = context.getInput();
int in = Integer.valueOf(input);
context.setOutput(Integer.toString(in - 1));
}
@Override
public String toString() {
return "--"+context.getInput()+"="+context.getOutput();
}
}
//+1 表达式
public class Expression2 extends Expression{
@Override
public void interpret(Context context) {
this.context = context;
String input = context.getInput();
int in = Integer.valueOf(input);
context.setOutput(Integer.toString(in+1));
}
@Override
public String toString() {
return "++"+context.getInput()+"="+context.getOutput();
}
}
4.Client(Main)
public class Main {
public static void main(String[] args) {
Context context = new Context("50");
Expression e1 = new Expression1();
Expression e2 = new Expression2();
e1.interpret(context);
System.out.println(e1.toString());
e2.interpret(context);
System.out.println(e2.toString());
}
}