/// <summary> /// Creates an <see cref="IToken"/> that represents the range of text with the specified lexical parse data. /// </summary> /// <param name="startOffset">The start offset of the token.</param> /// <param name="length">The length of the token.</param> /// <param name="lexicalParseFlags">The <see cref="LexicalParseFlags"/> for the token.</param> /// <param name="parentToken">The <see cref="IToken"/> that starts the current state scope specified by the <see cref="ITokenLexicalParseData.LexicalState"/> property.</param> /// <param name="lexicalParseData">The <see cref="ITokenLexicalParseData"/> that contains lexical parse information about the token.</param> /// <returns></returns> public override IToken CreateToken(int startOffset, int length, LexicalParseFlags lexicalParseFlags, IToken parentToken, ITokenLexicalParseData lexicalParseData) { return new LuatToken(startOffset, length, lexicalParseFlags, parentToken, lexicalParseData); }
/// <summary> /// Creates an <see cref="IToken"/> that represents the range of text with the specified lexical parse data. /// </summary> /// <param name="startOffset">The start offset of the token.</param> /// <param name="length">The length of the token.</param> /// <param name="lexicalParseFlags">The <see cref="LexicalParseFlags"/> for the token.</param> /// <param name="parentToken">The <see cref="IToken"/> that starts the current state scope specified by the <see cref="ITokenLexicalParseData.LexicalState"/> property.</param> /// <param name="lexicalParseData">The <see cref="ITokenLexicalParseData"/> that contains lexical parse information about the token.</param> /// <returns></returns> public override IToken CreateToken(int startOffset, int length, LexicalParseFlags lexicalParseFlags, IToken parentToken, ITokenLexicalParseData lexicalParseData) { return(new LuatToken(startOffset, length, lexicalParseFlags, parentToken, lexicalParseData)); }
///////////////////////////////////////////////////////////////////////////////////////////////////// // OBJECT ///////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Initializes a new instance of the <c>LuatToken</c> class. /// </summary> /// <param name="startOffset">The start offset of the token.</param> /// <param name="length">The length of the token.</param> /// <param name="lexicalParseFlags">The <see cref="LexicalParseFlags"/> for the token.</param> /// <param name="parentToken">The <see cref="IToken"/> that starts the current state scope specified by the <see cref="IToken.LexicalState"/> property.</param> /// <param name="lexicalParseData">The <see cref="ITokenLexicalParseData"/> that contains lexical parse information about the token.</param> public LuatToken(int startOffset, int length, LexicalParseFlags lexicalParseFlags, IToken parentToken, ITokenLexicalParseData lexicalParseData) : base(startOffset, length, lexicalParseFlags, parentToken, lexicalParseData) {}
/// <summary> /// Performs a lexical parse to return the next <see cref="ITokenLexicalParseData"/> /// from a <see cref="ITextBufferReader"/> and seeks past it if there is a match. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="lexicalState">The <see cref="ILexicalState"/> that specifies the current context.</param> /// <param name="lexicalParseData">Returns the next <see cref="ITokenLexicalParseData"/> from a <see cref="ITextBufferReader"/>.</param> /// <returns>A <see cref="MatchType"/> indicating the type of match that was made.</returns> public MatchType GetNextTokenLexicalParseData(ITextBufferReader reader, ILexicalState lexicalState, ref ITokenLexicalParseData lexicalParseData) { // Initialize int tokenID = LuatTokenId.Invalid; if ( reader.IsAtEnd ) { lexicalParseData = new LexicalStateAndIDTokenLexicalParseData(lexicalState, (byte)LuatTokenId.DocumentEnd); return MatchType.ExactMatch; } // Get the next character char ch = reader.Read(); // If the character is a letter or digit... if ((Char.IsLetter(ch) || (ch == '_'))) { // Parse the identifier tokenID = this.ParseIdentifier(reader, ch); } else if ((ch != '\n') && (Char.IsWhiteSpace(ch))) { while ((reader.Peek() != '\n') && (Char.IsWhiteSpace(reader.Peek()))) reader.Read(); tokenID = LuatTokenId.Whitespace; } else { tokenID = LuatTokenId.Invalid; switch (ch) { case ',': tokenID = LuatTokenId.Comma; break; case '(': tokenID = LuatTokenId.OpenParenthesis; break; case ')': tokenID = LuatTokenId.CloseParenthesis; break; case ';': tokenID = LuatTokenId.SemiColon; break; case ':': tokenID = LuatTokenId.Colon; break; case '\n': case '\r': // Line terminator tokenID = LuatTokenId.LineTerminator; break; case '{': tokenID = LuatTokenId.OpenCurlyBrace; break; case '}': tokenID = LuatTokenId.CloseCurlyBrace; break; case '\"': tokenID = this.ParseString( reader, '\"' ); break; case '\'': tokenID = this.ParseString( reader, '\'' ); break; case '-': if ( reader.Peek(1) != '-' ) { tokenID = LuatTokenId.Subtraction; break; } reader.Read(); if ( reader.Peek(1) != '[' || reader.Peek(2) != '[' ) { tokenID = this.ParseSingleLineComment(reader); } else { reader.Read(); reader.Read(); tokenID = this.ParseMultiLineComment( reader ); } break; case '<': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.LessThanEqual; } else { tokenID = LuatTokenId.LessThan; } break; case '>': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.GreaterThanEqual; } else { tokenID = LuatTokenId.GreaterThan; } break; case '~': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Inequality; } break; case '=': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Equality; } else { tokenID = LuatTokenId.Assignment; } break; case '!': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Inequality; } break; case '+': tokenID = LuatTokenId.Addition; break; case '/': tokenID = LuatTokenId.Division; break; case '*': tokenID = LuatTokenId.Multiplication; break; case '^': tokenID = LuatTokenId.Hat; break; case '#': tokenID = LuatTokenId.Hash; break; case '%': tokenID = LuatTokenId.Modulus; break; case '.': tokenID = LuatTokenId.Dot; if (reader.Peek() == '.') { reader.Read(); tokenID = LuatTokenId.DoubleDot; } if (reader.Peek() == '.') { reader.Read(); tokenID = LuatTokenId.TripleDot; } break; case '[': tokenID = LuatTokenId.OpenSquareBracket; break; case ']': tokenID = LuatTokenId.CloseSquareBracket; break; default: if ((ch >= '0') && (ch <= '9')) { // Parse the number tokenID = this.ParseNumber(reader, ch); } break; } } if (tokenID != LuatTokenId.Invalid) { lexicalParseData = new LexicalStateAndIDTokenLexicalParseData(lexicalState, (byte)tokenID); return MatchType.ExactMatch; } else { reader.ReadReverse(); return MatchType.NoMatch; } }
/// <summary> /// Performs a lexical parse to return the next <see cref="ITokenLexicalParseData"/> /// from a <see cref="ITextBufferReader"/> and seeks past it if there is a match. /// </summary> /// <param name="reader">An <see cref="ITextBufferReader"/> that is reading a text source.</param> /// <param name="lexicalState">The <see cref="ILexicalState"/> that specifies the current context.</param> /// <param name="lexicalParseData">Returns the next <see cref="ITokenLexicalParseData"/> from a <see cref="ITextBufferReader"/>.</param> /// <returns>A <see cref="MatchType"/> indicating the type of match that was made.</returns> public MatchType GetNextTokenLexicalParseData(ITextBufferReader reader, ILexicalState lexicalState, ref ITokenLexicalParseData lexicalParseData) { // Initialize int tokenID = LuatTokenId.Invalid; if (reader.IsAtEnd) { lexicalParseData = new LexicalStateAndIDTokenLexicalParseData(lexicalState, (byte)LuatTokenId.DocumentEnd); return(MatchType.ExactMatch); } // Get the next character char ch = reader.Read(); // If the character is a letter or digit... if ((Char.IsLetter(ch) || (ch == '_'))) { // Parse the identifier tokenID = this.ParseIdentifier(reader, ch); } else if ((ch != '\n') && (Char.IsWhiteSpace(ch))) { while ((reader.Peek() != '\n') && (Char.IsWhiteSpace(reader.Peek()))) { reader.Read(); } tokenID = LuatTokenId.Whitespace; } else { tokenID = LuatTokenId.Invalid; switch (ch) { case ',': tokenID = LuatTokenId.Comma; break; case '(': tokenID = LuatTokenId.OpenParenthesis; break; case ')': tokenID = LuatTokenId.CloseParenthesis; break; case ';': tokenID = LuatTokenId.SemiColon; break; case ':': tokenID = LuatTokenId.Colon; break; case '\n': case '\r': // Line terminator tokenID = LuatTokenId.LineTerminator; break; case '{': tokenID = LuatTokenId.OpenCurlyBrace; break; case '}': tokenID = LuatTokenId.CloseCurlyBrace; break; case '\"': tokenID = this.ParseString(reader, '\"'); break; case '\'': tokenID = this.ParseString(reader, '\''); break; case '-': if (reader.Peek(1) != '-') { tokenID = LuatTokenId.Subtraction; break; } reader.Read(); if (reader.Peek(1) != '[' || reader.Peek(2) != '[') { tokenID = this.ParseSingleLineComment(reader); } else { reader.Read(); reader.Read(); tokenID = this.ParseMultiLineComment(reader); } break; case '<': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.LessThanEqual; } else { tokenID = LuatTokenId.LessThan; } break; case '>': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.GreaterThanEqual; } else { tokenID = LuatTokenId.GreaterThan; } break; case '~': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Inequality; } break; case '=': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Equality; } else { tokenID = LuatTokenId.Assignment; } break; case '!': if (reader.Peek() == '=') { reader.Read(); tokenID = LuatTokenId.Inequality; } break; case '+': tokenID = LuatTokenId.Addition; break; case '/': tokenID = LuatTokenId.Division; break; case '*': tokenID = LuatTokenId.Multiplication; break; case '^': tokenID = LuatTokenId.Hat; break; case '#': tokenID = LuatTokenId.Hash; break; case '%': tokenID = LuatTokenId.Modulus; break; case '.': tokenID = LuatTokenId.Dot; if (reader.Peek() == '.') { reader.Read(); tokenID = LuatTokenId.DoubleDot; } if (reader.Peek() == '.') { reader.Read(); tokenID = LuatTokenId.TripleDot; } break; case '[': tokenID = LuatTokenId.OpenSquareBracket; break; case ']': tokenID = LuatTokenId.CloseSquareBracket; break; default: if ((ch >= '0') && (ch <= '9')) { // Parse the number tokenID = this.ParseNumber(reader, ch); } break; } } if (tokenID != LuatTokenId.Invalid) { lexicalParseData = new LexicalStateAndIDTokenLexicalParseData(lexicalState, (byte)tokenID); return(MatchType.ExactMatch); } else { reader.ReadReverse(); return(MatchType.NoMatch); } }
///////////////////////////////////////////////////////////////////////////////////////////////////// // OBJECT ///////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Initializes a new instance of the <c>LuatToken</c> class. /// </summary> /// <param name="startOffset">The start offset of the token.</param> /// <param name="length">The length of the token.</param> /// <param name="lexicalParseFlags">The <see cref="LexicalParseFlags"/> for the token.</param> /// <param name="parentToken">The <see cref="IToken"/> that starts the current state scope specified by the <see cref="IToken.LexicalState"/> property.</param> /// <param name="lexicalParseData">The <see cref="ITokenLexicalParseData"/> that contains lexical parse information about the token.</param> public LuatToken(int startOffset, int length, LexicalParseFlags lexicalParseFlags, IToken parentToken, ITokenLexicalParseData lexicalParseData) : base(startOffset, length, lexicalParseFlags, parentToken, lexicalParseData) { }