日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

口译员设计模式示例

發(fā)布時間:2023/12/3 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 口译员设计模式示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文是我們名為“ Java設(shè)計模式 ”的學(xué)院課程的一部分。

在本課程中,您將深入研究大量的設(shè)計模式,并了解如何在Java中實(shí)現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應(yīng)用模式中的每一個。 在這里查看 !

目錄

1.簡介 2.什么是口譯員設(shè)計模式 3.實(shí)施口譯員設(shè)計模式 4.何時使用口譯員設(shè)計模式 5. JDK中的解釋器設(shè)計模式 6.下載源代碼

1.簡介

口譯員設(shè)計模式是一種重型模式。 這一切都是關(guān)于通過創(chuàng)建針對自己的編程語言的解釋器來組合自己的編程語言,或處理現(xiàn)有的編程語言。 要使用這種模式,您必須對正規(guī)語法有一定的了解,才能將一種語言組合在一起。 可以想象,這是開發(fā)人員每天都不會真正使用的模式之一,因?yàn)閯?chuàng)建自己的語言并不是很多人要做的事情。

例如,就形式語法而言,以新語言定義表達(dá)式可能類似于以下代碼片段:

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

那么,使用新語言的每個表達(dá)式可能由命令,命令的重復(fù)和序列表達(dá)式組成。 每個項(xiàng)目都可以使用解釋方法表示為一個對象,以將您的新語言翻譯成可以在Java中運(yùn)行的語言。

為了說明解釋器設(shè)計模式的用法,我們創(chuàng)建一個示例來解決簡單的數(shù)學(xué)表達(dá)式,但在此之前,讓我們在下面的部分中討論有關(guān)解釋器設(shè)計模式的一些詳細(xì)信息。

2.什么是口譯員設(shè)計模式

給定一種語言,請定義其語法的表示形式,以及使用該表示形式來解釋該語言句子的解釋器。

通常,語言由一組語法規(guī)則組成。 遵循這些語法規(guī)則可以構(gòu)建不同的句子。 有時應(yīng)用程序可能需要處理重復(fù)出現(xiàn)的相似請求,這些請求是一組語法規(guī)則的組合。 這些請求是不同的,但從某種意義上來說它們是相似的,因?yàn)樗鼈兌际鞘褂猛唤M規(guī)則構(gòu)成的。

一個簡單的例子就是提交給計算器程序的一組不同的算術(shù)表達(dá)式。 盡管每個這樣的表達(dá)式都不同,但是它們都是使用構(gòu)成算術(shù)表達(dá)式語言語法的基本規(guī)則構(gòu)造的。

在這種情況下,代替將每個不同的規(guī)則組合視為一個單獨(dú)的案例,對應(yīng)用程序來說,具有解釋規(guī)則的通用組合的能力可能是有益的。 解釋器模式可用于在應(yīng)用程序中設(shè)計此功能,以便其他應(yīng)用程序和用戶可以使用由一組語法規(guī)則定義的簡單語言來指定操作。

可以將類層次結(jié)構(gòu)設(shè)計為表示語法規(guī)則集,而層次結(jié)構(gòu)中的每個類都表示一個單獨(dú)的語法規(guī)則。 可以將解釋器模塊設(shè)計為解釋使用上面設(shè)計的類層次結(jié)構(gòu)構(gòu)造的句子,并執(zhí)行必要的操作。

由于每個語法規(guī)則都代表一個不同的類別,因此類別的數(shù)量會隨著語法規(guī)則的數(shù)量而增加。 具有廣泛而復(fù)雜的語法規(guī)則的語言需要大量的類。 語法簡單時,解釋器模式最有效。 具有簡單的語法避免了需要具有許多與所涉及的復(fù)雜規(guī)則集相對應(yīng)的類,而這些類很難管理和維護(hù)。

圖1-類圖

抽象表達(dá)

  • 聲明抽象語法樹中所有節(jié)點(diǎn)共有的抽象Interpret操作。

終端表達(dá)

  • 實(shí)現(xiàn)與語法中的終端符號關(guān)聯(lián)的Interpret操作。
  • 句子中每個終端符號都需要一個實(shí)例。

非末端表達(dá)

  • 語法中的每個規(guī)則R ::= R1 R2 ... Rn都需要一個這樣的類。
  • 為每個符號R1到Rn維護(hù)類型AbstractExpression實(shí)例變量。
  • 為語法中的非終結(jié)符實(shí)現(xiàn)Interpret操作。 Interpret通常對表示R1到Rn的變量進(jìn)行遞歸調(diào)用。

語境

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

客戶

  • 構(gòu)建(或給定)抽象語法樹,該語法樹以語法定義的語言表示特定的句子。 抽象語法樹是根據(jù)NonterminalExpression和TerminalExpression類的實(shí)例組裝而成的。
  • 調(diào)用Interpret操作。

3.實(shí)施口譯員設(shè)計模式

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

所有不同的具體表達(dá)式都使用上面的接口,并且覆蓋了解釋方法以定義它們在表達(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)在,讓我們測試示例。

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

請注意,我們已使用后綴表達(dá)式來解決它。

如果您不了解后綴,則這里有一個簡短的介紹。 數(shù)學(xué)表達(dá)式有三種表示法,即中綴,后綴和前綴。

  • 前綴表示法是常用的算術(shù)和邏輯公式表示法,其中運(yùn)算符在它們所作用的操作數(shù)之間(例如3+4以infix樣式編寫。
  • 后綴也稱為反向波蘭表示法(RPN)是一種數(shù)學(xué)表示法,其中每個運(yùn)算符都遵循其所有操作數(shù),例如34+ 。
  • 前綴 (波蘭表示法)是一種用于邏輯,算術(shù)和代數(shù)的表示法,其中運(yùn)算符位于其操作數(shù)的左側(cè),例如+34 。

Infix表示法通常在數(shù)學(xué)表達(dá)式中使用。 編程語言的解釋程序?qū)⑵渌麅蓚€符號用作數(shù)學(xué)表達(dá)式的語法。

在上面的類中,我們在tokenString變量中聲明了表達(dá)式的后綴。 然后,我們拆分tokenString并將其分配到一個數(shù)組tokenArray 。 在逐個迭代令牌時,首先我們檢查了令牌是運(yùn)算符還是操作數(shù)。 如果令牌是操作數(shù),則將其推入堆棧,但如果是運(yùn)算符,則從堆棧中彈出前兩個操作數(shù)。 ExpressionUtils的getOperation方法根據(jù)傳遞給它的運(yùn)算符返回適當(dāng)?shù)谋磉_(dá)式類。

然后,我們解釋結(jié)果并將其推回堆棧。 迭代完整的tokenList我們得到了最終結(jié)果。

4.何時使用口譯員設(shè)計模式

有一種要解釋的語言時,請使用解釋器模式,并且可以將語言中的語句表示為抽象語法樹。 解釋器模式在以下情況下效果最佳

  • 語法很簡單。 對于復(fù)雜的語法,語法的類層次結(jié)構(gòu)會變得龐大且難以管理。 在這種情況下,解析器生成器之類的工具是更好的選擇。 他們可以在不構(gòu)建抽象語法樹的情況下解釋表達(dá)式,這可以節(jié)省空間并可能節(jié)省時間。
  • 效率不是關(guān)鍵問題。 通常,最有效的解釋器不是通過直接解釋解析樹來實(shí)現(xiàn)的,而是先將其轉(zhuǎn)換為另一種形式。 例如,正則表達(dá)式通常被轉(zhuǎn)換為狀態(tài)機(jī)。 但是即使那樣,翻譯器也可以通過Interpreter模式實(shí)現(xiàn),因此該模式仍然適用。

5. JDK中的解釋器設(shè)計模式

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

6.下載源代碼

這是關(guān)于口譯員設(shè)計模式的課程。 您可以在此處下載源代碼: InterpreterPattern-Project

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

總結(jié)

以上是生活随笔為你收集整理的口译员设计模式示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。