private ITripleExpression Atomic() { GetNext(); ITripleExpression ret; switch (current) { case State.number: ret = new Const(constant); GetNext(); break; case State.variable: ret = new Variable(Char.ToString(variable)); GetNext(); break; case State.minus: ret = new Subtract(new Const(0), Atomic()); break; case State.abs: ret = new Abs(Atomic()); break; case State.square: ret = new Square(Atomic()); break; case State.lparen: ret = Shifts(); if (current != State.rparen) { Console.WriteLine(") missing"); throw new InvalidOperationException(") missing"); } GetNext(); break; default: ret = null; Console.WriteLine("Unrecognizable format"); throw new InvalidOperationException("Unrecognizable format"); break; } return(ret); }
private ITripleExpression AddSubt() { ITripleExpression left = MulDiv(); while (true) { switch (current) { case State.minus: left = new Subtract(left, MulDiv()); break; case State.plus: left = new Add(left, MulDiv()); break; default: return(left); } } }