今天我們來講一下解釋器模式。 什麼叫解釋器模式呢?解釋器模式,給定一個語言,定義她的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述為一個簡單語言的句子,這樣就可以構建一個解釋器,該解釋器通過/解釋 ...
今天我們來講一下解釋器模式。
什麼叫解釋器模式呢?解釋器模式,給定一個語言,定義她的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述為一個簡單語言的句子,這樣就可以構建一個解釋器,該解釋器通過/解釋這些句子來解決該問題。
下麵我們來看一下她的結構代碼:
1 //抽象表達式,聲明一個抽象的解釋操作,這個介面為抽象語法樹中所有的節點所共用 2 abstract class AbstractExpression 3 { 4 public abstract void Interpret(Context comtext); 5 } 6 7 //包含解釋器之外的一些全局信息 8 public class Context 9 { 10 private string input; 11 private string output; 12 public string Input 13 { 14 get 15 { 16 return input; 17 } 18 19 set 20 { 21 input = value; 22 } 23 } 24 25 public string Output 26 { 27 get 28 { 29 return output; 30 } 31 32 set 33 { 34 output = value; 35 } 36 } 37 } 38 39 //終結符表達式,實現與文法中終結符相關聯的解釋操作 40 //實現抽象表達式中所要求的介面,主要是一個方法,文法中每一個終結符都有一個 41 //具體中介表達式與之相對應。 42 class TerminalExpression : AbstractExpression 43 { 44 public override void Interpret(Context comtext) 45 { 46 Console.WriteLine("終端解釋器"); 47 } 48 } 49 50 //非終結符表達式,為文法中的非終結符實現解釋操作,對文法中每一條規則 51 //都需要一個具體的非終結符表達式類。通過實現抽象表達式方法,實現解釋操作。 52 //解釋操作以遞歸方式調用上面所提到的每一條規則中各個符號的實例變數. 53 class NonterminalExpression:AbstractExpression 54 { 55 public override void Interpret(Context comtext) 56 { 57 Console.WriteLine("非終端解釋器"); 58 } 59 }
客戶端調用:
1 public static void Main() 2 { 3 Context context = new Context(); 4 5 IList<AbstractExpression> list = new List<AbstractExpression>(); 6 list.Add(new TerminalExpression()); 7 list.Add(new NonterminalExpression()); 8 list.Add(new TerminalExpression()); 9 list.Add(new TerminalExpression()); 10 11 foreach (AbstractExpression exp in list) 12 { 13 exp.Interpret(context); 14 } 15 Console.ReadKey(); 16 }
那麼,在什麼時候我們用解釋器模式呢?
通常,當有一個語言需要解釋執行,並且你可以講該語言中的句子表示為一個抽象語法樹時,可以使用解釋器模式。
解釋器模式有什麼優點嗎?
1、容易地蓋面和拓展文法,因為該模式使用類來表示文法規則,你可使用繼承來改變和擴展該文法。
2、較容易實現文法, 因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。
嗯,今天解釋器模式就講到這裡了,可能沒有舉案例,等整理好案例,我再發一下。下一篇我們講 訪問者模式
本系列將持續更新,喜歡的小伙伴可以點一下關註和推薦,謝謝大家的支持