天天看點

解釋器模式

解釋器模式,簡單來講就是一個簡版的編譯器,如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得将該問題的各個執行個體表述為一個簡單語言中的句子。解釋器模式能對一些較頻率執行的文法轉換為一種特定的文法類型,不過解釋器模式也有其不足,就是如果文法較為複雜的話,就得需要将每一個文法轉換成至少一個類,如果包含許多規則的文法可能難以維護和管理。這個時候就需要其他的技術,就是我們最開始提到的文法分析程式或編譯器來處理。

解釋器模式的基本類結構圖很簡單,最基本的實作也很簡單。

解釋器模式

1 package day_13_interpreter;
 2 
 3 /**
 4  * 包含解釋器之外的一些全局資訊,或者說這就是解釋器要解釋得文法
 5  * @author 餘林豐
 6  *
 7  * 2016年10月13日
 8  */
 9 public class Context {
10 
11 }      
1 package day_13_interpreter;
 2 
 3 /**
 4  * 解釋器接口
 5  * @author 餘林豐
 6  *
 7  * 2016年10月13日
 8  */
 9 public interface IExpression {
10     void interpret(Context context);
11 }      
1 package day_13_interpreter;
 2 
 3 /**
 4  * 非終結符表達式,為文法中的非終結符實作解釋操作。對每一條規則都要有一個非終結符表達式。
 5  * @author 餘林豐
 6  *
 7  * 2016年10月13日
 8  */
 9 public class NonterminalExpression implements IExpression {
10 
11     /* (non-Javadoc)
12      * @see day_13_interpreter.IExpression#interpret(day_13_interpreter.Context)
13      */
14     @Override
15     public void interpret(Context context) {
16         System.out.println("非終結符解釋器");
17     }
18 
19 }      
1 package day_13_interpreter;
 2 
 3 /**
 4  * 終結符表達式,實作與文法中的終結符相關聯的解釋操作
 5  * @author 餘林豐
 6  *
 7  * 2016年10月13日
 8  */
 9 public class TerminalExpression implements IExpression {
10 
11     /* (non-Javadoc)
12      * @see day_13_interpreter.IExpression#interpret(day_13_interpreter.Context)
13      */
14     @Override
15     public void interpret(Context context) {
16         System.out.println("終結符解釋器");
17     }
18 
19 }      
1 package day_13_interpreter;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 /**
 7  * @author 餘林豐
 8  *
 9  * 2016年10月13日
10  */
11 public class Client {
12     
13     public static void main(String[] args){
14         Context context = new Context();
15         List<IExpression> list = new ArrayList<IExpression>();
16         list.add(new TerminalExpression());
17         list.add(new NonterminalExpression());
18         list.add(new TerminalExpression());
19         list.add(new TerminalExpression());
20         
21         for (IExpression expression : list){
22             expression.interpret(context);
23         }
24     }
25     
26 }      

不積跬步,無以至千裡;不積小流,無以成江海。