直譯器 Interpreter 模式

2021-08-28 01:25:12 字數 2260 閱讀 7624

[size=large]

直譯器模式是一種行為模式,比較通用的定義「給定乙個語言之後,直譯器模式可以定義出其文法的一種表示,並同時提供乙個直譯器。客戶端可以使用這個直譯器來解釋這個語言中的句子」。spring的express中就使用了這種設計模式。

直譯器模式的本質就是解釋自定義了的語言,其中涉及三個概念:表示式(expression)、直譯器(interpreter)和環境(context)。

直譯器模式大致分為三個過程:首先,定義一種語言,並定義這種語言的一種文法表現——可以理解為乙個運算表示式(expression);然後,定**釋器(interpreter)來解釋自定義運算表示式;直譯器在解釋表示式的過程中可能遇到一些變數,而這些變數的值就儲存在環境(context)中,簡單的做法是使用map將變數名和變數值對應起來。

先來看表示式,表示式分為:終結表示式(terminal expression)和非中介表示式(nonterminal expression)。

1、終結表示式:文法中的每乙個終結符都有乙個具體終結表示式與之相對應。比如有乙個簡單的公式r=r1+r2,在裡面r1和r2就是終結符。通常執行表示式中的常量和變數都是終結表示式,蘊含了著到此就終結了,不用再運算了。

2、非終結表示式:文法中的每一條規則都需要乙個具體的非終結符表示式,非終結符表示式一般是文法中的運算子或者其他關鍵字,比如公式r=r1+r2中,「+"就是非終結符,解析「+」的直譯器就是乙個非終結符表示式。

在具體實現時,需要抽象乙個表示式(expression)抽象類,終結表示式和非終結表示式都繼承該表示式抽象類。

[/size]

public abstract class expression

public class terminalexpression extends expression

public class nonterminalexpression extends expression

[size=large]

再來看直譯器,直譯器需要提供乙個解釋方法(interpret)負責文法/表示式的解釋工作。直譯器模式中將直譯器與表示式繫結起來,來表明表示式用該直譯器來解釋自己。具體實現方式是在表示式中新增解釋方法(interpret),表示式可以自己解釋自己,無需外部擔心。[/size]

public class context

public abstract class expression

public class terminalexpression extends expression

}public class nonterminalexpression extends expression

}

[size=large]

在解釋表示式的過程中可能要替換「變數」,因此定義了context(環境)類,interpret解釋方法接收context型別的引數。

在直譯器模式中通常還會遇到乙個問題,就是遞迴解釋。下面用乙個簡單的示例,來說明如何使用直譯器模式,同時也展示了遞迴解釋。示例定義乙個簡單加法運算,andexpression加運算表示式同時解釋加運算,variableexpression變數表示式同時解釋變數值:[/size]

public class context

public int lookup(string key)

}

public abstract class expression

//terminalexpression

public class variableexpression extends expression

@override

public int interpret(context context)

}

//nonterminalexpression

public class andexpression extends expression

@override

public int interpret(context context)

}

public class expressionmain

}

Interpreter(直譯器模式)

名 稱 interpreter 直譯器模式 意 圖 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。適 用 環 境 u 當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式效果最好 u 該...

Interpreter直譯器模式

關於23種設計模式的所有示例 請參考 本文所述 請參考 mydb interpreter 如上圖所示 終結直譯器是 geexpression,hundredexpression 非終結直譯器有 thousandexpression,millionexpression,billionexpressio...

直譯器模式 interpreter

直譯器模式,給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。直譯器模式提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。演奏內容類 class ...