解釋器模式
定義:
給定一個語言,定義他的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
能夠解決的問題 :
如果一種特定的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語句中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。
//抽象表達式
abstract class AbstractExpression
{
public abstract void Interpret(Context context);
}
class Context
{
private string input;
public string Input
{
get { return input; }
set { input = value; }
}
private string output;
public string Output
{
get { return output; }
set { output = value; }
}
}
//非終結符表達式
class NonterminalExpression:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("非終端解釋器");
}
}
//終結符表達式
class TerminalExperssion:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("終端解釋器");
}
}
class Program
{
static void Main(string[] args)
{
Context context = new Context();
IList<AbstractExpression> list = new List<AbstractExpression>();
list.Add(new TerminalExperssion());
list.Add(new NonterminalExpression());
list.Add(new TerminalExperssion());
list.Add(new TerminalExperssion());
foreach (AbstractExpression exp in list)
{
exp.Interpret(context);
}
Console.Read();
}
}
解釋器模式的優點:
用瞭解釋器,很容易地改變和 擴展文法,因爲該模式使用類來表示文法規則,你可使用繼承來改變或拓展該文法。也比較容易實現文法,因爲定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。
解釋器模式的缺點:
解釋器模式爲文法中的每一條規則至少定義了一個類,因此包含許多規則的文法可能難以管理和維護。建議當文法複雜時,使用其他的技術如語法分析程序或編譯器生成器來處理。