定義
給定一種語言,定義他的文法的一種表示趣兄,并定義一個解釋器悼嫉,該解釋器使用該表示來解釋語言中句子。
角色
抽象解釋器:
聲明一個所有具體表達式都要實現(xiàn)的抽象接口(或者抽象類)蹋凝,接口中主要是一個interpret()方法总棵,稱為解釋操作。具體解釋任務(wù)由它的各個實現(xiàn)類來完成情龄,具體的解釋器分別由終結(jié)符解釋器TerminalExpression和非終結(jié)符解釋器NonterminalExpression完成。終結(jié)符表達式:
實現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作鞍爱,通常一個解釋器模式中只有一個終結(jié)符表達式专酗,但有多個實例,對應(yīng)不同的終結(jié)符沉填。終結(jié)符一半是文法中的運算單元佑笋,比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結(jié)符允青,對應(yīng)的解析R1和R2的解釋器就是終結(jié)符表達式卵沉。非終結(jié)符表達式:
文法中的每條規(guī)則對應(yīng)于一個非終結(jié)符表達式史汗,非終結(jié)符表達式一般是文法中的運算符或者其他關(guān)鍵字拒垃,比如公式R=R1+R2中,+就是非終結(jié)符戈毒,解析+的解釋器就是一個非終結(jié)符表達式横堡。非終結(jié)符表達式根據(jù)邏輯的復(fù)雜程度而增加,原則上每個文法規(guī)則都對應(yīng)一個非終結(jié)符表達式命贴。環(huán)境角色:
這個角色的任務(wù)一般是用來存放文法中各個終結(jié)符所對應(yīng)的具體值,比如R=R1+R2污茵,我們給R1賦值100葬项,給R2賦值200。這些信息需要存放到環(huán)境角色中襟士,很多情況下我們使用Map來充當環(huán)境角色就足夠了。
代碼
上下文Context
class Context {}
抽象解釋器實現(xiàn)類
abstract class Expression {
public abstract Object interpreter(Context ctx);
}
具體解釋器實現(xiàn)類1
class TerminalExpression extends Expression {
public Object interpreter(Context ctx){
return null;
}
}
具體解釋器實現(xiàn)類2
class NonterminalExpression extends Expression {
public NonterminalExpression(Expression...expressions){
}
public Object interpreter(Context ctx){
return null;
}
}
Client
public class Client {
public static void main(String[] args){
String expression = "";
char[] charArray = expression.toCharArray();
Context ctx = new Context();
Stack<Expression> stack = new Stack<Expression>();
for(int i=0;i<charArray.length;i++){
//進行語法判斷敌蜂,遞歸調(diào)用
}
Expression exp = stack.pop();
exp.interpreter(ctx);
}
}