amber 口译_口译员设计模式示例

amber 口译

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是口译员设计模式 3.实施口译员设计模式 4.何时使用口译员设计模式 5. JDK中的解释器设计模式 6.下载源代码

1.简介

口译员设计模式是一种重型模式。 这一切都是关于通过创建针对您的编程语言的解释器来组合自己的编程语言,或处理现有的编程语言。 要使用这种模式,您必须对正式语法有一定的了解才能组合一种语言。 可以想象,这是开发人员每天都不会真正使用的模式之一,因为创建自己的语言并不是很多人要做的事情。

例如,就形式语法而言,以新语言定义表达式可能类似于以下代码片段:

expression ::= <command> | <repetition> | <sequence>

这样,您的新语言中的每个表达式都可能由命令,命令的重复和序列表达式组成。 每个项目都可以用解释方法表示为一个对象,以将您的新语言翻译成可以在Java中运行的语言。

为了说明解释器设计模式的用法,我们创建一个示例来解决简单的数学表达式,但是在此之前,让我们在下面的部分中讨论有关解释器设计模式的一些详细信息。

2.什么是口译员设计模式

给定一种语言,请定义其语法的表示形式以及使用该表示形式来解释该语言句子的解释器。

通常,语言由一组语法规则组成。 遵循这些语法规则可以构建不同的句子。 有时,应用程序可能需要处理重复出现的相似请求,这些请求是一组语法规则的组合。 这些请求是不同的,但是从某种意义上来说它们是相似的,因为它们都是使用同一组规则构成的。

一个简单的例子就是提交给计算器程序的一组不同的算术表达式。 尽管每个这样的表达式都不同,但是它们都是使用构成算术表达式语言语法的基本规则构造的。

在这种情况下,代替将每个不同的规则组合视为一个单独的案例,对应用程序来说,具有解释规则的通用组合的能力可能是有益的。 解释器模式可用于在应用程序中设计此功能,以便其他应用程序和用户可以使用由一组语法规则定义的简单语言来指定操作。

可以将类层次结构设计为表示语法规则集,而层次结构中的每个类都表示一个单独的语法规则。 可以将解释器模块设计为解释使用上面设计的类层次结构构造的句子,并执行必要的操作。

因为不同的类代表每个语法规则,所以类的数量随语法规则的数量而增加。 具有广泛而复杂的语法规则的语言需要大量的类。 语法简单时,解释器模式最有效。 具有简单的语法避免了需要具有许多与所涉及的复杂规则集相对应的类,而这些类很难管理和维护。

图1-类图

图1-类图

抽象表达

  • 声明抽象语法树中所有节点共有的抽象Interpret操作。

终端表达

  • 实现与语法中的终端符号关联的Interpret操作。
  • 句子中每个终端符号都需要一个实例。

非末端表达

  • 语法中的每个规则R ::= R1 R2 ... Rn都需要一个这样的类。
  • 为每个符号R1Rn维护类型AbstractExpression实例变量。
  • 对语法中的非终结符实现Interpret操作。 Interpret通常对表示R1Rn的变量进行递归调用。

语境

  • 包含解释器的全局信息。

客户

  • 构建(或给定)抽象语法树,该语法树以语法定义的语言表示特定的句子。 抽象语法树是从NonterminalExpressionTerminalExpression类的实例组装而成的。
  • 调用Interpret操作。

3.实施口译员设计模式

package com.javacodegeeks.patterns.interpreterpattern;public interface Expression {public int interpret();
}

所有不同的具体表达式都使用上面的接口,并且覆盖了解释方法以定义它们在表达式上的特定操作。

以下是特定于操作的表达式类。

package com.javacodegeeks.patterns.interpreterpattern;public class Add implements Expression{private final Expression leftExpression;private final Expression rightExpression;public Add(Expression leftExpression,Expression rightExpression ){this.leftExpression = leftExpression;this.rightExpression = rightExpression;}@Overridepublic int interpret() {return leftExpression.interpret() + rightExpression.interpret();}}
package com.javacodegeeks.patterns.interpreterpattern;public class Product implements Expression{private final Expression leftExpression;private final Expression rightExpression;public Product(Expression leftExpression,Expression rightExpression ){this.leftExpression = leftExpression;this.rightExpression = rightExpression;}@Overridepublic int interpret() {return leftExpression.interpret() * rightExpression.interpret();}
}
package com.javacodegeeks.patterns.interpreterpattern;public class Substract implements Expression{private final Expression leftExpression;private final Expression rightExpression;public Substract(Expression leftExpression,Expression rightExpression ){this.leftExpression = leftExpression;this.rightExpression = rightExpression;}@Overridepublic int interpret() {return leftExpression.interpret() - rightExpression.interpret();}}
package com.javacodegeeks.patterns.interpreterpattern;public class Number implements Expression{private final int n;public Number(int n){this.n = n;}@Overridepublic int interpret() {return n;}}

下面是可选的实用程序类,其中包含用于执行表达式的不同实用程序方法。

package com.javacodegeeks.patterns.interpreterpattern;public class ExpressionUtils {public static boolean isOperator(String s) {if (s.equals("+") || s.equals("-") || s.equals("*"))return true;elsereturn false;}public static Expression getOperator(String s, Expression left,	Expression right) {switch (s) {case "+":return new Add(left, right);case "-":return new Substract(left, right);case "*":return new Product(left, right);}return null;}}

现在,让我们测试示例。

package com.javacodegeeks.patterns.interpreterpattern;import java.util.Stack;public class TestInterpreterPattern {public static void main(String[] args) {String tokenString = "7 3 - 2 1 + *";Stack<Expression> stack = new Stack<>();String[] tokenArray = tokenString.split(" ");for (String s : tokenArray) {if (ExpressionUtils.isOperator(s)) {Expression rightExpression = stack.pop();Expression leftExpression = stack.pop();Expression operator = ExpressionUtils.getOperator(s, leftExpression,rightExpression);int result = operator.interpret();stack.push(new Number(result));} else {Expression i = new Number(Integer.parseInt(s));stack.push(i);}}System.out.println("( "+tokenString+" ): "+stack.pop().interpret());}}

上面的代码将提供以下输出:

( 7 3 - 2 1 + * ): 12

请注意,我们已经使用后缀表达式来解决它。

如果您不了解后缀,则这里有一个简短的介绍。 数学表达式有三种表示法,即中缀,后缀和前缀。

  • 前缀表示法是常用的算术和逻辑公式表示法,其中运算符在它们所作用的操作数之间(例如3+4以infix样式编写。
  • 后缀 (也称为反向波兰语)(RPN)是一种数学符号,其中每个运算符都遵循其所有操作数,例如34+
  • 前缀 (波兰表示法)是一种用于逻辑,算术和代数的表示法,其中运算符在其操作数的左侧,例如+34

中缀表示法是数学表达式中通常使用的符号。 编程语言的解释程序将其他两个符号用作数学表达式的语法。

在上面的类中,我们在tokenString变量中声明了表达式的后缀。 然后,我们拆分tokenString并将其分配给一个数组tokenArray 。 在逐个迭代令牌时,首先我们检查了令牌是运算符还是操作数。 如果令牌是操作数,则将其推入堆栈,但如果是运算符,则从堆栈中弹出前两个操作数。 ExpressionUtilsgetOperation方法根据传递给它的运算符返回适当的表达式类。

然后,我们解释结果并将其推回堆栈。 迭代完整的tokenList我们得到了最终结果。

4.何时使用口译员设计模式

有一种要解释的语言时,请使用解释器模式,并且可以将语言中的语句表示为抽象语法树。 解释器模式在以下情况下效果最佳

  • 语法很简单。 对于复杂的语法,语法的类层次结构变得庞大且难以管理。 在这种情况下,解析器生成器之类的工具是更好的选择。 他们可以解释表达式而无需构建抽象语法树,这样可以节省空间并可能节省时间。
  • 效率不是关键问题。 通常,不是通过直接解释解析树来实现最有效的解释器,而是先将其转换为另一种形式。 例如,正则表达式通常被转换为状态机。 但是即使这样,翻译器也可以通过Interpreter模式实现,因此该模式仍然适用。

5. JDK中的解释器设计模式

  • java.util.Pattern
  • java.text.Normalizer
  • java.text.Format

6.下载源代码

这是关于口译员设计模式的课程。 您可以在此处下载源代码: InterpreterPattern-Project

翻译自: https://www.javacodegeeks.com/2015/09/interpreter-design-pattern.html

amber 口译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络断言断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义&#xff0c;就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 &#xff1c;做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式&#xff0c;商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络C20&#xff08;C 编程语言标准 2020 版&#xff09;将是 C 语言一次非常重大的更新&#xff0c;将为这门语言引入大量新特性。…

小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?

我们如今所处的时代&#xff0c;科技创新的速度日新月异,生活方式多彩多姿。人人都说&#xff1a;科技改变了生活。今晚《开门大吉》也迎来了三大改变生活的神奇黑科技&#xff01;智能且生态的“移动城堡”在网上预定好酒店以后&#xff0c;到了现场没有前台和服务员&#xff…

产品原型示例_原型设计模式示例

产品原型示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;今年 2 月&#xff0c;开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资&#xff0c;同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚&#xff0c;但这个阳光是怎么来的呢&#xff0c;很多人就不一定清楚了。在这里我们首先来了解几个概念&#xff1a;光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子&#xff0c;是一种规范波色子&#xff0c;是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 …

int类型存小数 mysql_MySQL基本数据类型

1&#xff09;整形1.介绍分类&#xff1a;tinyint , smallint , mediumint , int , bigint 应用场景&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等典型存储范围介绍:https://images2017.cnblogs.com/blog/1036857/201708/1036857-201708011814337…

枚举重名_举重设计模式示例

枚举重名本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01…

装饰着模式示例_装饰器设计模式示例

装饰着模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &…

强烈推荐!10个超赞的C语言开源项目

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络今天给大家分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;01WebbenchWebbench是一个在 L…

以外的文件 删除_原来C盘还可以删除这五个文件,难怪电脑越来越卡!

马上就要年底了&#xff0c;大家肯定都是欢欢喜喜准备过年&#xff0c;将家里变得焕然一新。韩博士也捯饬好大包小包打算风风火火赶回家&#xff0c;结果刚打开电脑&#xff0c;哦豁&#xff0c;立马卡到爆炸。想着都年底了&#xff0c;这电脑还打算给我搞出什么幺蛾子&#xf…

设计模式示例_复合设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

给大家收集了一些C语言代码优化的方法!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络在本篇文章中&#xff0c;我收集了很多经验和方法。应用这些经验和方法&#xff0c;可以帮助我们从执行速度和内存使用等方面来…