import syntaxtree.*;
import visitor.*;
import java.io.*;
import java.util.*;


class Compute extends GJDepthFirst <Integer, Integer> {

	public Integer visit(Goal n, Integer _) {
		return n.f0.accept(this, null);
	}

	public Integer visit(AdditiveExpression n, Integer _) {
		return n.f1.accept(this, n.f0.accept(this, null));
	}

	public Integer visit(AdditiveExpressionTail n, Integer s) {
		Enumeration<Node> e = n.f0.elements();
		while (e.hasMoreElements())
			s = e.nextElement().accept(this, s);
		return s;
	}

	public Integer visit(PlusExpression n, Integer s) {
		return s + n.f1.accept(this, null);
	}

	public Integer visit(MinusExpression n, Integer s) {
		return s - n.f1.accept(this, null);
	}

	public Integer visit(MultiplicativeExpression n, Integer _) {
		return n.f1.accept(this, n.f0.accept(this, null));
	}

	public Integer visit(MultiplicativeExpressionTail n, Integer s) {
		Enumeration<Node> e = n.f0.elements();
		while (e.hasMoreElements())
			s = e.nextElement().accept(this, s);
		return s;
	}

	public Integer visit(MultExpression n, Integer s) {
		return s * n.f1.accept(this, null);
	}

	public Integer visit(DivExpression n, Integer s) {
		return s / n.f1.accept(this, null);
	}

	public Integer visit(BracketExpression n, Integer _) {
		return n.f1.accept(this, null);
	}

	public Integer visit(Constant n, Integer _) {
		return new Integer(n.f0.toString());
	}

	public static void main(String[] args) throws Exception {
		CalcParser parser = new CalcParser(System.in);
		Goal tree = parser.Goal();
		Compute visitor = new Compute();
		System.out.println(tree.accept(visitor, null));
	}
}
