(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。)

解释器模式的定义是一种按照规定语法进行解析的方案,在现在项目中使用的比较少,其定义如下:
Given a language, define a representation for its grammar along with an interpreter that uses the
representation to interpret sentences in the language.
给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表达式来解释语言中的句子。

解释器角色:
1.AbstractExpression抽象解释器:具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和
NonterminalExpression
2.TerminalExpression终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结
表达式,但有多个实例,对应不同的终结符。
3.NonterminalExpression非终结符表达式:文法中的每条规则对应于一个非终结表达式,非终结符表达式根据逻辑的
复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式
4.Context环境角色

 
 //抽象表达式
/*抽象表达式是生产语法集合(也叫语法树)的关键,每个语法集合完成指定语法解析任务,它是通过递归调用的方式,最终
由最小的语法单元进行解析完成*/
public abstract class Expression{
//每个表达式必须有一个解析任务
public abstract Object interpreter(Context context);
} //终结符表达式 主要是处理场景元素和数据的转换 如:a+b+c中的"a""b""c"
public class TerminalExpression extends Expression{
//通常终结符表达式只有一个,但是有多个对象
public Object interpreter(Context context){
return null;
}
} //非终结符表达式
/*
每个非终结符表达式都代表一个文法规则,并且每个文法规则都只关心自己周边的文法规则结果(注意是结果),因此
这就产生了每个终结符表达式调用自己周边的非终结符表达式,然后最终,最小的文法规则就是终结符表达式,终
结符表达式的概念就是如此,不能在参与比自己更小的文法运算了
*/
public class NonterminalExpression extends Expression{
//每个非终结符表达式都会对其他表达式产生依赖
public NonterminalExpression(Expression... expression){
} public Object interpreter(Context context){
//进行文法处理
return null;
}
} //场景类
public class Client{
public static void main(String[] args){
Context context=new Context();
//通常一个语法容器,容纳一个具体的表达式,通常为ListArray,LinkedList,Stack等类型
Stack<Expression> stack=null;
for(;;){
//进行语法判断,并产生递归调用
}
//产生一个完整的语法树,由各个具体的语法分析进行解析
Expression expression=stack.pop();
//具体元素进入场景
expression.interpreter(context);
}
}

解析器模式的优点:
解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就
可以了,若扩展语法,则只要增加非终结符类就可以了
缺点:
1.解释器模式会引发类膨胀:每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的
类文件,为维护带来了非常多的麻烦。
2.解释器模式采用递归调用方法:每个非终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的
结果,必须一层一层的剥茧,无论是面向过程的语言还是面向对象的语言,递归都是在必要条件下是使用的,它导致
调试非常复杂
3.效率问题:解释器模式由于使用了大量的循环和递归,效率是一个不容忽视的问题
解释器模式使用的场景
1.重复发生的问题可以使用解释器模式
2.一个简单语法需要解释的场景

注意事项
尽量不要再重要的模块中使用解释器模式,否则维护会一个很大的问题。在项目中可以使用shell,jRuby,Groovy
等脚本语言来代替解释器模式,弥补Java编译型语言的不足。

常用的解释器模式工具包:Expression4J,MESP(Math Expression String parser),Jep等开源的解析工具包

解释器模式(Interpreter、Context、Expression)的更多相关文章

  1. 解释器模式 Interpreter 行为型 设计模式(十九)

      解释器模式(Interpreter)   考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做?    你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...

  2. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  3. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  4. C#设计模式:解释器模式(Interpreter Pattern)

    一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...

  5. 16解释器模式Interpreter

    一.什么是解释器模式 Interpreter模式也叫解释器模式,是行为模式之一,它 是一种特殊的设计模式,它建立一个解释器,对于特定 的计算机程序设计语言,用来解释预先定义的文法.简 单地说,Inte ...

  6. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 解释器模式Interpreter详解

    原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  8. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  9. 设计模式之解释器模式(Interpreter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

随机推荐

  1. LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)

    解题思路 有向图最小路径点覆盖问题,有这样的结论就是有向图最小路径点覆盖等于n-拆点二分图中最大匹配.具体怎么证明不太知道..输出方案时找到所有左部未匹配的点一直走$match​$就行了. #incl ...

  2. canvas石英钟

    canvas石英钟:demo <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...

  3. 在Xsheel Linux上安装nodejs和npm

    最近window系统转向linux系统开发,linux系统的确适合程序员的开发. 作为前端安装了nodejs和npm,遇到了一些坑,赶紧记录下来 第一种安装方法:安装nodejs  : sudo  a ...

  4. Python学习day17-常用的一些模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. yii2-user 一个好用的用户扩展

    最近使用yii2做了一个系统,涉及到了用户登录等等,之前是自己写的一套,后来要添加邮箱验证功能.有点懒,然后看到了yii2-user这个扩展.简单说下,毕竟自己研究也不深. http://yii2-u ...

  6. Ln- Linux必学的60个命令

    1.作用 ln命令用来在文件之间创建链接,它的使用权限是所有用户. 2.格式 ln [options] 源文件 [链接名] 3.参数 -f:链结时先将源文件删除. -d:允许系统管理者硬链结自己的目录 ...

  7. Windows API 第六篇 GetLocalTime

    GetLocalTime获取系统时间信息.函数原型:VOID   WINAPI  GetLocalTime(    __out LPSYSTEMTIME lpSystemTime    ); 先来看S ...

  8. ALS算法实现用户音乐打分预测

    很多人在决定是否看一部电影之前都会去豆瓣看下评分作为参考,看完电影也会给一个自己的分数.每个人对每个商品或者电影或是音乐都有一个心理的分数,这个分数标明用户是否对这个内容满意.作为内容的提供方,如果可 ...

  9. Vue 本地代理 纯前端技术解决跨域

    vue-axios获取数据很多小伙伴都会使用,但如果前后端分离且后台没设置跨域许可,那要怎样才能解决跨域问题? 常用方法有几种: 通过jsonp跨域 通过修改document.domain来跨子域 使 ...

  10. struts1 总结吧

    以前都是使用struts2,但是新公司要使用struts1,所有只有硬着头皮上了. 一.Dynamic Method Invoc : 自定义的 Action 必须继承 DispatchAction 而 ...