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); })); }
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); }
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())); }