当前速看:Go设计模式–解释器模式
2023-05-15 17:14:12来源:清一色财经
在程序中使用解释器模式的目标是: 定义特定于领域的语言及其语法,使用 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(抽象语法树)表示语言中的表达式或句子,好让程序能够根据一组规则或操作解释或评估表达式
最后我们再来列举一下解释器模式的优缺点。 使用解释器模式的优点是:
关注点分离:该模式将解释逻辑与数据表示分开。可扩展性:可以通过添加新的表达式结构轻松地扩展模式。可重用性:解释器模式可以在需要解析或解释特定领域语言的不同项目或上下文中重用。使用解释器模式的缺点是:
复杂性:随着语法规则数量的增加,模式会变得复杂。性能:对于大型表达式,抽象语法树的递归遍历可能很慢。关键词:
责任编辑:hnmd004
-
显卡风扇不转了影响大吗?显卡风扇转好还是不转好?
显卡风扇不转了影响大吗?1、风扇转动主要是使显卡散热,如果在显卡工作是达到一定的温度,风扇会自动转起,控制显卡温度,保护显卡。当低于这一
2023-07-07 15:57:38 -
word文件损坏打不开怎么修复?word文件损坏乱码怎么修复?
word文件损坏打不开怎么修复?1 打开Microsoft Word软件,点击文件菜单,选择打开命令。2 找到损坏的Word文件,选中文件后点击打开按钮
2023-07-07 10:51:03 -
0xc0000005错误代码怎么解决?应用程序0xc0000005是什么错误?
0xc0000005错误代码怎么解决?1、首先按下win+r打开运行,输入regedit按下回车。2、随后依次定位到:HKEY_LOCAL_MACHINE SOFTWARE Microsoft
2023-07-07 10:47:09 -
java环境变量配置后不生效什么原因?怎样看java环境变量是否配置成功?
java环境变量配置后不生效什么原因?1 检查系统是否支持java,即查看java的版本。如果没有安装,需要安装java环境。2 检查配置文件是否正确
2023-07-07 10:43:40 -
ios17什么时候可以更新正式版?ios17什么时候正式推送更新?
ios17什么时候可以更新正式版?ios17正式版预计9月可以更新使用,届时和iPhone15系列新机一起到来。目前,ios17 Beta版在WWDC23发布会结束后
2023-07-07 10:40:52 -
Win11打游戏FPS低怎么办?手机玩游戏帧数低怎么办?
Win11打游戏FPS低怎么办?1、进入Win11系统桌面上,点击开始选择设置进入。2、进入设置界面,点击游戏进入。3、在游戏页面,点击游戏模式进
2023-07-07 10:38:03 -
电脑开不了机怎么办按哪个键?电脑开不了机怎么强制开机?
电脑开不了机怎么办按哪个键?F8:进入 Windows 安全模式。F10:进入 BIOS 设置界面。F11:进入系统恢复界面。Del:进入 BIOS 设置界
2023-07-06 11:14:10 -
显卡风扇不转正常吗?显卡风扇不转怎么解决?
显卡风扇不转正常吗?显卡风扇不转是不正常的。1、灰尘过多可能是显卡上的灰尘太多了,导致堵塞,如果长时间不清理的话,显卡的风扇就会因为
2023-07-06 11:02:33 -
windowshello突然不能用怎么办?windows hello在哪里设置?
windowshello突然不能用怎么办?1、首先按下WIN+R,输入 services msc 回车2、在服务列表中查找 Windows Biometric Service 看这个服
2023-07-06 10:53:30 -
不支持已连接的usb设备怎么解决?无法识别的usb设备是什么意思?
不支持已连接的usb设备怎么解决?需要格式化。USB不支持已连接的设备,是因为U盘文件系统要FAT32格式,需要重新设置U盘格式,先格式化U盘,将U盘
2023-07-06 08:45:03 -
打开dwg格式的软件有哪些?dwg格式文件是什么文件?
打开dwg格式的软件有哪些?1、看图纸DwgSeePlus,一款dwg文件浏览器;2、CAD迷你看图,一款小巧的DWG文件浏览小工具;3、CAD迷你画图,一款CAD
2023-07-06 08:42:40 -
电脑突然没声音了是什么原因?电脑突然没声音了怎么解决?
电脑突然没声音了是什么原因?一起跟着小编来看看吧。电脑没有声音的原因是计算机硬件问题和软件问题,硬件问题主要是声卡坏了,或者输出声
2023-07-05 10:24:15 -
amd是哪个国家的品牌?英特尔和amd哪个厉害?
amd是哪个国家的品牌?amd处理器是美国生产的;美国AMD半导体公司专门为计算机、通信和消费电子行业设计和制造各种创新的微处理器,以及提供
2023-07-05 10:21:36 -
tmp文件可以随便删吗?tmp文件删不掉怎么办?
tmp文件可以随便删吗?是的,可以删除。 tmp文件是一种临时文件,它们通常由操作系统或应用程序创建,以存储暂时数据。一旦完成,它们就会被
2023-07-05 10:19:30 -
mkv格式手机可以看吗?苹果不支持mkv视频吗?
mkv格式手机可以看吗?可以的。 MKV并不是一种压缩格式,而是Matroska的一种媒体文件,是一种多媒体封装格式,或叫多媒体容器。 它可将多种不
2023-07-05 10:16:45 -
电脑开机慢特别卡怎么解决?电脑开机慢系统启动慢什么原因?
电脑开机慢特别卡怎么解决?好多小伙伴不知道如何解决的,那小编就把操作方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。方法一: 减少
2023-07-05 10:11:39 -
zip压缩文件怎么绕过密码?已有的压缩包如何添加密码?
zip压缩文件怎么绕过密码?好多小伙伴不知道的,那小编就来给大家解答一下吧,希望可以帮助到大家吧。1、首先在电脑中,启用英文版nsis,2、
2023-07-05 10:07:06 -
文件后缀隐藏了怎么显示出来?怎么让文件显示扩展名?
文件后缀隐藏了怎么显示出来?一起来看看吧。1、首先,双击打开【计算机】,打开计算机磁盘目录,2、打开后,正常菜单栏是没有显示出来,打
2023-07-04 10:01:15 -
php文件的扩展名是什么?怎么修改php上传文件的大小?
php文件的扩展名是什么?php文件后缀名就是 php文件扩展名和标签为了让服务器来确定我们的PHP文件和脚本,我们必须保存的文件以 php结尾。怎
2023-07-04 09:56:02 -
电脑的文件恢复区在哪里找?恢复文件已损坏怎么办?
电脑的文件恢复区在哪里找?1、1 360文件恢复区打开【360安全卫士】→【木马查杀】,找到并单击左下角的【恢复区】,就可以找到360文件
2023-07-04 09:52:57 -
ipad游戏没有声音怎么回事?ipad打游戏没有声音怎么办?
ipad游戏没有声音怎么回事?1、ipad游戏没有声音可能是忘记开声音或者设置了静音,打开声音或者关闭静音。2、ipad上的游戏设置没有启用声音
2023-07-04 09:42:32 -
电脑快捷方式存在问题是什么原因?快捷方式存在问题怎么解决?
电脑快捷方式存在问题是什么原因?Win11电脑快捷方式可能会出现问题,主要是由于系统更新、病毒感染或者其他原因导致的。快捷方式存在问题怎
2023-07-04 09:34:09 -
DAT是什么文件扩展名?bmp是什么文件扩展名?
DAT是什么文件扩展名? dat文件有两种类型:1、VCD的媒体文件,是数据流格式,可以用一般的视频播放器打开,该类型文件也是MPG格式的,是VCD
2023-07-03 09:48:00 -
mp3文件格式不支持怎么办?mp3格式是什么格式?
mp3文件格式不支持怎么办?是不是好多小伙伴遇到这样的问题不知道如何解决的,那小编就把方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。
2023-07-03 09:44:46 -
任务管理器被禁用怎么解除?任务管理器中没有菜单栏如何解决?
任务管理器被禁用怎么解除?好多小伙伴不知道如何解决的,那小编就把方法给大家解答一下吧,希望可以帮助到大家吧。1、开始 运行 gpedit msc
2023-07-03 09:40:26
精彩推荐
阅读排行
最新资讯
- 电脑淘宝联系不了卖家(电脑淘宝怎么联...
- 图卢兹官方:俱乐部确认将参加下赛季欧联杯
- 第一章 第八节 桑
- 新阶段!北京开放自动驾驶车内无人商业...
- 武汉发布第二批拟供地清单 涉及31宗涉宅用地
- 知乎官宣!“匿名”功能下线
- 联络互动:目前正在加快推进北京联络大...
- 特斯拉“二把手”20天套现近千万!
- 财付通回应30亿罚单:坚决服从和落实,...
- 一成首付可买房,深圳涉事楼盘紧急回应→
- 华为云盘古大模型3.0来了!它为何不做中...
- AI创新成果走进应用场:GE医疗中国发布...
- 国家要“动真格”了?催买房无效后,智...
- 平谷一工业用地顺利成交
- 平谷一物流用地顺利成交
- 从“蔚小理”到“理蔚小”:销量差距背...
- 天智航股东拟合计减持不超2%股份
- 美媒:拜登批准向乌克兰提供违禁武器集...
- 海看股份:公司拥有超过9000小时的超清...
- 中国建筑材料联合会到山东玻纤调研指导工作
- 瑞普生物:猫三联疫苗正在新药申报注册...
- 安居房、人才房成为历史?2023深圳保障...
- 科技感仪式感通通拉满的录取通知书!南...
- 协鑫集成:公司目前订单储备充裕
- 西藏昌都发放购房补贴:干部职工300元/...
- 满足哪些条件可以线上办理公积金提取?...
- 30亿!支付宝、财付通收巨额罚单!
- 福建邵武:鼓励工会组织职工团购商品住...
- 新化首例不动产登记“带押过户”业务成...
- 7月7日大公司动向追踪:蚂蚁、腾讯领百...
- “河西人才节”重磅举措 河西区发布人...
- 把长安CS35 PLUS、吉利缤越压着打,202...
- Plog|长沙这个夏天,热!热!热!热!热!
- 广汇物流:拟定增募资不超18亿元
- 招商蛇口上半年销售约1664亿元 近期新...
- 2023年小暑物企最佳官宣海报:上坤物业
- 为控股股东提供关联担保未按规履行决策...
- 北京汽车:“巅峰”对话谋发展 雪域高...
- 川投能源业绩快报:上半年净利润同比增...
- 中原按揭:新措施促进香港楼市健康发展...
- 上半年宝龙地产销售约176亿元,上坤地产...
- 最新!佛山五区地价TOP10地图出炉,禅桂...
- 新赛股份:控股股东筹划公司控制权变更...
- 中国平安董事会审议通过付欣出任公司副...
- 一周法治播报|第77期:深圳发布四个政府...
- 谁让国内顶流足球红人同台齐聚?
- 2023年矿物制品龙头股有哪些?(2023/7/7)
- 华人健康:拟3.47亿元收购江苏神华100%股份
- 公积金利息可以取出来花吗?怎么操作?
- 房价下跌13%,香港放大招了!刺激楼市,...
- 金融管理部门对蚂蚁集团及旗下机构罚款7...
- 国能日新:董事及监事等拟合计减持不超2...
- 搭载全新发动机,蒙迪欧1.5T车型能否满...
- 贵阳银行:董事会秘书董静辞职
- 深网观察 第761期 | 深圳报业食堂摆...
- 时刻半年!连江将再出让2幅地块!位置在...
- 市区这片将拆迁!补偿政策...
- 45天下线1万台,哈弗枭龙要为新能源SUV...
- 瞄准全场景智慧出行,深蓝汽车要解决行...
- 中国石油北京项目管理公司:给予胡继勇...
- 齐翔腾达:子公司青岛思远8万吨/年甲乙...
- 招商银行:王小青副行长任职资格已获得核准
- cpu带k和f和kf(cpu带k的和带kf有何区别)
- 江苏出台临时用地管理规范性文件 明确...
- 2023年重庆市养老金计发补发时间什么时候?
- 产品力再突破,锋兰达要将“高价值”传...
- 通用电气发布可持续发展报告 多途径助...
- 简阳市市场监管局靠前发力 保障大运会...
- 住建部明确城市更新底线要求 坚持“留...
- 华依科技董事拟减持不超1.5%股份
- 《北京数字经济发展报告(2022~2023)》发布
- 链家,其实遇到了重大瓶颈
- 广汇物流:拟向控股股东等定增募资不超1...
- 保利发展上半年销售2368.21亿元 6月份2...
- 4.19公顷!史各庄这个地块“规划方案”...
- 问界M5标准版亮相,赛力斯要推动智慧汽...
- AI创新院正式成立 游族网络全面推进AI...
- 知乎宣布将下线匿名功能
- 大恒科技(600288.SH):以1.74亿元出售两...
- 冰箱保鲜蔬菜是密封好还是透气好?
- 掌趣科技旗下《饥饿鲨:进化》APP存在过...
- 株洲市三个名师工作室落户八中
- 开展危旧房排查 筑牢安全大根基
- 宣亚国际:公司暂未使用高算力、高传输...
- 格力地产:三亚合联中央商务区项目正在...
- 中南建设:公司西安中南上悦城4月底已完...
- 宋城演艺:公司目前已不持有SPACES任何股权
- 泉峰汽车:收到国内某知名通信科技公司...
- 深圳福彩公益微电影《星光》获国家广电...
- 九安医疗:公司已有专门负责糖尿病诊疗...
- 克而瑞:金科引入长城国富作战投,长实...
- 丰山集团:丰山全诺在钒电池液流电解液...
- 咸宁出台新政!事关老旧小区
- 今年首批!老旧小区改造,涉及昌平两个小区
- “和平方舟”号医院船,西太平洋全流程...
- 木头毛刺用什么打磨抛光(木头毛刺用什...
- 在各地大力推动下 保障性租赁住房筹建...
- 370亿风电龙头腰斩了
- 中秋节发红包多少适合女朋友的
- 13天完成100%签约,7天完成100%搬迁,居...
-
上港集团:方怀瑾因到龄退休辞去公司副总裁职务|天天播资讯
下一篇2023-05-15 17:49:27
-
当前时讯:玻纤稳存量,叶片添增量,隔膜看放量
上一篇2023-05-15 16:34:10