示例#1
0
        private IToken ReadNumber(bool pComma = false)
        {
            //CheckNegative();

            string numberStr = $"{Chars.Dequeue()}";

            while (IsDigit(Chars.Peek()))
            {
                numberStr += Chars.Dequeue();
            }

            double number = double.Parse(numberStr);

            if (!pComma && Chars.Peek().Equals('.'))
            {
                Chars.Dequeue();
                numberStr = "";
                int decCounter = 1;
                while (IsDigit(Chars.Peek()))
                {
                    numberStr  += Chars.Dequeue();
                    decCounter *= 10;
                }
                number += (double.Parse(numberStr) / decCounter);
            }

            return(new NumberToken
            {
                Number = number
            });
        }
示例#2
0
        public PositionQueue <IToken> Analyze(string pInput)
        {
            Tokens = new PositionQueue <IToken>();
            Chars  = BuildQueue(pInput);

            while (Chars.Count > 0)
            {
                IToken token = null;
                if (IsWhitespace(Chars.Peek()))
                {
                    Chars.Dequeue();
                }
                else if (IsDigit(Chars.Peek()))
                {
                    token = ReadNumber();
                }
                else if (IsOperation(Chars.Peek()))
                {
                    if (Tokens[Tokens.Count - 1].GetTokenType() == TokenType.Operator)
                    {
                        throw new NotImplementedException($"unexpected symbol \"{Chars.Dequeue()}\" at position {Chars.Position}");
                    }
                    else
                    {
                        token = ReadOperation();
                    }
                }
                else
                {
                    throw new NotImplementedException($"unexpected symbol \"{Chars.Dequeue()}\" at position {Chars.Position}");
                }
                if (token != null)
                {
                    Tokens.Enqueue(token);
                }
            }

            return(Tokens);
        }