Example #1
0
        private void ReadNumber(bool startsWithNumber = false)
        {
            var isDouble       = false;
            var endsWithNumber = false;

            while (true)
            {
                if (char.IsDigit(Current))
                {
                    if (_position == _start)
                    {
                        startsWithNumber = true;
                    }

                    endsWithNumber = true;
                    _position++;
                    continue;
                }

                if (Current == '.')
                {
                    endsWithNumber = false;

                    if (isDouble)
                    {
                        _position++;
                        break;
                    }

                    isDouble = true;
                    _position++;
                    continue;
                }
                break;
            }

            var length = _position - _start;
            var text   = _text.ToString(_start, length);

            if (!endsWithNumber)
            {
                var span     = new TextSpan(_start, length);
                var location = new TextLocation(_text, span);
                _diagnostics.ReportInvalidExpressionTerm(location, text);

                _value = 0;
                _kind  = SyntaxKind.NumberToken;
            }

            if (isDouble)
            {
                if (!double.TryParse(text, out var doubleValue))
                {
                    var span     = new TextSpan(_start, length);
                    var location = new TextLocation(_text, span);
                    _diagnostics.ReportInvalidNumber(location, text, TypeSymbol.Double);
                }
                _value = doubleValue;
                _kind  = SyntaxKind.NumberToken;
            }
            else
            {
                if (!int.TryParse(text, out var intValue))
                {
                    var span     = new TextSpan(_start, length);
                    var location = new TextLocation(_text, span);
                    _diagnostics.ReportInvalidNumber(location, text, TypeSymbol.Int);
                }
                _value = intValue;
                _kind  = SyntaxKind.NumberToken;
            }
        }