直譯器模式(interpreter pattern)提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析、符號處理引擎等。
直譯器模式的角色:
抽象表示式角色(abstractexpression):宣告乙個所有的具體表示式角色都需要實現的抽象介面。這個介面主要是乙個interpret()方法,稱作解釋操作。
終結符表示式角色(terminal expression):實現了抽象表示式角色所需求的介面,主要是乙個interpret()方法;文法中的每乙個終結符都有乙個具體終結表示式與之相對應。比如有乙個簡單的公式:r=r1+r2,在裡面r1和r2就是終結符,對應的解析r1和r2的直譯器就是終結符表示式。
非終結符表示式角色(nonterminal expression):文法中的每一條規則都需要乙個具體的非終結符表示式,非終結符表示式一般是文法中的運算子或者其他關鍵字。比如r=r1+r2中的「+」就是非終結符,解析「+」的直譯器就是乙個非終結符表示式。
環境角色(context):這個角色的任務一般是用來存放文法中各個終結符所對應的具體值。比如r=r1+r2,我們給r1賦值100,給r2賦值200。這些資訊需要存放到環境角色中,很多情況下我們使用map來充當環境角色就足夠了。
建立乙個表示式介面:
package com.wuychn.interpreter;
public inte***ce expression
建立實現了上述介面的實體類:
package com.wuychn.interpreter;
public class terminalexpression implements expression
@override
public boolean interpret(string context)
return false;
}}
package com.wuychn.interpreter;
public class orexpression implements expression
@override
public boolean interpret(string context)
}
package com.wuychn.interpreter;
public class andexpression implements expression
@override
public boolean interpret(string context)
}
interpreterpatterndemo 使用 expression 類來建立規則,並解析它們:
package com.wuychn.interpreter;
public class interpreterpatterndemo
//規則:julie 是乙個已婚的女性
public static expression getmarriedwomanexpression()
public static void main(string args)
}
執行結果:
john is male? true
julie is a married women? true
優點:
直譯器是乙個簡單語法分析工具,它最顯著的優點是擴充套件性,修改語法規則只要修改相應的非終結符表示式就可以了,若擴充套件語法,則只要增加非終結符類就可以了。
缺點:直譯器模式會引起類膨脹,每個語法都要產生乙個非終結符表示式,語法規則比較複雜時,可能產生大量的類檔案,難以維護。
直譯器模式採用遞迴呼叫方法,它導致除錯非常複雜。
直譯器由於使用了大量的迴圈和遞迴,所以當用於解析複雜、冗長的語法時,效率是難以忍受的。
原文:
設計模式之直譯器模式(Interpreter)
直譯器模式是我們暫時的最後一講,一般主要應用在oop開發中的編譯器的開發中,所以適用面比較窄。context類是乙個上下文環境類,plus和minus分別是用來計算的實現,如下 public inte ce expression public class plus implements expres...
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...