5
HashMap<String, Deque<Integer>> scope;7
// variable may be assigned many times, we use the peek value9
public int evaluate(String expression) {10
this.expression = expression;12
scope = new HashMap<>();16
private int evaluate() {18
if (expression.charAt(index) == '(') {19
// this is an expression21
char begin = expression.charAt(index);25
index += 4; // skip let and a blank space26
ArrayList<String> vars = new ArrayList<>();28
if (!Character.isLowerCase(expression.charAt(index))) {32
String var = parseVar();33
if (expression.charAt(index) == ')') {34
ret = scope.get(var).peek();40
scope.putIfAbsent(var, new LinkedList<>());41
scope.get(var).push(e); // assign a new value44
for (String var : vars) {45
scope.get(var).pop(); // remove all values of this scope48
} else if (begin == 'a') {66
// this is not a expression, this is an integer or a variable67
if (Character.isLowerCase(expression.charAt(index))) {68
// this is a variable, the current value is peek value69
String var = parseVar();70
return scope.get(var).peek();79
private int parseInt() {80
boolean negative = false;81
if (expression.charAt(index) == '-') {86
while (Character.isDigit(expression.charAt(index))) {88
ret += expression.charAt(index) - '0';91
if (negative) return -ret;96
private String parseVar() {97
StringBuilder sb = new StringBuilder();98
char c = expression.charAt(index);99
while (c != ' ' && c != ')') {101
c = expression.charAt(++index);103
return sb.toString();