import java.util.*;
public class LispqEvaluator {
private int index = 0;
public int evaluate(String expression) {
index = 0;
return parseExpression(expression);
}
private int parseExpression(String expression) {
if (expression.charAt(index) != '(') {
return parseInt(expression);
}
index++; // Skip '('
String op = parseOp(expression);
int a = parseExpression(expression);
int b = parseExpression(expression);
index++; // Skip ')'
return calculate(op, a, b);
}
private String parseOp(String expression) {
StringBuilder sb = new StringBuilder();
while (expression.charAt(index) != ' ') {
sb.append(expression.charAt(index++));
}
index++; // Skip ' '
return sb.toString();
}
private int parseInt(String expression) {
int sign = 1;
if (expression.charAt(index) == '-') {
sign = -1;
index++;
}
int num = 0;
while (index < expression.length() && Character.isDigit(expression.charAt(index))) {
num = num * 10 + (expression.charAt(index++) - '0');
}
if (index < expression.length() && expression.charAt(index) == ' ') {
index++; // Skip ' '
}
return sign * num;
}
private int calculate(String op, int a, int b) {
switch (op) {
case "add": return a + b;
case "sub": return a - b;
case "mul": return a * b;
case "div":
if (b == 0) return 0; // Handle division by zero
return a / b;
default: return 0;
}
}
public static void main(String[] args) {
LispqEvaluator evaluator = new LispqEvaluator();
System.out.println(evaluator.evaluate("(mul 3 -7)")); // -21
System.out.println(evaluator.evaluate("(add 1 2)")); // 3
System.out.println(evaluator.evaluate("(sub (mul 2 4) (div 9 3))")); // 5
}
}