当前位置:网站首页>行为型模式之解释器模式
行为型模式之解释器模式
2020-11-06 21:35:00 【程序猿欧文】
目录
- 定义与特点
- 结构与实现
- 模式的结构
- 模式的实现
- 应用场景
- 扩展:Expression 表达式树和Flee
在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。
虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率要求不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的,本文将介绍其工作原理与使用方法。
定义与特点
解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。
这里提到的文法和句子的概念同编译原理中的描述相同,“文法”指语言的语法规则,而“句子”是语言集中的元素。例如,汉语中的句子有很多,“我是中国人”是其中的一个句子,可以用一棵语法树来直观地描述语言中的句子。
解释器模式是一种类行为型模式,其主要优点如下:
- 扩展性好:由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
- 容易实现:在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
解释器模式的主要缺点如下:
- 执行效率较低:解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
- 会引起类膨胀:解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
- 可应用的场景比较少:在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。
结构与实现
解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的“文法、句子、语法树”等相关概念。
文法:文法是用于描述语言的语法结构的形式规则。没有规矩不成方圆,任何事情都要有规则,语言也一样,不管它是机器语言还是自然语言,都有它自己的文法规则。例如,中文中的“句子”的文法如下:
〈句子〉::=〈主语〉〈谓语〉〈宾语〉〈主语〉::=〈代词〉|〈名词〉〈谓语〉::=〈动词〉〈宾语〉::=〈代词〉|〈名词〉〈代词〉你|我|他〈名词〉7大学生I筱霞I英语〈动词〉::=是|学习
注:这里的符号“::=”表示“定义为”的意思,用“〈”和“〉”括住的是非终结符,没有括住的是终结符。
句子:句子是语言的基本单位,是语言集中的一个元素,它由终结符构成,能由“文法”推导出。例如,上述文法可以推出“我是大学生”,所以它是句子。
语法树:语法树是句子结构的一种树型表示,它代表了句子的推导结果,它有利于理解句子语法结构的层次。下图所示是“我是大学生”的语法树:

有了以上基础知识,现在来介绍解释器模式的结构就简单了。解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。
模式的结构
解释器模式包含以下主要角色:
- 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定.........
版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4553636
边栏推荐
- Named entity recognition in natural language processing: tanford core LP ner (1)
- Outsourcing is really difficult. As an outsourcer, I can't help sighing.
- 小游戏云开发入门
- For a while, a dynamic thread pool was created, and the source code was put into GitHub
- 事务的隔离级别与所带来的问题
- 代码生成器插件与Creator预制体文件解析
- Simple summary of front end modularization
- How to demote domain controllers and later in Windows Server 2012
- Introduction to the structure of PDF417 bar code system
- Construction of encoder decoder model with keras LSTM
猜你喜欢

每个大火的“线上狼人杀”平台,都离不开这个新功能

Unity性能优化整理

Live broadcast preview | micro service architecture Learning Series live broadcast phase 3

Interface pressure test: installation, use and instruction of siege pressure test

零基础打造一款属于自己的网页搜索引擎

MeterSphere开发者手册

IPFs rudder filecoin landing at the same time, fil currency price broke a thousand

Behind the first lane level navigation in the industry

It's easy to operate. ThreadLocal can also be used as a cache

仅用六种字符来完成Hello World,你能做到吗?
随机推荐
Will blockchain be the antidote to the global epidemic accelerating the transformation of Internet enterprises?
Python基础数据类型——tuple浅析
用一个例子理解JS函数的底层处理机制
Flink的DataSource三部曲之一:直接API
消息队列(MessageQueue)-分析
For a while, a dynamic thread pool was created, and the source code was put into GitHub
C# 调用SendMessage刷新任务栏图标(强制结束时图标未消失)
TensorFlow中的Tensor是什么?
From overseas to China, rancher wants to do research on container cloud market
How to turn data into assets? Attracting data scientists
What are PLC Analog input and digital input
事务的隔离级别与所带来的问题
Interpretation of Cocos creator source code: engine start and main loop
零基础打造一款属于自己的网页搜索引擎
【字节跳动 秋招岗位开放啦】Ohayoo!放学别走,我想约你做游戏!!!
大会倒计时|2020 PostgreSQL亚洲大会-中文分论坛议程安排
Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
百万年薪,国内工作6年的前辈想和你分享这四点
Python基础变量类型——List浅析
Gather in Beijing! The countdown to openi 2020