模式定义

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

类图

要点总结

  • Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的结构不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式
  • 使用interpreter模式来表示文法规则,从而可以使用面向对象技巧来方便地“扩展”文法
  • Interpreter模式比较适合简单的文法表示,对于复杂的文法表示,Interpreter模式会产生比较大的类层次结构,需要求助于语法分析生成器这样的标准工具

Go语言代码实现

工程目录

Interpretor.go

package Interpreterimport "strings"type Expression interface {Interpret(variables map[string]Expression)int
}type Interger struct {integer int
}func (n *Interger) Interpret(variables map[string]Expression) int {return n.integer
}type Plus struct {leftOperand ExpressionrightOperand Expression
}func (p *Plus) Interpret(variables map[string]Expression) int {return p.leftOperand.Interpret(variables) + p.rightOperand.Interpret(variables)
}func (e Evaluator) Interpret(variable map[string]Expression)int{return e.syntaxTree.Interpret(variable)
}type Variable struct {name string
}type Node struct {value interface{}next *Node
}type Stack struct {top *Nodesize int
}func (s *Stack) Push (value interface{}){s.top= &Node{value: value,next:  s.top,}
}func (v *Variable) Interpret(variable map[string]Expression)int {value, found := variable[v.name]if !found {return 0}return value.Interpret(variable)
}func (s *Stack) Pop() interface{} {if s.size == 0{return nil}value := s.top.values.top = s.top.nexts.size--return value
}type Evaluator struct {syntaxTree Expression
}
func NewEvaluator(expression string) *Evaluator{expressionStack := new(Stack)for _, token := range strings.Split(expression, " ") {switch token {case "+":right := expressionStack.Pop().(Expression)left := expressionStack.Pop().(Expression)subExpression := &Plus{left, right}expressionStack.Push(subExpression)default:expressionStack.Push(&Variable{token})}}syntaxTree := expressionStack.Pop().(Expression)return &Evaluator{syntaxTree: syntaxTree}
}

Interpretor_test.go

package Interpreterimport ("fmt""testing"
)func TestInterger(t *testing.T) {expression := "w x z +"sentence := NewEvaluator(expression)variables := make(map[string]Expression)variables["w"] = &Interger{6}variables["x"] = &Interger{10}variables["z"] = &Interger{41}result := sentence.Interpret(variables)fmt.Println(result)
}

设计模式--解析器(Interpreter)模式相关推荐

  1. vscode如何添加本地python解释器、解析器 Interpreter?(Python: Select Interpreter)

    先安装python扩展 然后点ctrl+shift+p搜索python:select,选择解析器(或者也可以直接点左下方的) 然后360报毒了,允许通过,然后选择你想要的解释器 然后就好了

  2. 设计模式C++实现--Interpreter模式

    2019独角兽企业重金招聘Python工程师标准>>> 解释器模式 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式 ...

  3. 代码精进之路-设计模式-拦截器链模式

    上一讲中说了<Tomcat的过滤器链 是如何实现的>,今天来看下 Spring的拦截器链是如何实现的. 从位置上来说 过滤器是属于Servlet容器级别的规范,拦截器是Spring自身的东 ...

  4. 设计模式--访问器(Visitor)模式

    模式定义 表示一个作用于某对象结构中的各元素的操作,使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化) 类图 要点总结 Visitor模式通过所谓双重分发(doubl ...

  5. 设计模式之略见一斑(解释器模式Interpreter)

    解释器模式是一种比较难理解的模式,但如果你对Command(命令模式)和Composite(组合模式)很了解的话,你会发现其实解释器模式就是这两种的组合.为何要使用解释器模式,如何用解释器模式呢,这就 ...

  6. 【第二十一讲】参数解析器

    [第二十一讲]参数解析器 文章目录 [第二十一讲]参数解析器 1-常见参数解析器 2-组合模式在 Spring 中的体现 总结 常见参数解析器 组合模式在 Spring 中的体现 ${} #{} 小技 ...

  7. 设计模式学习(四):基于Builder模式的歌词解析器

    一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...

  8. php 解析器模式,娓娓道来:解析器模式-interpreter

    解析器模式:解析脚本的语言解析器. php源于c语言,其实是用c语言解析了php脚本,那么php有是如何解析其他语言的呢,看看面向对象的魅力所在吧. 现在解析这样一句话: $input equals ...

  9. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

最新文章

  1. 搭建Hexo部署到github上
  2. JMeter进阶系列01--JMeter二次开发
  3. 法媒评马云996:亚洲独有的洗脑我们不懂
  4. 图片日志:泛型的作用/hashset的内部实现/常见运行期异常
  5. 生理性玻璃体混浊的分类与预防控制
  6. 什么是mysql索引文件_数据库索引文件一般采用什么数据结构?
  7. 小米拒绝权限_小米手机MIUI12真有那么好吗?
  8. 编译安装python3.6_编译安装Python3.6及以上
  9. Sql Server中判断日志是否为一个星期
  10. CVE-2016-3714-ImageMagick 漏洞利用
  11. java读取excel模板并复制_POI复制Excel模板并填充数据
  12. 利用PS和抠图软件轻松换证件照背景
  13. 《逻辑学概论》mooc
  14. 时间序列预测系列文章总结(代码使用方法)
  15. mysql空洞_Mysql 表空间和 数据页空洞
  16. html可以简写的属性,css有哪些缩写属性?
  17. 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
  18. 前端:3分钟实现一个共享桌面,还能听见麦克风声音哦
  19. 我欲封神——JAVA封神之路
  20. 2021-3-21-第三周

热门文章

  1. python3.8安装pygame_Python3.8安装Pygame教程步骤详解
  2. Paper:《NÜWA: Visual Synthesis Pre-training for Neural visUal World creAtion,女娲:用于神经视觉世界创造的视觉》翻译与解读
  3. DL之模型调参:深度学习算法模型优化参数之对深度学习模型的超参数采用网格搜索进行模型调优(建议收藏)
  4. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
  5. C++:Windows环境下基于Eclipse配置C/C++开发环境
  6. Dataset之HiggsBoson:Higgs Boson(Kaggle竞赛)数据集的简介、下载、案例应用之详细攻略
  7. ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)
  8. jquery iCheck 插件
  9. js中的arguments 参数
  10. 领域驱动设计(2)怎么使用沟通