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