amber 口译_口译员设计模式示例
amber 口譯
本文是我們名為“ Java設(shè)計(jì)模式 ”的學(xué)院課程的一部分。
在本課程中,您將深入研究大量的設(shè)計(jì)模式,并了解如何在Java中實(shí)現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時(shí)以及如何應(yīng)用模式中的每一個(gè)。 在這里查看 !
目錄
1.簡(jiǎn)介 2.什么是口譯員設(shè)計(jì)模式 3.實(shí)施口譯員設(shè)計(jì)模式 4.何時(shí)使用口譯員設(shè)計(jì)模式 5. JDK中的解釋器設(shè)計(jì)模式 6.下載源代碼1.簡(jiǎn)介
口譯員設(shè)計(jì)模式是一種重型模式。 這一切都是關(guān)于通過創(chuàng)建針對(duì)您的編程語言的解釋器來組合自己的編程語言,或處理現(xiàn)有的編程語言。 要使用這種模式,您必須對(duì)正式語法有一定的了解才能組合一種語言。 可以想象,這是開發(fā)人員每天都不會(huì)真正使用的模式之一,因?yàn)閯?chuàng)建自己的語言并不是很多人要做的事情。
例如,就形式語法而言,以新語言定義表達(dá)式可能類似于以下代碼片段:
expression ::= <command> | <repetition> | <sequence>
這樣,您的新語言中的每個(gè)表達(dá)式都可能由命令,命令的重復(fù)和序列表達(dá)式組成。 每個(gè)項(xiàng)目都可以用解釋方法表示為一個(gè)對(duì)象,以將您的新語言翻譯成可以在Java中運(yùn)行的語言。
為了說明解釋器設(shè)計(jì)模式的用法,我們創(chuàng)建一個(gè)示例來解決簡(jiǎn)單的數(shù)學(xué)表達(dá)式,但是在此之前,讓我們?cè)谙旅娴牟糠种杏懻撚嘘P(guān)解釋器設(shè)計(jì)模式的一些詳細(xì)信息。
2.什么是口譯員設(shè)計(jì)模式
給定一種語言,請(qǐng)定義其語法的表示形式以及使用該表示形式來解釋該語言句子的解釋器。
通常,語言由一組語法規(guī)則組成。 遵循這些語法規(guī)則可以構(gòu)建不同的句子。 有時(shí),應(yīng)用程序可能需要處理重復(fù)出現(xiàn)的相似請(qǐng)求,這些請(qǐng)求是一組語法規(guī)則的組合。 這些請(qǐng)求是不同的,但是從某種意義上來說它們是相似的,因?yàn)樗鼈兌际鞘褂猛唤M規(guī)則構(gòu)成的。
一個(gè)簡(jiǎn)單的例子就是提交給計(jì)算器程序的一組不同的算術(shù)表達(dá)式。 盡管每個(gè)這樣的表達(dá)式都不同,但是它們都是使用構(gòu)成算術(shù)表達(dá)式語言語法的基本規(guī)則構(gòu)造的。
在這種情況下,代替將每個(gè)不同的規(guī)則組合視為一個(gè)單獨(dú)的案例,對(duì)應(yīng)用程序來說,具有解釋規(guī)則的通用組合的能力可能是有益的。 解釋器模式可用于在應(yīng)用程序中設(shè)計(jì)此功能,以便其他應(yīng)用程序和用戶可以使用由一組語法規(guī)則定義的簡(jiǎn)單語言來指定操作。
可以將類層次結(jié)構(gòu)設(shè)計(jì)為表示語法規(guī)則集,而層次結(jié)構(gòu)中的每個(gè)類都表示一個(gè)單獨(dú)的語法規(guī)則。 可以將解釋器模塊設(shè)計(jì)為解釋使用上面設(shè)計(jì)的類層次結(jié)構(gòu)構(gòu)造的句子,并執(zhí)行必要的操作。
因?yàn)椴煌念惔砻總€(gè)語法規(guī)則,所以類的數(shù)量隨語法規(guī)則的數(shù)量而增加。 具有廣泛而復(fù)雜的語法規(guī)則的語言需要大量的類。 語法簡(jiǎn)單時(shí),解釋器模式最有效。 具有簡(jiǎn)單的語法避免了需要具有許多與所涉及的復(fù)雜規(guī)則集相對(duì)應(yīng)的類,而這些類很難管理和維護(hù)。
圖1-類圖
抽象表達(dá)
- 聲明抽象語法樹中所有節(jié)點(diǎn)共有的抽象Interpret操作。
終端表達(dá)
- 實(shí)現(xiàn)與語法中的終端符號(hào)關(guān)聯(lián)的Interpret操作。
- 句子中每個(gè)終端符號(hào)都需要一個(gè)實(shí)例。
非末端表達(dá)
- 語法中的每個(gè)規(guī)則R ::= R1 R2 ... Rn都需要一個(gè)這樣的類。
- 為每個(gè)符號(hào)R1到Rn維護(hù)類型AbstractExpression實(shí)例變量。
- 對(duì)語法中的非終結(jié)符實(shí)現(xiàn)Interpret操作。 Interpret通常對(duì)表示R1到Rn的變量進(jìn)行遞歸調(diào)用。
語境
- 包含解釋器的全局信息。
客戶
- 構(gòu)建(或給定)抽象語法樹,該語法樹以語法定義的語言表示特定的句子。 抽象語法樹是從NonterminalExpression和TerminalExpression類的實(shí)例組裝而成的。
- 調(diào)用Interpret操作。
3.實(shí)施口譯員設(shè)計(jì)模式
package com.javacodegeeks.patterns.interpreterpattern;public interface Expression {public int interpret(); }所有不同的具體表達(dá)式都使用上面的接口,并且覆蓋了解釋方法以定義它們?cè)诒磉_(dá)式上的特定操作。
以下是特定于操作的表達(dá)式類。
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;}}下面是可選的實(shí)用程序類,其中包含用于執(zhí)行表達(dá)式的不同實(shí)用程序方法。
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;}}現(xiàn)在,讓我們測(cè)試示例。
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
請(qǐng)注意,我們已經(jīng)使用后綴表達(dá)式來解決它。
如果您不了解后綴,則這里有一個(gè)簡(jiǎn)短的介紹。 數(shù)學(xué)表達(dá)式有三種表示法,即中綴,后綴和前綴。
- 前綴表示法是常用的算術(shù)和邏輯公式表示法,其中運(yùn)算符在它們所作用的操作數(shù)之間(例如3+4以infix樣式編寫。
- 后綴 (也稱為反向波蘭語)(RPN)是一種數(shù)學(xué)符號(hào),其中每個(gè)運(yùn)算符都遵循其所有操作數(shù),例如34+ 。
- 前綴 (波蘭表示法)是一種用于邏輯,算術(shù)和代數(shù)的表示法,其中運(yùn)算符在其操作數(shù)的左側(cè),例如+34 。
中綴表示法是數(shù)學(xué)表達(dá)式中通常使用的符號(hào)。 編程語言的解釋程序?qū)⑵渌麅蓚€(gè)符號(hào)用作數(shù)學(xué)表達(dá)式的語法。
在上面的類中,我們?cè)趖okenString變量中聲明了表達(dá)式的后綴。 然后,我們拆分tokenString并將其分配給一個(gè)數(shù)組tokenArray 。 在逐個(gè)迭代令牌時(shí),首先我們檢查了令牌是運(yùn)算符還是操作數(shù)。 如果令牌是操作數(shù),則將其推入堆棧,但如果是運(yùn)算符,則從堆棧中彈出前兩個(gè)操作數(shù)。 ExpressionUtils的getOperation方法根據(jù)傳遞給它的運(yùn)算符返回適當(dāng)?shù)谋磉_(dá)式類。
然后,我們解釋結(jié)果并將其推回堆棧。 迭代完整的tokenList我們得到了最終結(jié)果。
4.何時(shí)使用口譯員設(shè)計(jì)模式
有一種要解釋的語言時(shí),請(qǐng)使用解釋器模式,并且可以將語言中的語句表示為抽象語法樹。 解釋器模式在以下情況下效果最佳
- 語法很簡(jiǎn)單。 對(duì)于復(fù)雜的語法,語法的類層次結(jié)構(gòu)變得龐大且難以管理。 在這種情況下,解析器生成器之類的工具是更好的選擇。 他們可以解釋表達(dá)式而無需構(gòu)建抽象語法樹,這樣可以節(jié)省空間并可能節(jié)省時(shí)間。
- 效率不是關(guān)鍵問題。 通常,不是通過直接解釋解析樹來實(shí)現(xiàn)最有效的解釋器,而是先將其轉(zhuǎn)換為另一種形式。 例如,正則表達(dá)式通常被轉(zhuǎn)換為狀態(tài)機(jī)。 但是即使這樣,翻譯器也可以通過Interpreter模式實(shí)現(xiàn),因此該模式仍然適用。
5. JDK中的解釋器設(shè)計(jì)模式
- java.util.Pattern
- java.text.Normalizer
- java.text.Format
6.下載源代碼
這是關(guān)于口譯員設(shè)計(jì)模式的課程。 您可以在此處下載源代碼: InterpreterPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/interpreter-design-pattern.html
amber 口譯
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的amber 口译_口译员设计模式示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林徽因的老公是谁(林徽因与丈夫伉俪情深的
- 下一篇: 戴尔集群监控与管理系统_监控与管理