public static int add(int a,int b){ return a+b; } public static int add(int a,int b,int c){ return a+b-c; }
package function; @FunctionalInterface public interface Function1<A,B,C,D,E,F,G, R> { R xxxxx(A a,B b,C c,D d,E e,F f,G g); }
範式基本規則 |
::= 表示定義,由什麼推導出
尖括號 < > 內爲必選項;
方括號 [ ] 內爲可選項;
大括號 { } 內爲可重複0至無數次的項;
圓括號 ( ) 內的全部項爲一組,用來控制表達式的優先級
豎線 | 表示或,左右的其中一個
引號內爲字符自己,引號外爲語法(好比 'for'表示關鍵字for )
|
expression:=value | plus | minus
plus:=expression ‘+’ expression
minus:=expression ‘-’ expression
value:=integer
|
值的類型爲整型數
有加法規則和減法規則
表達式能夠是一個值,也能夠是一個plus或者minus
而plus和minus又是由表達式結合運算符構成
能夠看得出來,有遞歸嵌套的概念
|
expression:=value | plus | minus
plus:=expression ‘+’ expression
minus:=expression ‘-’ expression
value:=integer
|
package interpret; public abstract class AbstractExpression { public abstract int interpret(); }
package interpret; public class Value extends AbstractExpression { private int value; Value(int value){ this.value = value; } @Override public int interpret() { return value; } }
package interpret; public class Plus extends AbstractExpression { private AbstractExpression left; private AbstractExpression right; Plus(AbstractExpression left, AbstractExpression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() + right.interpret(); } }
package interpret; public class Minus extends AbstractExpression { private AbstractExpression left; private AbstractExpression right; Minus(AbstractExpression left, AbstractExpression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() - right.interpret(); } }
package interpret; public class Client { public static void main(String[] args) { AbstractExpression expression = new Minus( new Plus(new Plus(new Plus(new Value(1), new Value(2)), new Value(3)), new Value(4)), new Value(5)); System.out.println(expression.interpret()); } }
int f(int x) { if (1 == x) { return x; } else { return x+f(x-1); } }
package interpret; public class Variable extends AbstractExpression{ private String name; private Integer value; Variable(String name,Integer value){ this.name = name; this.value = value; } public void setValue(Integer value) { this.value = value; } @Override public int interpret() { return value; } }
package interpret; public class Client { public static void main(String[] args) { //定義變量X和Y,初始值都爲0 Variable variableX = new Variable("x", 0); Variable variableY = new Variable("y", 0); //計算公式爲: X+Y+X-1 AbstractExpression expression2 = new Minus(new Plus(new Plus(variableX, variableY), variableX), new Value(1)); variableX.setValue(1); variableY.setValue(3); System.out.println(expression2.interpret()); variableX.setValue(5); variableY.setValue(6); System.out.println(expression2.interpret()); } }
package interpret.refactor; public abstract class AbstractExpression { public abstract int interpret(Context ctx); }
package interpret.refactor; public class Value extends AbstractExpression { private int value; Value(int value) { this.value = value; } @Override public int interpret(Context ctx) { return value; } @Override public String toString() { return new Integer(value).toString(); } }
package interpret.refactor; public class Variable extends AbstractExpression { private String name; Variable(String name) { this.name = name; } @Override public int interpret(Context ctx) { return ctx.getValue(this); } @Override public boolean equals(Object obj) { if (obj != null && obj instanceof Variable) { return this.name.equals( ((Variable) obj).name); } return false; } @Override public int hashCode() { return this.toString().hashCode(); } @Override public String toString() { return name; } }
package interpret.refactor; public class Plus extends AbstractExpression { private AbstractExpression left; private AbstractExpression right; Plus(AbstractExpression left, AbstractExpression right) { this.left = left; this.right = right; } @Override public int interpret(Context ctx) { return left.interpret(ctx) + right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " + " + right.toString() + ")"; } }
package interpret.refactor; public class Minus extends AbstractExpression { private AbstractExpression left; private AbstractExpression right; Minus(AbstractExpression left, AbstractExpression right) { this.left = left; this.right = right; } @Override public int interpret(Context ctx) { return left.interpret(ctx) - right.interpret(ctx); } @Override public String toString() { return "(" + left.toString() + " - " + right.toString() + ")"; } }
package interpret.refactor; import java.util.HashMap; import java.util.Map; public class Context { private Map<Variable, Integer> map = new HashMap<Variable, Integer>(); public void assign(Variable var, Integer value) { map.put(var, new Integer(value)); } public int getValue(Variable var) { Integer value = map.get(var); return value; } }
package interpret.refactor; public class Client { 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"); Variable d = new Variable("d"); Variable e = new Variable("e"); Value v = new Value(1); ctx.assign(a, 1); ctx.assign(b, 2); ctx.assign(c, 3); ctx.assign(d, 4); ctx.assign(e, 5); AbstractExpression expression = new Minus(new Plus(new Plus(new Plus(a, b), c), d), e); System.out.println(expression + "= " + expression.interpret(ctx)); } }
/** * 解析字符串,構造抽象語法樹 方法只是爲了理解:解釋器模式 方法默認輸入爲合法的字符串,沒有考慮算法優化、效率或者不合法字符串的異常狀況 * * @param sInput 合法的加減法字符串 好比 1+2+3 */ public static AbstractExpression getAST(String sInput) { //接收字符串參數形如 "1+2-3" //將字符串解析到List valueAndSymbolList中存放 List<String> valueAndSymbolList = new ArrayList<>(); //先按照 加法符號 + 拆分爲數組,以每一個元素爲單位使用 +鏈接起來存入List //若是以+ 分割內部還有減法符號 - 內部以減法符號- 分割 //最終的元素的形式爲 1,+,2,-,3 String[] splitByPlus = sInput.split("\\+"); for (int i = 0; i < splitByPlus.length; i++) { if (splitByPlus[i].indexOf("-") < 0) { valueAndSymbolList.add(splitByPlus[i]); } else { String[] splitByMinus = splitByPlus[i].split("\\-"); for (int j = 0; j < splitByMinus.length; j++) { valueAndSymbolList.add(splitByMinus[j]); if (j != splitByMinus.length - 1) { valueAndSymbolList.add("-"); } } } if (i != splitByPlus.length - 1) { valueAndSymbolList.add("+"); } } //通過前面處理元素的形式爲 1,+,2,-,3 //轉換爲抽象語法樹的形式 AbstractExpression leftExpression = null; AbstractExpression rightExpression = null; int k = 0; while (k < valueAndSymbolList.size()) { if (!valueAndSymbolList.get(k).equals("+") && !valueAndSymbolList.get(k).equals("-")) { rightExpression = new Value(Integer.parseInt(valueAndSymbolList.get(k))); if (leftExpression == null) { leftExpression = rightExpression; } } k++; if (k < valueAndSymbolList.size()) { rightExpression = new Value(Integer.parseInt(valueAndSymbolList.get(k + 1))); if (valueAndSymbolList.get(k).equals("+")) { leftExpression = new Plus(leftExpression, rightExpression); } else if (valueAndSymbolList.get(k).equals("-")) { leftExpression = new Minus(leftExpression, rightExpression); } k++; } } return leftExpression; }