示例#1
0
 /// <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);
 }
示例#2
0
 /// <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));
 }
示例#3
0
		/////////////////////////////////////////////////////////////////////////////////////////////////////
		// 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) {}
示例#4
0
		/// <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;
			}
		}
示例#5
0
        /// <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);
            }
        }
示例#6
0
        /////////////////////////////////////////////////////////////////////////////////////////////////////
        // 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)
        {
        }