在編譯原理中,乙個演算法表示式通過語法分析器形成詞法單元,而後這些詞法單元再通過語法分析器構建語法分析樹,最終形成一顆抽象的語法分析樹,這裡的詞法分析器和語法分析器都可以看做是直譯器。
直譯器模式是指給定乙個語法(表示式),並定義它的文法的一種表示,再定義乙個直譯器,使用該直譯器來解釋語言中的句子(表示式)。
說明:1)context:是環境角色,含有直譯器之外的全域性資訊
2)abstractexpression;抽象表示式,宣告乙個抽象的解釋操作,這個方法被抽象語法樹中所有的節點所共享
4)nonterminalexpression:非終結符表示式,為文法中的非終結符實現解釋操作
5)說明:輸入context和terminalexpression資訊通過client輸入即可
通過直譯器模式來實現四則運算,如計算a+b-c的值,具體要求:1)先輸入表示式的形式,比如a+b+c-d+e,要求表示式的字母不能重複;2)在分別輸入a,b,c,d,e的值;3)最後求出結果
類圖如下所示:
**如下所示:
建立expression抽象類及其子類:
//抽象類表示式,通過map的鍵值對,可以獲取到變數的值
public abstract class expression
public abstract int interpreter(mapmap);
}
//變數的解析器
public class varexpression extends expression
public int interpreter(mapmap)
}
//抽象運算子解析器。每個運算子都只和自己左右兩個數字有關係,
//但是左右兩個數字有可能也是乙個解析結果,無論何種型別,都是expression類的實現類
public class symbolexpression extends expression
//因為symbolexpression是讓其子類來實現的,因此interpreter是乙個預設實現
public int interpreter(mapmap)
}
建立addexpression類和subexpression類:
//加法直譯器
public class addexpression extends symbolexpression
//處理相加
public int interpreter(mapmap)
}
//減法直譯器
public class subexpression extends symbolexpression
//處理相減
public int interpreter(mapmap)
}
建立calculator類:
public class calculator
}//當遍歷完整個陣列後,棧中就得到最後expression
this.expression = stack.pop();
}public int run(mapmap)
}
建立client類:
public class client
public static string getexpstr() throws ioexception
public static mapgetvalue(string expstr) throws ioexception}}
return map;}}
1)expression介面:表示式介面
2)下面有不同的實現類,比如spelexpression,或者componsitestringexpression
3)使用的時候,根據你建立不同的parser物件,返回不同的expression物件
public expression parseexpression(string expressionstring, parsercontext context) throws parseexception
if(context.istemplate()) else
}
4)使用得到的expression物件,呼叫getvalue,解釋執行表示式,最後得到結果
1)當有乙個語言需要解釋執行,可將該語言中的句子表示為乙個抽象語法樹,就可以考慮使用直譯器模式,讓程式具有良好的擴充套件性
2)應用場景:①應用可以將乙個需要解釋執行的語言中的句子表示為乙個抽象語法樹;②一些重複出現的問題可以用一種簡單的語言來表達;③乙個簡單語法需要解釋的場景。編譯器、運算表示式計算、正規表示式、機械人等
3)使用直譯器可能帶來的問題:直譯器模式會引起類膨脹,直譯器模式採用遞迴呼叫方法,將會導致除錯非常複雜、效率可能降低
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...
直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...