設計模式之直譯器模式

安全劍客發表於2020-09-22
直譯器模式,給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。這和解釋型程式語言的直譯器有點類似,要根據一段輸入轉換成一段輸出,將不易讀的文字轉換為易讀的文字,將機器不能識別的輸入轉成二進位制機器可讀的輸出。當有一個語言需要解釋執行,並且你可以將該語言中的句子表示為一個抽象語法樹時,可以使用直譯器模式。
Prototype

Context: 直譯器上下文
AbstractExpression: 解釋表示式抽象,定義解釋操作
ConcreteExpression: 解釋表示式實現類,實現具體的解釋邏輯

Sample
public class Context
{
    public string Input { get; set; }
    public string Output { get; set; }
}
public abstract class AbstractExpression
{
    public abstract void Interpret(Context context);
}
public class TerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("TerminalExpressionInterpreter");
    }
}
public class NoneTerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("NonTerminalExpressionInterpreter");
    }
}
var context = new Context();
ICollectionexpressions = new List();
expressions.Add(new TerminalExpression());
expressions.Add(new TerminalExpression());
expressions.Add(new NoneTerminalExpression());
foreach (var expression in expressions)
{
    expression.Interpret(context);
}
More

直譯器模式為某個語言定義它的語法(或者叫文法)表示,並定義一個直譯器用來處理這個語法。

要想了解“語言”要表達的資訊,我們就必須定義相應的語法規則。這樣,書寫者就可以根據語法規則來書寫“句子”(專業點的叫法應該是“表示式”),閱讀者根據語法規則來閱讀“句子”,這樣才能做到資訊的正確傳遞。而我們要講的直譯器模式,其實就是用來實現根據語法規則解讀“句子”的直譯器。

直譯器模式的程式碼實現比較靈活,沒有固定的模板。

應用設計模式主要是應對程式碼的複雜性,直譯器模式也不例外。它的程式碼實現的核心思想,就是將語法解析的工作拆分到各個小類中,以此來避免大而全的解析類。

一般的做法是,將語法規則拆分一些小的獨立的單元,然後對每個單元進行解析,最終合併為對整個語法規則的解析。

直譯器模式可能小眾,只在一些特定的領域或情境下會被用到,比如編譯器、規則引擎、正規表示式等。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2723347/,如需轉載,請註明出處,否則將追究法律責任。

相關文章