行为型模式-解释器模式
8.10解释器模式
8.10.1概念
解释器模式用于定义一个语言的文法规则,并解释和执行该语言中的表达式。它通过将语言表达式表示为一个抽象语法树,并提供解释器来遍历和执行该语法树,从而实现对语言的解释和执行
8.10.2场景
例如编译器将源代码作为输入,通过词法分析和语法分析,构建抽象语法树(AST)。然后编译器使用解释器模式来遍历和执行这个抽象语法树,将源代码转换为机器码,并执行该机器码。
8.10.3优势 / 劣势
- 抽象语法树使得算法独立于语法:抽象语法树作为构建解析器的结构,使得解析器的结构和实现与输入的文本语法无关
- 易于单独扩展:由于解析器和语法规则分别通过抽象语法树和上下文无关文本来表示,因此易于单独扩展
- 抽象语法树复杂:若语法规则非常复杂,抽象语法树可能会变得非常大和复杂,可能导致解析器实现和维护变得困难
- 性能不如基于字符的解析器:由于抽象语法树和上下文无关文本都需要存储和解析
8.10.4解释器模式可分为
- 抽象表达式AbstractExpression:定义了解释器的接口,包含了解释器的方法interpret
- 终结符表达式TerminalExpressio:在语法中不能再分解为更小单元的符号
- 非终结符表达式Non-terminalExpression:文法中的复杂表达式,它由终结符和其他非终结符组成
- 上下文Context:包含解释器之外的一些全局信息,可以存储解释器中间结果,也可以用于向解释器传递信息
8.10.5解释器模式
package com.technologystatck.designpattern.mode.interpreter;
public class Interpreters {
public static void main(String[] args) {
Context context = new Context();
Expression expression = new AddException(new TerminalExpression(1), new TerminalExpression(2));
int resulult = expression.interpret();
System.out.println("Result:"+resulult);
System.out.println("Context的全局变量:"+Context.CONTEXTSTR);
}
}
//创建抽象表达式接口:定义解释器的接口,
//声明一个interpret方法,用于解释语言中的表达式
//抽象表达式接口
interface Expression {
int interpret();
}
//创建具体的表达式类:实现抽象表达式接口,
//用于表示语言中的具体表达式
class TerminalExpression implements Expression{
private int value;
public TerminalExpression(int value) {
this.value = value;
}
@Override
public int interpret() {
return value;
}
}
//非终结符表达式:抽象表达式的一种,