public Queue <Token> Parse() { while (tokenizer.Token != TokenType.End) { switch (tokenizer.Token) { case TokenType.Number: ParseNumber(); break; case TokenType.OpenParenthesis: ParseOpenParenthesis(); break; case TokenType.CloseParenthesis: ParseCloseParenthesis(); break; default: ParseUnary(); ParseBinary(); break; } tokenizer.NextToken(); } // We can't enqueue '(' so we get exception if it doesn't have a pair try { while (operators.Count != 0) { EnqueueOperator(); } } catch (KeyNotFoundException) { throw new SyntaxException("Missing close parenthesis"); } return(output); }
Node ParseAddSubtract() { var lhs = ParseMultiplyDivide(); while (true) { Func <double, double, double> op = null; if (_tokenizer.Token == Token.Add) { op = (a, b) => a + b; } else if (_tokenizer.Token == Token.Subtract) { op = (a, b) => a - b; } if (op == null) { return(lhs); // no } _tokenizer.NextToken(); var rhs = ParseMultiplyDivide(); lhs = new NodeBinary(lhs, rhs, op); } }