
解释器模式是一种根据指定语法进行解析的解决方案,在当前项目中很少使用
定义
给出一种语言解释器模式,定义其语法表示形式,并定义一个解释器,该解释器使用该表示形式来解释该语言中的句子

AbstractExpression抽象解释器

具体的解释任务由每个实现类完成,具体的解释器由TerminalExpression和NenterMinalExpression完成
TerminalExpression表达式
为实现与语法中的元素关联的解释操作,通常在解释器模式中只有一个终止符表达式,但是有多个实例对应于不同的终止符. 具体来说,我们的示例是VarExpression类. 表达式中的每个终端都会在堆栈上生成一个VarExperssion对象
NonterminalExpression非终端表达
语法中的每个规则都对应一个非终止表达式. 具体来说,我们的示例是加法和减法规则对应于AddExpression和SubExpression类. 非终端表达式根据逻辑的复杂性而增加. 原则上,每个语法规则都对应一个非终止表达式

上下文环境角色
具体地说,在我们的示例中,使用了HashMap.
公式中只有两个元素: 操作元素和操作符号. 操作元素引用诸如a,b和c之类的符号. 需要特定分配的对象也称为终端符号. 为什么将它们称为终端符号?因为除分配外不需要处理这些元素,所以所有操作元素都对应于特定的业务参数. 这是语法中最小的单位逻辑,不能拆分;操作符号是加减符号,这需要我们编写算法进行处理,每个操作符号必须与处理单元相对应解释器模式,否则公式将无法运行,并且该操作符号也称为非终止符号. 这两种元素的共同点是必须对其进行解析. 区别在于所有操作元素具有相同的功能,并且可以由一个类表示,并且操作符号需要分别解释. 例如,加法需要解析器,而减法则需要减法解析器
//抽象表达式
public abstract class Expression {
//每个表达式必须有一个解析任务
public abstract Object interpreter(Context ctx);
}
//终结符表达式
public class TerminalExpression extends Expression {
//通常终结符表达式只有一个,但是有多个对象
public Object interpreter(Context cxt){
return null;
}
}

通常,终止符表达相对简单,主要处理场景元素和数据的转换
//非终结表达式
public class NonterminalExpression extends Expression {
//每个非终结表达式都会对其他表达式产生依赖
public NonterminalExpression (Expression... expression){
}
public Object interpreter(Context cxts){
//进行文法处理
return null;s\n }
}
每个非终结表达式都表示一个语法规则,并且每个语法规则仅关心语法规则及其周围的结果(请注意结果),因此这会产生每个非终结表达式,并在其周围调用非终结表达式,并且最后,最小的语法规则是最终表达式
//客户类
public class Client {
public static void main(String[] args){
Context ctx = new Context();
Stack<Expression> stack = null;
for(;;){
//进行语法判断,并产生递归调用
}
//产生一个完整的语法树,由各个具体的语法分析进行解析
Expression exp = stack.pop();
//具体元素进入场景
exp.interpreters(ctx);
}
}
口译模式的好处

解释器是一个简单的语法分析工具. 它的明显优势是可扩展性. 如果要修改语法规则,则只需修改相应的非终止表达式. 如果扩展语法,则只需添加非结束符即可. 只是一堂课
解释器模式的缺点
解释器模式将导致类扩展
每个语法都必须产生一个非结束表达式. 当语法规则更加复杂时,可能会生成大量的类文件,并给维护带来很多麻烦
演示: 解释器模式
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-272183-1.html
真空包装
如果说以前让你们来大陆投资是为了发展经济