首页 >热点 > > 正文

Go设计模式–解释器模式 焦点热文

清一色财经 2023-05-15 17:13:31

在程序中使用解释器模式的目标是: 定义特定于领域的语言及其语法,使用 AST(抽象语法树)表示语言中的表达式或句子,好让程序能够根据一组规则或操作解释或评估表达式。


(资料图片仅供参考)

大家好,这里是每周都在陪你一起进步的网管~!今天继续学习设计模式—解释器模式

解释器模式是一种行为设计模式,可以用来在程序里创建针对一个特点领域语言的解释器,用于处理解释领域语言中的语句。换句话说,该模式定义了领域语言的抽象语法树以及用示来解释语法树的解释器。

模式使用场景

解释器模式,用于解决需要解释语言中的句子或表达式的问题。以下是一些可以在 程序中使用解释器模式的真实场景:

处理配置文件

许多应用程序使用配置文件来指定应用程序的行为方式。这些配置文件可以用 YAML 或 JSON 等 DSL 编写。解释器可用于解析这些配置文件并以应用编程语言对象的形式向应用程序提供配置信息。

模板引擎模板引擎处理模板和一组变量以产生输出。模板是DSL的一个例子,可以使用Interpreter来解析和处理模板。数学表达式计算器数学表达式是我们日常都能接触到的,使用了一种特定领域语言语法书写语句或者叫表达式的实例这些表达式在程序里可以使用解释器模式进行解析和解释。例如,计算器应用程序可以使用解释器来解析和评估用户输入的数学表达式。自然语言处理在更高级的情况下,解释器模式可用于解析和解释自然语言,不过这通常会涉及想机器学习这样的更复杂的技术。

虽然解释器模式可以用来解决这些问题,但它并不总是最好的解决方案。对于复杂的语言,使用特定的解析库或工具或其他设计模式可能更有效。

下面我们先来学习一下解释器模式的结构组成,然后再尝试用代码自己实现一个解释器。

模式构成

解释器模式中的关键组件有:

表达式接口:表示抽象语法树的元素并定义解释表达式的方法。具体表达式:实现表达式接口的结构,表示语言语法的各种规则或元素。上下文对象:用于保存解释过程中所需的任何必要信息或状态。Parser 或 Builder:负责根据输入表达式构建抽象语法树的组件。

下面是解释器模式构成的UML类图:

看完解释器模式的结构组成后,我们接下来尝试应用解释器模式,用代码实现一个加法运算的解释器。

实现解释器模式

看了上面解释器的结构组成后我们结下来通过代码一步步实现其核心组件来演示怎么用代码实现解释器模式。

以下是如何在 Go 中实现解释器模式的步骤。

定义表示抽象语法树中元素的表达式接口。创建实现 Expression 接口的具体表达式结构,例如 TerminalExpression 和 NonTerminalExpression。定义一个上下文结构来保存解释过程中可能需要的任何必要数据或状态(这一步可选)。创建解析器或构建器以根据输入表达式构造抽象语法树。 使用创建的抽象语法树和上下文解释表达式。

这里简单实现一个加减的运算器,我们对每种运算定义对应的Expression对象,在方法里实现具体的运算规则,避免所有的运算操作放到一个函数中,这体现了解释器模式的核心思想,将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。

我们先按照上面的步骤一,定义数学运算这一领域语言里表示抽象语法树中元素的表达式接口:

type Expression interface { Interpret() int}

接下来创建Expression接口的具体实现类,在我们的加减法运算中需要实现操作数、加法、减法对应的实现类。

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"type NumberExpression struct { val int}// 解释--返回其整数值func (n *NumberExpression) Interpret() int { return n.val}// 加法运算type AdditionExpression struct { left, right Expression}// 解释--进行加法操作func (n *AdditionExpression) Interpret() int { return n.left.Interpret() + n.right.Interpret()}// 减法运算type SubtractionExpression struct { left, right Expression}// 解释--进行减法运算func (n *SubtractionExpression) Interpret() int { return n.left.Interpret() - n.right.Interpret()}

最后我们创建一个表达式解析器,它会根据输入表达式构造抽象语法树,使用创建的抽象语法树和上下文解释表达式。

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"type Parser struct { exp   []string index int prev  Expression}func (p *Parser) Parse(exp string) { p.exp = strings.Split(exp, " ") for {  if p.index >= len(p.exp) {   return  }  switch p.exp[p.index] {  case "+":   p.prev = p.newAdditionExpression()  case "-":   p.prev = p.newSubtractionExpression()  default:   p.prev = p.newNumberExpression()  } }}func (p *Parser) newAdditionExpression() Expression { p.index++ return &AdditionExpression{  left:  p.prev,  right: p.newNumberExpression(), }}func (p *Parser) newSubtractionExpression() Expression { p.index++ return &SubtractionExpression{  left:  p.prev,  right: p.newNumberExpression(), }}func (p *Parser) newNumberExpression() Expression { v, _ := strconv.Atoi(p.exp[p.index]) p.index++ return &NumberExpression{  val: v, }}// 返回Expression实例// 调用Interpret方法会从右向左递归计算出公式结果func (p *Parser) Result() Expression { return p.prev}

最后,我们用使用 Parse 把客户端传递过来的加减法表达式解析成抽象语法树,然后运行解释器计算加减法表达式的结果。

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"func main() { p := &Parser{} p.Parse("1 + 3 + 3 + 3 - 3") res := p.Result().Interpret() expect := 7 if res != expect {  log.Fatalf("error: expect %d got %d", expect, res) } fmt.Printf("expect: %d, got: %d", expect, res)}

总结

在程序中使用解释器模式的目标是: 定义特定于领域的语言及其语法,使用 AST(抽象语法树)表示语言中的表达式或句子,好让程序能够根据一组规则或操作解释或评估表达式

最后我们再来列举一下解释器模式的优缺点。 使用解释器模式的优点是:

关注点分离:该模式将解释逻辑与数据表示分开。可扩展性:可以通过添加新的表达式结构轻松地扩展模式。可重用性:解释器模式可以在需要解析或解释特定领域语言的不同项目或上下文中重用。

使用解释器模式的缺点是:

复杂性:随着语法规则数量的增加,模式会变得复杂。性能:对于大型表达式,抽象语法树的递归遍历可能很慢。
上一篇:奥伦纳素/Ernolaszlo是哪个国家的品牌_什么档次怎么样 下一篇:最后一页
x
推荐阅读

Go设计模式–解释器模式 焦点热文

2023-05-15

奥伦纳素/Ernolaszlo是哪个国家的品牌_什么档次怎么样

2023-05-15

茉莉智慧发布《中国月子3.0时代白皮书》

2023-05-15

全球看点:让体育场馆释放更多活力

2023-05-15

ChatGPT联动脑机接口,用脑电波回邮件!科幻成真了

2023-05-15

音质卓越,画面逼真——留声机投影 S1重定义视听享受 天天快资讯

2023-05-15

梦见杀猪是什么预兆 女性_梦见杀猪

2023-05-15

焦点速看:同星科技今日申购发行,发行价为31.48元/股

2023-05-15

南沙港式社区要来了!越秀超22亿元拿下庆盛巨无霸商住地 当前动态

2023-05-15

新股中签公布时间:周二有2只新股将公布中签结果(5月16日)

2023-05-15

乙二醇、苯乙烯期权上市交易 大商所期权品种达到13个

2023-05-15

【环球时快讯】万物终结无尽星空原版_万物终结无尽星空

2023-05-15

常州自考成绩查询时间安排(最新)|天天动态

2023-05-15

【全球热闻】银泰黄金:5月12日融资买入2227万元,融资融券余额9.71亿元

2023-05-15

【全球速看料】金都城:周初反弹下挫依旧是目前的主旋律!

2023-05-15

全球热消息:深圳设计周龙华分展场系列活动举行 给城市更新注入设计美学力量

2023-05-15

乙二醇、苯乙烯期权今日上市!来看重点→_当前关注

2023-05-15

筑牢底线思维 增强防灾意识(金台视线·关注防灾减灾(上))

2023-05-15

魔兽世界服务器状态显示不兼容_登陆魔兽世界游戏 服务器列表显示不兼容 是啥意思

2023-05-15

新鲜组织标本如何保存 新鲜组织标本怎么保存 环球新视野

2023-05-14

当前焦点!authorware课件模板_求authorware课件优秀作品

2023-05-14

高质量发展调研行丨为优化营商环境“划重点” 上海吸引企业“近悦远来” 环球资讯

2023-05-14

海南省陵水县发布暴雨红色预警_重点聚焦

2023-05-14

世界百事通!美元面临的危险比以往都大

2023-05-14

世界通讯!任娇奔跑吧兄弟哪一期出场_任娇奔跑吧兄弟哪一期

2023-05-14

美国贸易战损招造成多输局面——起底美国贸易战反智本质述评之一

2023-05-14

河北省邯郸市发布雷电黄色预警 当前看点

2023-05-14

杨晓燕扮演者(乡村爱情中杨晓燕的扮演者是关婷娜)

2023-05-14

【快播报】长沙104所民校承诺守好办学“红线”

2023-05-14

抖音看不了评论是什么原因_抖音看不了评论怎么解决_头条

2023-05-14

心率和步数都有可能是犯罪证据?智能家居信息已被用于助力破案

2023-05-14

从汶川地震活下来的95后大学生,因为卖苹果火了

2023-05-14

5首五年级的古诗词有哪些 五年级的古诗词有哪些 每日看点

2023-05-14

越跌越买!万亿巨头彻底火了,外资加仓超1亿股!|环球观点

2023-05-14

初二暑假计划表详细_暑假锻炼计划表-全球快讯

2023-05-14

黛比罗的结婚照片 黛比罗 动态焦点

2023-05-14

天天观天下!深大内部网内部网_深大内部网

2023-05-14

世界聚焦:资产负债率过高的风险

2023-05-13

速递!还记得《继承者们》里的崔英道吗?他的新剧来啦

2023-05-13

又一服饰纺织企业跨界新能源!报喜鸟入局新储能项目

2023-05-13

世界热头条丨高知女性的不同发展 孟羽童从格力离职 Jinx周君怡与海尔展开合作

2023-05-13

全球关注:致球迷歌迷的一封信

2023-05-13

世界今头条!海港内讧后续:巴尔加斯已向主帅公开道歉 预计很快加入合练

2023-05-13

南京警方寻人 环球热消息

2023-05-13

英媒:英力士董事长拉特克里夫接近收购曼联足球俱乐部 世界新资讯

2023-05-13

【环球新要闻】面对镜头中的官员,我们该关注什么

2023-05-13

温州到杭州动车时刻表(温州到杭州)-世界观察

2023-05-13

“5·18国际博物馆日”广东全省公益博物馆全部免费开放|当前热闻

2023-05-13

南华医院3名优秀护士获湖南省护理学会第三届优秀护士奖

2023-05-13

【世界热闻】泓淋电力05月12日获深股通增持7.32万股

2023-05-13

摩根大通CEO:银行业危机需要尽快结束 “懂王”其实不懂债务上限!

2023-05-13

讯飞星火认知大模型有多“火”?AI智能生活方式来了!-热闻

2023-05-13

早餐吃什么菜最健康最好

2023-05-13

环球今日报丨斯玛特谈赢G6:这是我们最后的机会 不想赛后讲自己本可以做更多

2023-05-13

中国教育学会教育督导分会第五届理事会换届大会举行

2023-05-12

红楼梦:贾琏内惧娇妻,外惧娈宠,到底是哪个娈宠这么厉害 今日热文

2023-05-12

《长空之王》再获央媒力挺,实拍细节曝光:普通人上去就得吐

2023-05-12

官方:切尔西女足前锋科尔当选FWA赛季最佳女足球员

2023-05-12

江夏区住建局开展“武汉以我为荣·小行大爱”主题活动-最新

2023-05-12

天天时讯:5家重组新生银行“交卷”

2023-05-12

吴前今日拍片诊断后显示肋骨出现骨折 目前疼痛感强烈

2023-05-12

肩膀酸沉是什么原因

2023-05-12

环球微速讯:kelme官方_kemet中文官网

2023-05-12

即时物流 蓬勃兴起 每日快播

2023-05-12

5月12日永泰运涨停分析:快递物流,长三角一体化概念热股 简讯

2023-05-12

黄河独钓者的直播间2023年5月12日公益直播

2023-05-12

先锋喜剧《狮子的秘密》将为观众带来脑洞大开的欣赏体验

2023-05-12

马卡盘点哈兰德的豪车:钟爱SUV,有库里南、路虎揽胜运动版等

2023-05-11

危险驾驶罪会开除公职吗_全球速读

2023-05-11

理想汽车港股涨17.07%

2023-05-11

老凤祥银手镯会铅超标吗_老凤祥银手镯-世界热议

2023-05-11

隆基绿能:与韩华正式达成专利交叉许可 撤销双方之间所有诉讼及专利无效程序-天天速递

2023-05-11

今日聚焦!csgo在哪开箱比较好 csgo首次免费开箱网站排行榜

2023-05-11

全球速讯:外交部:七国集团恰恰是违反、破坏国际规则的代表

2023-05-11

俄外交部:美国面临债务违约风险已成美式仪式

2023-05-11

被裁定性侵第二天,特朗普现身拉选票_今日热讯

2023-05-11

12寸蛋糕多大尺寸 12寸蛋糕多大

2023-05-11

每日聚焦:天舟六号货运飞船发射任务取得圆满成功

2023-05-11

娱圈“假面夫妻”的瓜!离婚28年仍装恩爱圈钱

2023-05-11

4月份中国PPI同比下降3.6% 环比下降0.5%_新视野

2023-05-11

ST美置:公司目前没有所属物业资产

2023-05-11

深蓝智库年度峰会|中国康复医学学会会长陈立典:通过科技创新提高慢性病和老年人康复服务能力|快消息

2023-05-11

逆行?不行!

2023-05-11

金观平:传统产业“简单退出”不可取-环球快资讯

2023-05-11

加拿大阿尔伯塔省生产商重启油气项目 热点

2023-05-11

快资讯:小学生历史读物现“丁汝昌投降图”?多位皖籍文史学者谴责:严重扭曲历史事实,颠倒黑白

2023-05-11

每日精选:美国“婴儿潮一代”的退休困境:没储蓄又遇到通胀该怎么办?

2023-05-11

奥特曼:特利迦设计造型,借鉴迪迦盖亚,网友:令和最帅战士-全球观天下

2023-05-11

养老保险交15年后可以领多少年-天天观速讯

2023-05-11

《宇宙探索编辑部》:中国科幻电影的另外一种可能_环球快看点

2023-05-11

积极应对挑战 探索项目发展(竞技观察)

2023-05-11

肯尼亚国际问题专家:美国监视盟友行为可耻 应自我反省 天天报资讯

2023-05-11

中估协网站(中估协官网) 环球头条

2023-05-11

【环球快播报】「每日一习话」提高公共服务可及性和均等化水平

2023-05-11

新闻丨百余家头部机构关注,武汉新城开启公募市场大门,资金将注入重点项目建设_世界速看

2023-05-10

刘水:房企融资又现凉意,需在供需双向加力

2023-05-10

全球观点:什么昵称好听_最好听的网名大全

2023-05-10

阿仑膦酸维d3片的作用和禁忌_阿仑膦酸钠维d3片是什么药

2023-05-10

焦点观察:水货马莱莱双响!申花3-1深圳,开局6轮不败,争冠第一热门

2023-05-10

福建龙岩:找到3名防汛巡查中落水失联干部 均无生命体征|环球热消息

2023-05-10