直譯器模式

2021-08-29 15:47:17 字數 2107 閱讀 3406

定**釋器模式(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...

直譯器模式

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...