Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }