給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
解釋器模式的角色:
1. 抽象表達式角色(AbstractExpression):聲明一個所有的具體表達式角色都需要實作的抽象接口。這個接口主要是一個interpret()方法,稱作解釋操作。
2. 終結符表達式角色(Terminal Expression):實作了抽象表達式角色所需求的接口,主要是一個interpret()方法;文法中的每一個終結符都有一個具體終結表達式與之相對應。比如有一個簡單的公式:R=R1+R2,在裡面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。
3. 非終結符表達式角色(Nonterminal Expression):文法中的每一條規則都需要一個具體的非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字。比如R=R1+R2中的“+”就是非終結符,解析“+”的解釋器就是一個非終結符表達式。
4. 環境角色(Context):這個角色的任務一般是用來存放文法中各個終結符所對應的具體值。比如R=R1+R2,我們給R1指派100,給R2指派200。這些資訊需要存放到環境角色中,很多情況下我們使用Map來充當環境角色就足夠了。
這個模式确實用的不多,關于案例介紹可以翻看一下資料3.
優缺點
優點:
解釋器是一個簡單文法分析工具,它最顯著的優點是擴充性,修改文法規則隻要修改相應的非終結符表達式就可以了,若擴充文法,則隻要增加非終結符類就可以了。
缺點:
解釋器模式會引起類膨脹,每個文法都要産生一個非終結符表達式,文法規則比較複雜時,可能産生a大量的類檔案,難以維護。
解釋器模式采用遞歸調用方法,它導緻調試非常複雜。
解釋器由于使用了大量的循環和遞歸,是以當用于解析複雜、冗長的文法時,效率是難以忍受的。
TIPS: 盡量不要在重要子產品中使用解釋器模式,因為難以維護。在項目中,可以使用shell, python等腳本語言來代替解釋器模式。 JDK中的解釋器模式: java.util.Pattern java.text.Normalizer java.text.Format
參考資料