/// <summary> /// Parses an identifier. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="ch">The first character of the identifier.</param> /// <returns>The ID of the token that was matched.</returns> protected virtual int ParseIdentifier(ITextBufferReader reader, char ch) { // Get the entire word int startOffset = reader.Offset - 1; while (!reader.IsAtEnd) { char ch2 = reader.Read(); // NOTE: This could be improved by supporting \u escape sequences if ((!char.IsLetterOrDigit(ch2)) && (ch2 != '_')) { reader.ReadReverse(); break; } } // Determine if the word is a keyword if (Char.IsLetter(ch)) { int value; String subString = reader.GetSubstring(startOffset, reader.Offset - startOffset); if (!caseSensitive) { subString = subString.ToLowerInvariant(); } return(keywords.TryGetValue(subString, out value) ? value : SimpleTokenId.Identifier); } else { return(SimpleTokenId.Identifier); } }
/// <summary> /// Parses an identifier. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="ch">The first character of the identifier.</param> /// <returns>The ID of the token that was matched.</returns> protected virtual int ParseIdentifier(ITextBufferReader reader, char ch) { // Get the entire word int startOffset = reader.Offset - 1; while (!reader.IsAtEnd) { // Accept namespaced identifiers if (reader.Peek(1) == ':' && reader.Peek(2) == ':' && char.IsLetterOrDigit(reader.Peek(3))) { reader.Read(); reader.Read(); reader.Read(); continue; } char ch2 = reader.Read(); // NOTE: This could be improved by supporting \u escape sequences if ((!char.IsLetterOrDigit(ch2)) && (ch2 != '_')) { reader.ReadReverse(); break; } } // Determine if the word is a keyword if (Char.IsLetter(ch)) { object value = keywords[reader.GetSubstring(startOffset, reader.Offset - startOffset)]; if (value != null) { return((int)value); } else { return(LuatTokenId.Identifier); } } else { return(LuatTokenId.Identifier); } }
/// <summary> /// Parses an identifier. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="ch">The first character of the identifier.</param> /// <returns>The ID of the token that was matched.</returns> protected virtual int ParseIdentifier(ITextBufferReader reader, char ch) { // Get the entire word int startOffset = reader.Offset - 1; while (!reader.IsAtEnd) { char ch2 = reader.Read(); if ((!char.IsLetterOrDigit(ch2)) && (ch2 != '_')) { reader.ReadReverse(); break; } } // This language only has one keyword named "date" if (reader.GetSubstring(startOffset, reader.Offset - startOffset) == "date") { return(ParentTokenId.DateKeyword); } // Word is an identifier return(ParentTokenId.Identifier); }
/// <summary> /// Parses an identifier. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="ch">The first character of the identifier.</param> /// <returns>The ID of the token that was matched.</returns> protected virtual int ParseIdentifier(ITextBufferReader reader, char ch) { // Get the entire word int startOffset = reader.Offset - 1; while (!reader.IsAtEnd) { // Accept namespaced identifiers if ( reader.Peek( 1 ) == ':' && reader.Peek( 2 ) == ':' && char.IsLetterOrDigit( reader.Peek( 3 ) ) ) { reader.Read(); reader.Read(); reader.Read(); continue; } char ch2 = reader.Read(); // NOTE: This could be improved by supporting \u escape sequences if ((!char.IsLetterOrDigit(ch2)) && (ch2 != '_')) { reader.ReadReverse(); break; } } // Determine if the word is a keyword if (Char.IsLetter(ch)) { object value = keywords[reader.GetSubstring(startOffset, reader.Offset - startOffset)]; if (value != null) return (int)value; else return LuatTokenId.Identifier; } else return LuatTokenId.Identifier; }