概述: GOF定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 在軟體開發特別是DSL開發中常常需要使用一些相對較複雜的業務語言,如果業務語言使用頻率足夠高,且使用普通的編程模式來實現會導致非常複雜的變化,那麼就可以考慮使用解釋器模式構建一個解釋 ...
概述:
GOF定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
在軟體開發特別是DSL開發中常常需要使用一些相對較複雜的業務語言,如果業務語言使用頻率足夠高,且使用普通的編程模式來實現會導致非常複雜的變化,那麼就可以考慮使用解釋器模式構建一個解釋器對複雜的業務語言進行翻譯。
這種做法雖然效率相對較低,但可以允許用戶使用自定義的業務語言來處理邏輯,因此在效率不是關鍵問題的場合還是較為有用的。
1. context:包含解釋器之外的一些全局信息。解釋器上下文環境類,用來存儲解釋器的上下文環境,比如需要解釋的文法等。 2. 終結符表達式角色:具體表達式。實現與文法中的終結符相關聯的解釋操作。句子中的每個終結符需要該類的一個實例與之對應。 3. 非終結符表達式角色:具體表達式。文法中的每條規則R=R1R2…Rn都需要一個非終結符表達式角色。對於從R1到Rn的每個符號都維護一個抽象表達式角色的實例變數。實現解釋操作,解釋一般要遞歸地調用表示從R1到Rn的那些對象的解釋操作。 4. 客戶角色:構建(或者被給定)表示該文法定義的語言中的一個特定的句子的抽象語法樹,調用解釋操作。 舉一個加減乘除運算解釋器例子,代碼如下: 1.Context 類:public class Context { //private Dictionary<string, int> dic = new Dictionary<string, int>(); //public void AddValue(string variable, int value) //{ // dic.Add(variable, value); //} //public int GetValue(string variable) //{ // if (dic.ContainsKey(variable)) // { // return dic[variable]; // } // return 0; //} }
因為我後續沒有用到,就把這裡面的代碼註釋掉了,這裡可以根據需要在增加代碼,一般用例儲存上下文的環境等。
2.介面Expression
public interface Expression { int Interpreter(Context ctx); }
3.變數表達式 Variable
public class Variable : Expression { public int value { get; set; } public Variable(int value) { this.value = value; } public int Interpreter(Context ctx) { return this.value; } }
4.常量表達式
//常量 public class ConstantExpression : Expression { private int i; public ConstantExpression(int i) { this.i = i; } public int Interpreter(Context ctx) { return i; } }
5.增加表達式
public class AddExprestion : Expression { private Expression left, right; public AddExprestion(Expression left, Expression right) { this.left = left; this.right = right; } public int Interpreter(Context ctx) { return left.Interpreter(ctx) + right.Interpreter(ctx); } }
6.減法表達式
public class SubtractExprestion : Expression { private Expression left, right; public SubtractExprestion(Expression left, Expression right) { this.left = left; this.right = right; } public int Interpreter(Context ctx) { return left.Interpreter(ctx) - right.Interpreter(ctx); } }
7. 測試運行
static void Main(string[] args) { Context ctx = new Context(); Variable a = new Variable(1); Variable b = new Variable(2); Expression addExp = new SubtractExprestion(new ConstantExpression(10), new AddExprestion(b, a)); int result = addExp.Interpreter(ctx); Console.WriteLine("result=(10-(1+2))=" + result); }
8. 運行結果
最後,用過C#就知道裡面的LambdaExpression 設計思想是解釋器模式最好的解釋。