摘要:描述對一個(gè)表達(dá)式進(jìn)行解釋時(shí),將表達(dá)式分為終結(jié)符非終結(jié)符運(yùn)算環(huán)境,這樣區(qū)分可以把表達(dá)式的各個(gè)部分獨(dú)立出來擴(kuò)展。
描述:對一個(gè)表達(dá)式進(jìn)行解釋時(shí),將表達(dá)式分為終結(jié)符、非終結(jié)符、運(yùn)算環(huán)境,這樣區(qū)分可以把表達(dá)式的各個(gè)部分獨(dú)立出來擴(kuò)展。
名稱解釋:
表達(dá)式:一條運(yùn)算語句,如c = a + b,它有一個(gè)解釋方法,可以計(jì)算表達(dá)式結(jié)果
終結(jié)符:表達(dá)式中的變量,如a、b,終結(jié)符表達(dá)式負(fù)責(zé)解釋終結(jié)符,即計(jì)算結(jié)果
非終結(jié)符:表達(dá)式中的運(yùn)算符,如+,非終結(jié)符表達(dá)式負(fù)責(zé)計(jì)算非終結(jié)符的結(jié)果
運(yùn)算環(huán)境:負(fù)責(zé)給終結(jié)符賦值,如a=1
場景:寫個(gè)解釋器,解釋a+b=3,其中a=1,b=2,c=0,另外擴(kuò)展一個(gè)相反數(shù)運(yùn)算使-a=-1。
實(shí)現(xiàn):
抽象一個(gè)表達(dá)式,負(fù)責(zé)解釋終結(jié)符或者非終結(jié)符,其定義一個(gè)解釋方法,計(jì)算表達(dá)式的值,同時(shí)覆蓋equals和hashCode方法,方便判斷兩個(gè)表達(dá)式是否相同
abstract class Expression { String name; Expression(String name) { this.name = name; } abstract int interpret(Context ctx); @Override public boolean equals(Object obj) { if(null == obj) { return false; } if(obj instanceof String && name.equals(obj)) { return true; } return false; } @Override public int hashCode() { return name.hashCode(); } }
定義一個(gè)終結(jié)符表達(dá)式,也就是負(fù)責(zé)計(jì)算變量的值
class Variable extends Expression { Variable(String name) { super(name); } @Override int interpret(Context ctx) { return ctx.lookup(this); } }
定一個(gè)非終結(jié)符表達(dá)式,其名為加法,負(fù)責(zé)計(jì)算兩個(gè)終結(jié)符的值
class AddExpression extends Expression { Expression var1; Expression var2; AddExpression(Expression var1, String name, Expression var2) { super(name); this.var1 = var1; this.var2 = var2; } @Override int interpret(Context ctx) { return var1.interpret(ctx) + var2.interpret(ctx); } }
如果想擴(kuò)展一種運(yùn)算,可以直接定義一個(gè)非終結(jié)符表達(dá)式,比如定義一個(gè)求相反數(shù)的運(yùn)算
//一個(gè)數(shù)的相反數(shù) class OppositeExpression extends Expression { Expression var; OppositeExpression(String name, Expression var) { super(name); this.var = var; } @Override int interpret(Context ctx) { return -var.interpret(ctx); } }
定義一個(gè)運(yùn)算環(huán)境,用于給變量賦值
class Context { Mapmap = new HashMap (); void assign(Expression var, int value) { map.put(var, value); } int lookup(Expression var) { Object obj = map.get(var); if(null == obj) { // 如果變量未初始化,默認(rèn)是0 return 0; } return (Integer) obj; } }
客戶端調(diào)用:
public static void main(String[] args) { Context ctx = new Context(); Variable a = new Variable("a"); Variable b = new Variable("b"); Variable c = new Variable("c"); // 不初始化,默認(rèn)為0 ctx.assign(a, 1); ctx.assign(b, 2); System.out.println("a = " + a.interpret(ctx)); System.out.println("b = " + b.interpret(ctx)); System.out.println("c = " + c.interpret(ctx)); // 相反數(shù)運(yùn)算 OppositeExpression opposite = new OppositeExpression("-", a); int rs = opposite.interpret(ctx); String exp = String.format("%s%s = %d", opposite.name, a.name, rs); System.out.println(exp); // 加運(yùn)算 AddExpression add = new AddExpression(a, "+", b); rs = add.interpret(ctx); exp = String.format("%s %s %s = %d", a.name, add.name, b.name, rs); System.out.println(exp); }
結(jié)果:
a = 1
b = 2
c = 0
-a = -1
a + b = 3
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64006.html
摘要:本文只是尋找設(shè)計(jì)模式在中的應(yīng)用。來補(bǔ)全這一塊工廠模式中的應(yīng)用包線程池解釋和代碼線程池中有線程創(chuàng)建工廠。狀態(tài)模式中的應(yīng)用解釋和代碼根據(jù)一個(gè)指針的狀態(tài)而改變自己的行為適配器模式中的應(yīng)用解釋和代碼將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 前言 最近重學(xué)設(shè)計(jì)模式,而且還有很多源碼要看。所以就想一舉兩得。從源碼中尋找設(shè)計(jì)模式。順便還可以看看源碼。。。本文只是尋找設(shè)計(jì)模式在java中的應(yīng)用。優(yōu)...
摘要:近日,加州大學(xué)洛杉磯分校的朱松純教授等人發(fā)布了一篇使用決策樹對的表征和預(yù)測進(jìn)行解釋的論文。在此論文中,朱松純等研究者提出了一種新任務(wù),也就是使用決策樹在語義層次上來量化解釋預(yù)測的邏輯。 近日,加州大學(xué)洛杉磯分校的朱松純教授等人發(fā)布了一篇使用決策樹對 CNN 的表征和預(yù)測進(jìn)行解釋的論文。該論文借助決策樹在語義層面上解釋 CNN 做出的每一個(gè)特定預(yù)測,即哪個(gè)卷積核(或物體部位)被用于預(yù)測最終的類...
摘要:解決方案解釋器模式來解決用來解決上述問題的一個(gè)合理的解決方案,就是使用解釋器模式。使用解釋器模式重寫示例通過上面的講述可以看出,要使用解釋器模式,一個(gè)重要的前提就是要定義一套語法規(guī)則,也稱為文法。#1 場景問題# ##1.1 讀取配置文件## 考慮這樣一個(gè)實(shí)際的應(yīng)用,維護(hù)系統(tǒng)自定義的配置文件。 幾乎每個(gè)實(shí)際的應(yīng)用系統(tǒng)都有與應(yīng)用自身相關(guān)的配置文件,這個(gè)配置文件是由開發(fā)人員根據(jù)需要自定義的,系統(tǒng)...
摘要:設(shè)計(jì)模式的類別設(shè)計(jì)模式一共分為種類型,共種。屬于結(jié)構(gòu)型的設(shè)計(jì)模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。問題描述了應(yīng)該在何時(shí)使用設(shè)計(jì)模式。解決方案描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。 設(shè)計(jì)模式概述 1. 設(shè)計(jì)模式是什么 我們在平時(shí)編寫代碼的過程中,會(huì)遇到各種各樣的問題,細(xì)想一下很多問題的解決思路大致一樣的,這時(shí)候你就可以把解決問題的思路整...
摘要:里氏代換原則里氏代換原則面向?qū)ο笤O(shè)計(jì)的基本原則之一。里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。里氏代換原則是對開閉原則的補(bǔ)充。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。 一、設(shè)計(jì)模式的六大原則: 1、開閉原則(Open Close Principle) 開閉原則就是說對擴(kuò)展開放,對修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不...
閱讀 1772·2021-10-11 10:59
閱讀 2416·2021-09-30 09:53
閱讀 1780·2021-09-22 15:28
閱讀 2804·2019-08-29 15:29
閱讀 1568·2019-08-29 13:53
閱讀 3217·2019-08-29 12:34
閱讀 2865·2019-08-26 10:16
閱讀 2673·2019-08-23 15:16