設(shè)計(jì)模式_20_解釋器模式

基本介紹

  1. 在編譯原理中悍缠, -一個(gè)算術(shù)表達(dá)式通過詞法分析器形成詞法單元,而后這些詞法單元再通過語法分析器構(gòu)建語法分析樹诀黍,最終形成-顆抽象的語法分析樹髓抑。這里的詞法分析器和語法分析器都可以看做是解釋器
  2. 解釋器模式(Interpreter Pattern) :是指給定一一個(gè)語言 (表達(dá)式)咙崎,定義它的文法的一種表示,并定義一個(gè)解釋器吨拍,使用該解釋器來解釋語言中的句子(表達(dá)式)
  3. 應(yīng)用場景
    ● 應(yīng)用可以將一個(gè)需要解釋執(zhí)行的語言中的句子表示為一個(gè)抽象語法樹
    ● 一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來表達(dá)
    ● 一個(gè)簡單語法需要解釋的場景
  4. 這樣的例子還有褪猛,比如編譯器、運(yùn)算表達(dá)式計(jì)算羹饰、正則表達(dá)式伊滋、機(jī)器人等

例子:
使用解釋器模式完成加減運(yùn)算


image.png
public abstract class Expression {

    public abstract int interpret(HashMap<String, Integer> var);
    
}

public class VarExpression extends Expression{
    
    private String key;

    public VarExpression(String key) {
        super();
        this.key = key;
    }

    @Override
    public int interpret(HashMap<String, Integer> var) {
        // TODO Auto-generated method stub
        return var.get(this.key);
    }

}
public class SymbolExpression extends Expression{

     protected Expression left;
     protected Expression right;
     
     
     
    public SymbolExpression(Expression left, Expression right) {
        super();
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(HashMap<String, Integer> var) {
        // TODO Auto-generated method stub
        return 0;
    }
    
}

public class AddExpression extends SymbolExpression {
    
    

    public AddExpression(Expression left, Expression right) {
        super(left, right);
        // TODO Auto-generated constructor stub
    }

    @Override
    public int interpret(HashMap<String, Integer> var) {
        // TODO Auto-generated method stub
        return super.left.interpret(var)+super.right.interpret(var);
    }

}

public class SubExpression extends SymbolExpression{

    public SubExpression(Expression left, Expression right) {
        super(left, right);
        // TODO Auto-generated constructor stub
    }

    @Override
    public int interpret(HashMap<String, Integer> var) {
        // TODO Auto-generated method stub
         return super.left.interpret(var) - super.right.interpret(var);
    }

}

public class Caculator {
    
    Expression expression;
    Expression left;
    Expression right;
    
    public Caculator(String expStr) {
        // TODO Auto-generated constructor stub
        Stack<Expression> stack = new Stack<>();
        char[] cs = expStr.toCharArray();
        
        for(int i=0; i<cs.length;i++){
            switch (cs[i]) {
            case '+':
                 left = stack.pop();
                 right = new VarExpression(String.valueOf(cs[++i]));
                 stack.push(new AddExpression(left, right));
                break;
            case '-':
                 left = stack.pop();
                 right = new VarExpression(String.valueOf(cs[++i]));
                 stack.push(new SubExpression(left, right));
                 break;
            default:
                expression = new VarExpression(String.valueOf(cs[i]));
                stack.push(expression);
                break;
            }
        }
        this.expression = stack.pop();
    }
    
    public int run(HashMap<String, Integer> var){
        return this.expression.interpret(var);
    }

}

public class Client {
    
    public static void main(String[] args) {
        
        String expStr ="a+b-c+d";
        HashMap<String, Integer> var = new HashMap<>();
        var.put("a", 10);
        var.put("b", 50);
        var.put("c", 80);
        var.put("d", 40);       
        Caculator caculator = new Caculator(expStr);        
        System.out.println(caculator.run(var));
    }
}

解釋器模式的注意事項(xiàng)和細(xì)節(jié)

  1. 當(dāng)有一個(gè)語言需要解釋執(zhí)行,可將該語言中的句子表示為一個(gè)抽象語法樹,就可以考慮使用解釋器模式,讓程序具有良好的擴(kuò)展性
  2. 應(yīng)用場景:編譯器戴卜、運(yùn)算表達(dá)式計(jì)算、正則表達(dá)式燥撞、機(jī)器人等;
  3. 使用解釋器可能帶來的問題:解釋器模式會引起類膨脹、解釋器模式采用遞歸調(diào)用方法,將會導(dǎo)致調(diào)試非常復(fù)雜物舒、效率可能降低.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末色洞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冠胯,更是在濱河造成了極大的恐慌火诸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠察,死亡現(xiàn)場離奇詭異置蜀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悉盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門盯荤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焕盟,你說我怎么就攤上這事秋秤。” “怎么了脚翘?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵灼卢,是天一觀的道長。 經(jīng)常有香客問我来农,道長鞋真,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任备图,我火速辦了婚禮灿巧,結(jié)果婚禮上赶袄,老公的妹妹穿的比我還像新娘揽涮。我一直安慰自己,他們只是感情好饿肺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布蒋困。 她就那樣靜靜地躺著,像睡著了一般敬辣。 火紅的嫁衣襯著肌膚如雪雪标。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天溉跃,我揣著相機(jī)與錄音村刨,去河邊找鬼。 笑死撰茎,一個(gè)胖子當(dāng)著我的面吹牛嵌牺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼逆粹,長吁一口氣:“原來是場噩夢啊……” “哼募疮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僻弹,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤阿浓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹋绽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芭毙,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年卸耘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稿蹲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹊奖,死狀恐怖苛聘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忠聚,我是刑警寧澤设哗,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站两蟀,受9級特大地震影響网梢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赂毯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一战虏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧党涕,春花似錦烦感、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肥荔,卻和暖如春绿渣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燕耿。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工中符, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人誉帅。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓淀散,卻偏偏與公主長得像谭期,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吧凉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345