激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java設計模式之解釋器模式_動力節點Java學院整理

Java設計模式之解釋器模式_動力節點Java學院整理

2020-12-16 13:32zhengzhb Java教程

解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式

定義:給定一種語言,定義他的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中句子。

類型:行為類模式

類圖:

Java設計模式之解釋器模式_動力節點Java學院整理

        解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式。 

解釋器模式的結構

  • ?抽象解釋器:聲明一個所有具體表達式都要實現的抽象接口(或者抽象類),接口中主要是一個interpret()方法,稱為解釋操作。具體解釋任務由它的各個實現類來完成,具體的解釋器分別由終結符解釋器TerminalExpression和非終結符解釋器NonterminalExpression完成。
  • ?終結符表達式:實現與文法中的元素相關聯的解釋操作,通常一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不同的終結符。終結符一半是文法中的運算單元,比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。                                
  • ?非終結符表達式:文法中的每條規則對應于一個非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字,比如公式R=R1+R2中,+就是非終結符,解析+的解釋器就是一個非終結符表達式。非終結符表達式根據邏輯的復雜程度而增加,原則上每個文法規則都對應一個非終結符表達式。
  • ?環境角色:這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環境角色中,很多情況下我們使用Map來充當環境角色就足夠了。

代碼實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Context {}
abstract class Expression {
  public abstract Object interpreter(Context ctx);
}
class TerminalExpression extends Expression {
  public Object interpreter(Context ctx){
    return null;
  }
}
class NonterminalExpression extends Expression {
  public NonterminalExpression(Expression...expressions){
     
  }
  public Object interpreter(Context ctx){
    return null;
  }
}
public class Client {
  public static void main(String[] args){
    String expression = "";
    char[] charArray = expression.toCharArray();
    Context ctx = new Context();
    Stack<Expression> stack = new Stack<Expression>();
    for(int i=0;i<charArray.length;i++){
      //進行語法判斷,遞歸調用
    }
    Expression exp = stack.pop();
    exp.interpreter(ctx);
  }
}

        文法遞歸的代碼部分需要根據具體的情況來實現,因此在代碼中沒有體現。抽象表達式是生成語法集合的關鍵,每個非終結符表達式解釋一個最小的語法單元,然后通過遞歸的方式將這些語法單元組合成完整的文法,這就是解釋器模式。 

解釋器模式的優缺點

        解釋器是一個簡單的語法分析工具,它最顯著的優點就是擴展性,修改語法規則只需要修改相應的非終結符就可以了,若擴展語法,只需要增加非終結符類就可以了。

        但是,解釋器模式會引起類的膨脹,每個語法都需要產生一個非終結符表達式,語法規則比較復雜時,就可能產生大量的類文件,為維護帶來非常多的麻煩。同時,由于采用遞歸調用方法,每個非終結符表達式只關心與自己相關的表達式,每個表達式需要知道最終的結果,必須通過遞歸方式,無論是面向對象的語言還是面向過程的語言,遞歸都是一個不推薦的方式。由于使用了大量的循環和遞歸,效率是一個不容忽視的問題。特別是用于解釋一個解析復雜、冗長的語法時,效率是難以忍受的。 

解釋器模式的適用場景

        在以下情況下可以使用解釋器模式:

  • ?有一個簡單的語法規則,比如一個sql語句,如果我們需要根據sql語句進行rm轉換,就可以使用解釋器模式來對語句進行解釋。
  • ?一些重復發生的問題,比如加減乘除四則運算,但是公式每次都不同,有時是a+b-c*d,有時是a*b+c-d,等等等等個,公式千變萬化,但是都是由加減乘除四個非終結符來連接的,這時我們就可以使用解釋器模式。

注意事項

       解釋器模式真的是一個比較少用的模式,因為對它的維護實在是太麻煩了,想象一下,一坨一坨的非終結符解釋器,假如不是事先對文法的規則了如指掌,或者是文法特別簡單,則很難讀懂它的邏輯。解釋器模式在實際的系統開發中使用的很少,因為他會引起效率、性能以及維護等問題。

總結

以上所述是小編給大家介紹的Java設計模式之解釋器模式_動力節點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一级黄色淫片 | 日韩不卡一区二区 | 国产亚洲欧美一区久久久在 | 国产精品免费久久久 | 91精品国产99久久久久久 | 成年免费网站 | 亚洲网站在线观看 | 精品一区二区三区在线视频 | 4p一女两男做爰在线观看 | 精品一区免费 | 欧美成人免费tv在线播放 | 亚洲精品欧美二区三区中文字幕 | 久久91久久久久麻豆精品 | 中文欧美日韩 | www.99久久久 | 久久2019中文字幕 | 欧美一级精品 | 欧美77| 亚洲成人免费影视 | 9999久久| 一级毛片手机在线观看 | 中文字幕欧美日韩 | 最新日本中文字幕在线观看 | av免费在线观看国产 | 91久久国产| 中文字幕 亚洲一区 | 成人在线免费观看网址 | 国产亚洲精品久久久久久网站 | 黄视频网站免费在线观看 | 一级毛片手机在线观看 | 成人在线视频播放 | 成人三级视频在线观看 | 国产视频在线一区 | 国产精品69久久 | 神马久久精品综合 | av电影在线观看网站 | 激情视频在线播放 | 欧美成人高清在线 | 午夜在线视频一区二区三区 | 欧美高清视频一区 | 亚洲精品欧美在线 |