給定一門語言,定義它文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子直譯器這個名詞想必大家都不會陌生,比如編譯原理中,乙個算術表示式通過詞法分析器形成詞法單元,而後這些詞法單元再通過語法分析器構建語法分析樹,最終形成一顆抽象的語法分析樹。諸如此類的例子也有很多,比如編譯器、正規表示式等等。
如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子,這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。
就比如正規表示式,它就是直譯器模型的一種應用,直譯器為正規表示式定義了乙個文法,如何表示乙個特定的正規表示式,以及如何解釋這個正規表示式。
context環境角色
public
class
context
public
void
setinput
(string input)
public string getoutput()
public
void
setoutput
(string output)
}
抽象表示式抽象表示式是生成語法集合(語法樹)的關鍵,每個語法集合完成指定語法解析任務,它是通過遞迴呼叫的方式,最終由最小的語法單元進行解析完成。
public
abstract
class
abstractexpression
終結符表示式通常,終結符表示式比較簡單,主要處理場景元素和資料的轉換。
public
class
terminalexpression
extends
abstractexpression
}
非終結符表示式每個非終結符表示式都代表了乙個文法規則,並且每個文法規則都只關心自己周邊的文法規則的結果,因此這就產生了每個非終結符表示式呼叫自己周邊的非終結符表示式,然後最終、最小的文法規則就是終結符表示式。
public
class
nonterminalexpression
extends
abstractexpression
}
client客戶端
public
class
client
}}
因為效率以及維護問題。重要的場景不要使用直譯器模式,可以使用指令碼語言來完成解析。使用指令碼語言來代替,效率和效能各方面表現良好。
準備使用直譯器模式時,可以考慮一下expression4j、mesp、jep等開源解析工具包,功能強大且易於使用,沒必要自己從頭開始寫直譯器
設計模式 直譯器模式
未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...
設計模式 直譯器模式
直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並...
設計模式 直譯器模式
直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...