首页 > 其他分享 >解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)

时间:2023-04-01 12:22:48浏览次数:43  
标签:解释器 终结符 Pattern 文法 语法 Interpreter Expression 表达式

一、概念

解释器模式(Interpreter Pattern) 用于构造一个简单的语言解释器,将字符串按照自定义的方式解释执行 ,是一种不常用的设计模式

  • 除非从事底层开发自己需要去定义较为复杂的表达式,否则基本上不同这个设计模式

二、适用场景

(1)当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域)。

(2)一些重复出现的问题可以用一种简单的语言来进行表达。

(3)一个语言的文法较为简单。

(4)当执行效率不是关键和主要关心的问题时可考虑解释器模式(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。)

三、参与者

解释器模式有以下4种角色

  1. 抽象解释器(Abstract Expression):一般会定义一个解释方法,具体如何解析会交由子类进行实现
  2. 终结符表达式(Terminal Expression):实现语法中与终结符有关的解释操作。语法中每一个终结符都有一个具体的终结符表达式与之相对应
    • 比如我们的R=M+N运算,M和N就是终结符,对应的解析M和N的解释器就是 "终结符表达式"
  3. 非终符结表达式(Nonterminal Expression):实现语法中与非终结符有关的解释操作。语法中的每一条规则都对应了一个非终结符表达式。非终结表达式一般是文法中的运算符或者关键字
    • 如上面公示:R=M+N中的“+”号 就是非终结符,解析“+”号的解释器就是一个 "非终结符表达式"
  4. 上下文环境(Context):包含解释器之外的全局信息。 存储各个解释器需要使用到的数据,或是公共功能。

四、代码例子

一个简单控制小车移动的例子

 该例子中的文法相对比较简单,语法如下所示:

/******************************************************************
 ** expression ::= direction action distance | composite //表达式
 ** composite ::= expression 'and' expression //复合表达式
 ** direction ::= 'up' | 'down' | 'left' | 'right' //移动方向
 ** action ::= 'move' //移动方式
 ** distance ::= an integer //移动距离
 ******************************************************************/

 

抽象解释器(Abstract Expression):AbstractExpression

终结符表达式(Terminal Expression):SentenceExpression

非终符结表达式(Nonterminal Expression):AndNode、DirectionExpression、ActionExpression、DistanceExpression

上下文环境(Context):Context

五、UML图

六、优缺点

(一)优点

(1)易于改变和扩展文法。

(2)每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。

(3)实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。

(4)增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”

(二)缺点

(1)对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。

(2)执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。

标签:解释器,终结符,Pattern,文法,语法,Interpreter,Expression,表达式
From: https://www.cnblogs.com/imreW/p/17278401.html

相关文章

  • SQL Server – 执行计划和各种 join 方式 (Execution plan & Join Pattern)
    What,When,Why?什么是ExecutionPlan?Executionplan里头包含了query执行时的各做information,比如IO速度,查找了多少rows等等为什么要看ExecutionPlan?当query慢的时候,可以通过分析executionplan,知道它为什么慢,然后做优化.怎样优化?优化的方法有......
  • 使用UI Automation实现自动化测试 --微软提供的控件Pattern
    微软提供的控件PatternSystem.Windows.Automation命名空间System.Windows.Automation.BasePattern为控件模式类提供基实现System.Windows.Automation.DockPattern表示在某个停靠容器内公开其停靠属性的控件System.Windows.Automation.ExpandCollapsePatte......
  • Python基本知识(编程语言、数据类型、变量与常量、运算符、格式化输出以及解释器)
    什么是编程语言?编程语言是人类与计算机之间交流的媒介,如Python、go、Java、c语言等等。什么是编程?程序员将自己的逻辑和想法用计算机能够读懂的语言写下来的过程。编程......
  • 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计
    前言设计模式是一种高级编程技巧,也是一种通用的解决方案。它能在不同的应用场景中使用,它可以提高代码的可读性、可复用性和可维护性。设计模式的学习能提高我们的编程能力......
  • DesignPattern-part1
    title:"modernC++DesignPattern-Part1"date:2018-04-03T16:06:33+08:00lastmod:2018-04-03T16:06:33+08:00draft:falsekeywords:[设计模式]tags:[设计模式,C......
  • DesignPattern-part3
    title:"modernC++DesignPattern-Part3"date:2018-04-12T19:08:49+08:00lastmod:2018-04-12T19:08:49+08:00keywords:[设计模式,C++]tags:[设计模式]categorie......
  • DesignPattern-part2
    title:"modernC++DesignPattern-Part2"date:2018-04-10T19:08:49+08:00lastmod:2018-04-11T19:08:49+08:00keywords:[设计模式,C++]tags:[设计模式]categorie......
  • 从0开始自制解释器——添加对括号的支持
    在上一篇我们添加了对乘除法的支持,也介绍了BNF范式,并且针对当前的算术表达式写出了对应的范式,同时根据范式给出相应的代码实现。这篇我们将继续为算数表达式添加对括号的支......
  • 2 - 线程 - Windows 10 - CPython 解释器 - 多线程并行(实际并发)
    @目录一、线程和进程介绍进程基本概念面向线程设计的系统内部解析-用户态/内核态线程基本概念二、对进程线程并发并行的实际运行过程的理解:CPython多线程争抢GIL——......
  • Python安装和解释器
    开始学习Python编程,首先就得把Python安装到你的电脑里。安装后,你会得到Python解释器(就是负责运行Python程序的),一个命令行交互环境,还有一个简单的集成开发环境。安装Python......