ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

06-08-设计模式 解释器模式

2022-05-27 19:33:10  阅读:130  来源: 互联网

标签:解释器 06 08 模式 抽象 终结符 设计模式 语法分析 表达式


四则运算问题

通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求

1)先输入表达式的形式,比如a+b+c-d+e,要求表达式的字母不能重复

2)在分别输入a,b,c,d,e的值

3)最后求出结果:如图

传统方案解决四则运算问题分析

1)编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果

2)问题分析:如果加入新的运算符,比如*/(等等,不利于扩展,另外让一个方法来解析会造成程序结构混乱,不够清晰.

3)解决方案:可以考虑使用解释器模式,即:表达式->解释器(可以有多种)->结果

解释器模式

基本介绍

1)在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器

2)解释器模式(InterpreterPattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)

3)应用场景

-应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树

-一些重复出现的问题可以用一种简单的语言来表达

-一个简单语法需要解释的场景

4)这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等

类图

对原理类图的说明-即(解释器模式的角色及职责)

1)Context:是环境角色,含有解释器之外的全局信息.

2)AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享

3)TerminalExpression:为终结符表达式,实现与文法中的终结符相关的解释操作

4)NonTermialExpression:为非终结符表达式,为文法中的非终结符实现解释操作.

5)说明:输入ContextheTerminalExpression信息通过Client输入即可

解释器模式解决

类图

源码剖析

Spring源码

Spring框架中SpelExpressionParser就使用到解释器模式

解释器模式的注意事项和细节

1)当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性

2)应用场景:编译器、运算表达式计算、正则表达式、机器人等

3)使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低.

标签:解释器,06,08,模式,抽象,终结符,设计模式,语法分析,表达式
来源: https://www.cnblogs.com/flower-dance/p/16318890.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有