狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當(dāng)前位置:系統(tǒng)之家 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

基于Java的解釋器設(shè)計(jì)模式

基于Java的解釋器設(shè)計(jì)模式

更新時(shí)間:2019-12-08 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

一、引子

  其實(shí)沒(méi)有什么好的例子引入解釋器模式,因?yàn)樗枋隽巳绾螛?gòu)成一個(gè)簡(jiǎn)單的語(yǔ)言解釋器,主要應(yīng)用在使用面向?qū)ο笳Z(yǔ)言開(kāi)發(fā)編譯器中;在實(shí)際應(yīng)用中,我們可能很少碰到去構(gòu)造一個(gè)語(yǔ)言的文法的情況。

  雖然你幾乎用不到這個(gè)模式,但是看一看還是能受到一定的啟發(fā)的。

  二、定義與結(jié)構(gòu)

  解釋器模式的定義如下:定義語(yǔ)言的文法,并且建立一個(gè)解釋器來(lái)解釋該語(yǔ)言中的句子。它屬于類(lèi)的行為模式。這里的語(yǔ)言意思是使用規(guī)定格式和語(yǔ)法的代碼。

  在GOF的書(shū)中指出:如果一種特定類(lèi)型的問(wèn)題發(fā)生的頻率足夠高,那么可能就值得將該問(wèn)題的各個(gè)實(shí)例表述為一個(gè)簡(jiǎn)單語(yǔ)言中的句子。這樣就可以構(gòu)建一個(gè)解釋器,該解釋器通過(guò)解釋這些句子來(lái)解決該問(wèn)題。而且當(dāng)文法簡(jiǎn)單、效率不是關(guān)鍵問(wèn)題的時(shí)候效果最好。

  這也就是解釋器模式應(yīng)用的環(huán)境了。

  讓我們來(lái)看看神秘的解釋器模式是由什么來(lái)組成的吧。

  1) 抽象表達(dá)式角色:聲明一個(gè)抽象的解釋操作,這個(gè)接口為所有具體表達(dá)式角色(抽象語(yǔ)法樹(shù)中的節(jié)點(diǎn))都要實(shí)現(xiàn)的。

  什么叫做抽象語(yǔ)法樹(shù)呢?《java與模式》中給的解釋為:抽象語(yǔ)法樹(shù)的每一個(gè)節(jié)點(diǎn)都代表一個(gè)語(yǔ)句,而在每個(gè)節(jié)點(diǎn)上都可以執(zhí)行解釋方法。這個(gè)解釋方法的執(zhí)行就代表這個(gè)語(yǔ)句被解釋。由于每一個(gè)語(yǔ)句都代表這個(gè)語(yǔ)句被解釋。由于每一個(gè)語(yǔ)句都代表一個(gè)常見(jiàn)的問(wèn)題的實(shí)例,因此每一個(gè)節(jié)點(diǎn)上的解釋操作都代表對(duì)一個(gè)問(wèn)題實(shí)例的解答。

  2) 終結(jié)符表達(dá)式角色:具體表達(dá)式。

  a) 實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作

  b) 而且句子中的每個(gè)終結(jié)符需要該類(lèi)的一個(gè)實(shí)例與之對(duì)應(yīng)

  3) 非終結(jié)符表達(dá)式角色:具體表達(dá)式。

  a) 文法中的每條規(guī)則R::=R1R2…Rn都需要一個(gè)非終結(jié)符表帶式角色

  b) 對(duì)于從R1到Rn的每個(gè)符號(hào)都維護(hù)一個(gè)抽象表達(dá)式角色的實(shí)例變量

  c) 實(shí)現(xiàn)解釋操作,解釋一般要遞歸地調(diào)用表示從R1到Rn的那些對(duì)象的解釋操作

  4) 上下文(環(huán)境)角色:包含解釋器之外的一些全局信息。

  5) 客戶(hù)角色:

  a) 構(gòu)建(或者被給定)表示該文法定義的語(yǔ)言中的一個(gè)特定的句子的抽象語(yǔ)法樹(shù)

  b) 調(diào)用解釋操作

  放上張解釋器結(jié)構(gòu)類(lèi)圖吧,這也是來(lái)自于GOF的書(shū)中。




  對(duì)每一個(gè)角色都給出了詳細(xì)的職責(zé),而且在類(lèi)圖中給出五個(gè)角色之間的關(guān)系。這樣實(shí)現(xiàn)起來(lái)也不是很困難了,下面舉了一個(gè)簡(jiǎn)單的例子,希望能加深你對(duì)解釋器模式的理解。

   三、舉例

  來(lái)舉一個(gè)加減乘除的例子吧,實(shí)現(xiàn)思路來(lái)自于《java與模式》中的例子。每個(gè)角色的功能按照上面提到的規(guī)范來(lái)實(shí)現(xiàn)。

  //上下文(環(huán)境)角色,使用HashMap來(lái)存儲(chǔ)變量對(duì)應(yīng)的數(shù)值

  class Context
  {
  private Map valueMap = new HashMap();
  public void addValue(Variable x , int y)
  {
  Integer yi = new Integer(y);
  valueMap.put(x , yi);
  }

  public int LookupValue(Variable x)
  {
  int i = ((Integer)valueMap.get(x)).intValue();
  return i ;
  }
  }

  //抽象表達(dá)式角色,也可以用接口來(lái)實(shí)現(xiàn)

  abstract class Expression
  {
  public abstract int interpret(Context con);
  }

  //終結(jié)符表達(dá)式角色

  class Constant extends Expression
  {
  private int i ;
  public Constant(int i)
  {
  this.i = i;
  }

  public int interpret(Context con)
  {
  return i ;
  }
  }

  class Variable extends Expression
  {
  public int interpret(Context con)
  {
  //this為調(diào)用interpret方法的Variable對(duì)象
  return con.LookupValue(this);
  }
  }

  //非終結(jié)符表達(dá)式角色

  class Add extends Expression
  {
  private Expression left ,right ;
  public Add(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }

  public int interpret(Context con)
  {
  return left.interpret(con) + right.interpret(con);
  }
  }

  class Subtract extends Expression
  {
  private Expression left , right ;
  public Subtract(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }

  public int interpret(Context con)
  {
  return left.interpret(con) - right.interpret(con);
  }

  }

  class Multiply extends Expression
  {
  private Expression left , right ;
  public Multiply(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }
  public int interpret(Context con)
  {
  return left.interpret(con) * right.interpret(con);
  }
  }

  class Division extends Expression
  {
  private Expression left , right ;
  public Division(Expression left , Expression right)
  {
  this.left = left ;
  this.right= right ;
  }

  public int interpret(Context con)
  {
  try{
   return left.interpret(con) / right.interpret(con);
  }catch(ArithmeticException ae)
  {
   System.out.println("被除數(shù)為0!");
   return -11111;
  }
  }
  }

  //測(cè)試程序,計(jì)算 (a*b)/(a-b+2)

  public class Test
  {
  private static Expression ex ;
  private static Context con ;
  public static void main(String[] args)
  {
  con = new Context();
  //設(shè)置變量、常量
  Variable a = new Variable();
  Variable b = new Variable();
  Constant c = new Constant(2);
  //為變量賦值
  con.addValue(a , 5);
  con.addValue(b , 7);
  //運(yùn)算,對(duì)句子的結(jié)構(gòu)由我們自己來(lái)分析,構(gòu)造
  ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c));
  System.out.println("運(yùn)算結(jié)果為:"+ex.interpret(con));
  }
  }

  解釋器模式并沒(méi)有說(shuō)明如何創(chuàng)建一個(gè)抽象語(yǔ)法樹(shù),因此它的實(shí)現(xiàn)可以多種多樣,在上面我們是直接在Test中提供的,當(dāng)然還有更好、更專(zhuān)業(yè)的實(shí)現(xiàn)方式。

  對(duì)于終結(jié)符,GOF建議采用享元模式來(lái)共享它們的拷貝,因?yàn)樗鼈円啻沃貜?fù)出現(xiàn)。但是考慮到享元模式的使用局限性,我建議還是當(dāng)你的系統(tǒng)中終結(jié)符重復(fù)的足夠多的時(shí)候再考慮享元模式。

  四、優(yōu)缺點(diǎn)

  解釋器模式提供了一個(gè)簡(jiǎn)單的方式來(lái)執(zhí)行語(yǔ)法,而且容易修改或者擴(kuò)展語(yǔ)法。一般系統(tǒng)中很多類(lèi)使用相似的語(yǔ)法,可以使用一個(gè)解釋器來(lái)代替為每一個(gè)規(guī)則實(shí)現(xiàn)一個(gè)解釋器。而且在解釋器中不同的規(guī)則是由不同的類(lèi)來(lái)實(shí)現(xiàn)的,這樣使得添加一個(gè)新的語(yǔ)法規(guī)則變得簡(jiǎn)單。

  但是解釋器模式對(duì)于復(fù)雜文法難以維護(hù)。可以想象一下,每一個(gè)規(guī)則要對(duì)應(yīng)一個(gè)處理類(lèi),而且這些類(lèi)還要遞歸調(diào)用抽象表達(dá)式角色,多如亂麻的類(lèi)交織在一起是多么恐怖的一件事啊!

  五、總結(jié)

  這樣對(duì)解釋器模式應(yīng)該有了些大體的認(rèn)識(shí)了吧,由于這個(gè)模式使用的案例匱乏,所以本文大部分觀點(diǎn)直接來(lái)自于GOF的原著。只是實(shí)例代碼是親自實(shí)現(xiàn)并調(diào)試通過(guò)的。

溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
黄页网站大全一区二区| 一本不卡影院| 日韩av一二三| 2024国产精品| 久久精品国产第一区二区三区最新章节| 极品美女销魂一区二区三区| 久久久99精品久久| 欧美一级一区二区| 精品噜噜噜噜久久久久久久久试看| 欧美在线free| 91精品国产全国免费观看| 欧美日韩一区不卡| 欧美日韩精品电影| 精品国产sm最大网站| 久久视频一区二区| 中文字幕亚洲一区二区av在线| 17c精品麻豆一区二区免费| 亚洲精品成a人| 另类小说欧美激情| 91看片淫黄大片一级在线观看| 亚洲精品乱码久久久久久蜜桃麻豆 | 在线播放视频一区| 欧美日韩卡一卡二| 精品久久久久一区| 日韩精品福利网| 色88888久久久久久影院按摩 | 欧美精品欧美精品系列| 国产一区二区三区无遮挡| 九九九精品视频| 亚洲精品大片www| 久久网站最新地址| 欧美美女黄视频| av一区二区三区四区| 欧美午夜a级限制福利片| 91久久精品一区二区三| 欧美大黄免费观看| 亚洲欧美一区二区三区极速播放| 首页综合国产亚洲丝袜| a在线欧美一区| 国产精品日韩欧美一区二区| 国产午夜亚洲精品理论片色戒| 色综合久久中文综合久久97| 欧美激情资源网| 欧美在线播放| 国产1区2区3区精品美女| 久久不见久久见免费视频1| 亚洲一区自拍偷拍| 亚洲欧洲精品成人久久奇米网| 精品国产a毛片| 日韩一级欧美一级| 欧美探花视频资源| 久久综合久久久| 国产精品一区二区欧美| 亚洲精品黄色| 亚洲图片在线观看| 欧美日韩综合久久| 91麻豆精品在线观看| 99精品在线观看视频| 成人午夜视频在线| 成人午夜电影久久影院| 国产成人免费网站| 国产一区二区三区在线观看免费| 毛片av一区二区| 天堂精品中文字幕在线| 性感美女极品91精品| 亚洲在线视频免费观看| 亚洲欧美国产毛片在线| 亚洲欧美激情小说另类| 亚洲欧美国产毛片在线| 亚洲另类中文字| 亚洲靠逼com| 一区二区三区在线观看欧美| 亚洲精选一二三| 亚洲综合另类小说| 亚洲成人免费观看| 丝袜国产日韩另类美女| 日韩av一区二区在线影视| 婷婷成人激情在线网| 日韩中文字幕一区二区三区| 日韩成人免费电影| 久久成人综合网| 国产一区91精品张津瑜| 国产大片一区二区| 波多野结衣中文字幕一区二区三区 | 偷窥少妇高潮呻吟av久久免费| 亚洲国产日韩av| 青娱乐精品视频在线| 激情久久五月天| 日产国产欧美视频一区精品| 色94色欧美sute亚洲13| 婷婷开心激情综合| 欧美日韩黄色一区二区| 成+人+亚洲+综合天堂| 欧美国产精品中文字幕| 国产一区二区三区四区hd| 亚洲综合精品久久| 色视频欧美一区二区三区| 狠狠色丁香婷综合久久| 久久色视频免费观看| 欧美午夜国产| 日本亚洲三级在线| 91精品国产美女浴室洗澡无遮挡| 国产98色在线|日韩| 综合久久一区二区三区| 国产日韩精品一区二区浪潮av| 粉嫩av一区二区三区粉嫩 | 丝袜亚洲精品中文字幕一区| 老司机亚洲精品| 日本亚洲天堂网| 欧美精选午夜久久久乱码6080| 99精品久久只有精品| 亚洲美女少妇撒尿| 欧美日韩在线观看一区二区 | 日韩制服丝袜先锋影音| 欧美色综合天天久久综合精品| 免费欧美日韩| 欧美日韩成人在线| 国产精品久久久一本精品 | 国产精品福利一区二区| 午夜精品影院在线观看| 国产乱国产乱300精品| 午夜国产精品视频免费体验区| 国产亚洲第一区| 在线成人av网站| 中文字幕在线观看不卡视频| 日韩高清在线不卡| 亚洲精品va在线观看| 久久久亚洲精华液精华液精华液| 噜噜爱69成人精品| 91婷婷韩国欧美一区二区| 久久精品国产99| 一区二区三区丝袜| 国产亚洲午夜高清国产拍精品| 日本高清不卡一区| 伊伊综合在线| 91片黄在线观看| 国产精品一二二区| 久久国产剧场电影| 亚洲国产精品欧美一二99| 亚洲国产精品激情在线观看| 欧美一区二区三区四区视频| 色哟哟一区二区在线观看 | 亚洲一级二级三级在线免费观看| 欧美r级在线观看| 日韩一区国产二区欧美三区| 欧美日韩精品二区第二页| 色中色一区二区| 午夜亚洲影视| 久久久福利视频| 欧美日本视频在线| 亚洲精品在线一区二区| 久久精品日韩一区二区三区| 欧美日韩免费观看一区三区| 一本色道精品久久一区二区三区| 亚洲无线视频| 黄色成人91| 欧美三级蜜桃2在线观看| 成人欧美一区二区三区小说| 99久久精品免费观看| 亚洲成人手机在线| 91色在线porny| 欧美日韩精品一区二区三区 | 亚洲午夜精品福利| 精品国产三级电影在线观看| 奇米精品一区二区三区在线观看 | 亚洲一卡二卡三卡四卡五卡| 亚洲一区二区高清| 免费视频最近日韩| 成人午夜在线视频| 国产精品推荐精品| 欧美日韩午夜在线视频| 日韩一二三区不卡| 精品国产电影一区二区| 国产色一区二区| 一区二区三区精密机械公司| 午夜成人免费视频| 国产a精品视频| 欧美三日本三级少妇三99| 99视频+国产日韩欧美| 久久久久久婷| 国产精品盗摄一区二区三区| 一区二区三区不卡视频| 久久福利视频一区二区| 欧美黄免费看| 色哟哟亚洲精品| 欧美精品一区二区蜜臀亚洲| 亚洲人成亚洲人成在线观看图片| 婷婷激情综合网| 91热门视频在线观看| 裸体丰满少妇做受久久99精品| 欧美剧情片在线观看| 椎名由奈av一区二区三区| 国产精品一区二区在线观看不卡| av不卡免费看| 欧美一级在线免费| 成人免费的视频| 欧美性大战xxxxx久久久| 精品一区二区影视| 欧美一区二区三区在| 中文字幕一区二区三区av|