定**釋器模式(interpreter),給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。
類圖
描述
expression:抽象表示式,宣告乙個所有的具體表示式都需要實現的抽象介面;這個介面主要是乙個interpret()方法,稱做解釋操作。
terminal expression:終結符表示式,實現了抽象表示式所要求的介面;文法中的每乙個終結符都有乙個具體終結表示式與之相對應。比如公式r=r1+r2,r1和r2就是終結符,對應的解析r1和r2的直譯器就是終結符表示式。
nonterminal expression:非終結符表示式,文法中的每一條規則都需要乙個具體的非終結符表示式,非終結符表示式一般是文法中的運算子或者其他關鍵字,比如公式r=r1+r2中,「+"就是非終結符,解析「+」的直譯器就是乙個非終結符表示式。
context:環境,它的任務一般是用來存放文法中各個終結符所對應的具體值,比如r=r1+r2,給r1賦值100,給r2賦值200,這些資訊需要存放到環境中。
應用場景
首先輸入乙個加減或乘除的運算公式,比如a+b-c+a或a*b/c*a,再給每個引數賦值,最後根據公式完成運算並得到結果。
/// /// 環境
///
public class context
return this.variable;}}
}/// /// 抽象表示式
///
public abstract class expression
/// /// 變數,終結符表示式
///
public class variableexpression : expression
public override double interpret(context context)
}/// /// 操作符,非終結符表示式
///
public abstract class operatorexpression : expression
}public class addexpression : operatorexpression
public override double interpret(context context)
}public class subexpression : operatorexpression
public override double interpret(context context)
}public class mulexpression: operatorexpression
public override double interpret(context context)
}public class divexpression: operatorexpression
public override double interpret(context context)
}public class calculator
public double calculate()
if (!this.context.variable.containskey(c))
}expression left = new variableexpression(vars[0]);
expression right = null;
stackstack = new stack();
stack.push(left);
for (int i = 1; i < vars.length; i += 2)
}double value = stack.pop().interpret(this.context);
stack.clear();
return value;}}
輸入公式:a+b-c+a
賦值:a=10b=5c=3
運算結果:22
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...
直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...