設計モード(十五)----解釈器モード(Interpreter)---(JAVA版)


インタプリタモード
言語を指定し、文法の表現を定義し、言語の文を説明するために使用される解釈器を定義します.
適用性
実行を解釈する言語があり、その言語の文を抽象構文ツリーとして表すことができる場合は、解釈モードを使用します.このモードの効果は、以下の場合に最適です.
1.この文法は単純で複雑な文法に対して、文法の階層が膨大になり管理できなくなる
2.効率は重要な問題ではありません.最も効率的な解釈器は、通常、構文解析ツリーを直接解釈することによって実現されるのではなく、まず別の形式に変換される.
参加者
1.AbstractExpression(抽象式)
抽象構文ツリー内のすべてのノードで共有される抽象的な解釈操作を宣言します.
2.TerminalExpression(ターミネータ式)
文法の終端に関連する解釈操作を実現する.1つの文の各終端には、クラスのインスタンスが必要です.
3.NonterminalExpression(エンドマーク以外の式)
文法における非終端子の解釈(Interpret)操作を実現する
4.Context(コンテキスト)
解釈器以外のグローバル情報を含む
5.Client
構文定義言語の特定の文を表す抽象構文ツリーを構築(または指定)します.この抽象構文ツリーは、TerminalExpressionとNonterminalExpressionのインスタンスによって組み立てられています.
一例
1.AbstractExpression
public interface Expression {
 void interpret(Context c);
}

2.Expression
public class SimpleExpression implements Expression {

 @Override
 public void interpret(Context c) {
  System.out.println("       。。。");
 }
}
public class AdvanceExpression implements Expression {

 @Override
 public void interpret(Context c) {
  System.out.println("       。。。");
 }
}

3.Context
public class Context {
 private String content;
 private List list = new ArrayList();

 public String getContent() {
  return content;
 }

 public void setContent(String content) {
  this.content = content;
 }

 public List getList() {
  return list;
 }

 public void add(Expression e) {
  list.add(e);
 }
}

4.test
public class Test {
 public static void main(String[] args) {
  Context c = new Context();
  c.add(new SimpleExpression());
  c.add(new AdvanceExpression());
  c.add(new SimpleExpression());
  for (Expression eps : c.getList()) {
   eps.interpret(c);
  }
 }
}

result
これは简単な解釈器です...これは先進的な解釈器です...これは简単な解釈器です...
参加文献:
1.http://rainbowj234.diandian.com/post/2011-11-20/6967684
2.http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html
3.http://wuquanyin1011.iteye.com/blog/709682