#include <iostream>
#include <string>

std::string exp;
std::string next;
bool eol = false;

std::string peekNext () {
	if (next == "" && !eol)
		std::cin >> next;
	if (next == ";")
		eol = true;
	return next;
}

std::string getNext () {
	std::string temp = peekNext(); //pascal would allow for less sketchy code
	next = "";
	return temp;
}

int getNextAsInt () {
	return std::stoi (getNext());
}

void ThrowFatal (const char* msg) {
	std::cout << "[EXPR PARSER] FATAL: " << msg << "\n";
}

int parseExpr (int op1) {
	const std::string& op = getNext(); 
	int op2 = getNextAsInt();
	peekNext();	
	if (!eol) //theres more to parse
		op2 = parseExpr (op2);
	if (op == "mul") {
		return op1 * op2;
	} else if (op == "div") {
		return op1 / op2;
	} else if (op == "add") {
		return op1 + op2;
	} else if (op == "sub") {
		return op1 - op2;
	}
	ThrowFatal ("OPERATOR NOT FOUND");
	return -1;
}

int main () {
	//expects expressions in the form a <op> b <op> c ... <op> z <space> ;
	std::cout << "PARSING EXPRESSIONS\n >> ";
	int res = parseExpr (getNextAsInt());
	std::cout << "EXPRESSION EQUALS " << res << "\n";
}