Beispiel #1
0
        private void ParseDigit()
        {
            StringBuilder tmpNumber = new StringBuilder();

            while (Token.IsDigit(token))
            {
                CollectToken(ref tmpNumber);
            }

            operands.Push(double.Parse(tmpNumber.ToString(), System.Globalization.CultureInfo.InvariantCulture));
            TryInsertMultiply();
            TryRightSideOperator();
        }
Beispiel #2
0
        /// <summary>
        /// Parse primary tokens: digits, variables, functions, parentheses
        /// </summary>
        private void ParsePrimary()
        {
            if (Token.IsDigit(token)) // reading numbers
            {
                ParseDigit();
            }
            else if (Token.IsName(token)) // variable or function (both binary and unary)
            {
                ParseName();
            }
            else if (Token.IsUnary(token)) // unary operator (unary minus)
            {
                PushOperator(Token.ConvertOperator(token));
                NextToken();
                ParsePrimary();
            }
            else if (token == Token.PLeft) // parentheses
            {
                NextToken();
                operators.Push(Token.Sentinel); // add sentinel to operators stack
                ParseBinary();
                Expect(Token.PRight, Token.Separator);
                operators.Pop(); // pop sentinel from the stack

                TryInsertMultiply();
                TryRightSideOperator();
            }
            else if (token == Token.Separator) // arguments separator in funtions (',')
            {
                NextToken();
                ParsePrimary();
            }
            else
            {
                ThrowException("Syntax error");
            }
        }