Exemple #1
0
        private bool HasKeyword()
        {
            return(Grammar.Keywords.Keys.Any(k =>
            {
                if (k == null)
                {
                    throw new ArgumentNullException(nameof(k));
                }
                var p1 = _source.ElementAtOrDefault(_currentCharOffset + k.Length);

                return !CharacterUtilities.IsDigitLetterOrUnderscore(p1) &&
                string.Equals(PeekMany(k.Length), k, StringComparison.InvariantCultureIgnoreCase);
            }));
        }
Exemple #2
0
        private SyntaxNode Scan()
        {
            _state = (SafePeekChar(), SafePeekCharP1()) switch
            {
                var(c1, _) when c1.HasValue&& CharacterUtilities.IsWhitespace(c1.Value) => ScannerState.Whitespace,
                ('<', _) => ScannerState.Html,
                ('/', '/') => ScannerState.LineComment,
                ('/', '*') => ScannerState.BlockComment,
                ('#', _) => ScannerState.Preprocessor,

                var(c1, c2) when c1.HasValue &&
                c2.HasValue &&
                Grammar.Punctuation.ContainsKey($"{c1.Value}{c2.Value}") =>
                ScannerState.Punctuation2,

                var(c1, _) when c1.HasValue&& Grammar.Punctuation.ContainsKey($"{c1.Value}") => ScannerState
                .Punctuation1,

                ('"', _) => ScannerState.String,
                var(c1, _) when c1.HasValue&& char.IsDigit(c1.Value) => ScannerState.Number,
                ('.', var c2)when c2.HasValue && char.IsDigit(c2.Value) => ScannerState.Number,
                ('-', var c2)when c2.HasValue && (char.IsDigit(c2.Value) || c2.Value == '.') => ScannerState.Number,

                var(c1, _) when c1.HasValue&& char.IsLetter(c1.Value) => HasKeyword()
                    ? ScannerState.Keyword
                    : ScannerState.Id,

                var(c1, _) when c1.HasValue&& CharacterUtilities.IsDigitLetterOrUnderscore(c1.Value) => ScannerState
                .Id,

                _ => ScannerState.Nothing
            };

            if (_state == ScannerState.Nothing)
            {
                return(null);
            }
            NextNode();
            return(_currentNode);
        }
Exemple #3
0
        private SyntaxToken ScanId()
        {
            _scratch.Clear();

            var start = _currentCharOffset;

            if (!char.IsLetter(CurrentChar) && CurrentChar != '_')
            {
                throw GetException($"Expecting letter or _, found {CurrentChar}.");
            }

            _scratch.Append(CurrentChar);
            NextChar();

            while (true)
            {
                if (Empty())
                {
                    break;
                }
                var c = CurrentChar;

                if (CharacterUtilities.IsDigitLetterOrUnderscore(c))
                {
                    _scratch.Append(c);
                }
                else
                {
                    break;
                }

                NextChar();
            }

            return(new StringSyntax(SyntaxKind.IdToken, start, _currentCharOffset - start, _scratch.ToString()));
        }