Exemple #1
0
        internal virtual bool TryReadNumericLiteral(ILookaroundEnumerator <char> enumerator, [NotNullWhen(true)] out Token?token)
        {
            token = default;
            if (enumerator.Current.IsDigit() == false)
            {
                return(false);
            }
            using var checkoutRecord = StringBuilderPool.Instance.Checkout();
            var stringBuilder = checkoutRecord.CheckedOutObject;

            stringBuilder.Append(enumerator.Current);
            var hasDecimal = false;

            // Get the portion before the decimal point...
            while (enumerator.TryGetNext(out var nextChar) && nextChar.IsDigit())
            {
                stringBuilder.Append(enumerator.MoveNextAndGetValue(out _));
            }

            // Attempt to get the decimal point
            if (enumerator.TryGetNext(out var decimalPoint) && decimalPoint == '.' &&
                enumerator.TryGetNext(out var decimalDigit, 2) && decimalDigit.IsDigit())
            {
                hasDecimal = true;
                stringBuilder.Append(enumerator.MoveNextAndGetValue(out _));
            }

            // Get the portion after the decimal point...
            while (hasDecimal && enumerator.TryGetNext(out var nextChar) && nextChar.IsDigit())
            {
                stringBuilder.Append(enumerator.MoveNextAndGetValue(out _));
            }

            token = new Token(hasDecimal ? TokenType.FloatingLiteral : TokenType.IntegerLiteral, null, stringBuilder);
            return(true);
        }
Exemple #2
0
        internal virtual bool TryReadIdentifier(ILookaroundEnumerator <char> enumerator, [NotNullWhen(true)] out Token?token)
        {
            token = default;
            if (enumerator.Current.IsLetter() == false && enumerator.Current != '_')
            {
                return(false);
            }
            using var checkoutRecord = StringBuilderPool.Instance.Checkout();
            var stringBuilder = checkoutRecord.CheckedOutObject;

            stringBuilder.Append(enumerator.Current);
            while (enumerator.TryGetNext(out var nextChar) && nextChar.IsLetter() || nextChar.IsDigit() || nextChar == '_')
            {
                stringBuilder.Append(enumerator.MoveNextAndGetValue(out _));
            }
            token = new Token(TokenType.Identifier, null, stringBuilder);
            return(true);
        }