예제 #1
0
 /// <summary>
 /// Checks if LexerToken is a reserved word
 /// </summary>
 /// <param name="token">Token to Check</param>
 /// <returns>true = reserved word</returns>
 private static bool IsReservedWord(LexerToken token)
 {
     foreach (string word in reservedWords)
     {
         if (word == token.Token)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #2
0
        public static List <TokenBase> Lex(this Compiler compiler)
        {
            List <LexerToken> stringToken = SplitSourceCode(compiler);
            List <TokenBase>  token       = new List <TokenBase>();

            for (int i = 0; i < stringToken.Count; i++)
            {
                LexerToken sToken = stringToken[i];

                if (IsReservedWord(sToken))
                {
                    token.Add(new ReservedWordToken(sToken.Token, sToken.LineNumber));
                }
                else if (IsOperator(sToken.Token[0]))
                {
                    token.Add(new OperatorToken(sToken.Token, sToken.LineNumber));
                }
                else if (IsCharDigit(sToken.Token[0]))
                {
                    if (stringToken.Count > i + 2)
                    {
                        // if digit + "." + digit, we have a double number
                        if (stringToken[i + 1].Token == "." && IsCharDigit(stringToken[i + 2].Token[0]))
                        {
                            sToken.Token += stringToken[i + 1].Token + stringToken[i + 2].Token;
                            i            += 2;
                        }
                    }
                    ValidateNumber(sToken);
                    token.Add(new NumberToken(sToken.Token, sToken.LineNumber));
                }
                else if (sToken.Token[0] == '"')
                {
                    token.Add(new StringToken(sToken.Token.Substring(1, sToken.Token.Length - 2), sToken.LineNumber));
                }
                else if (IsSpecialToken(sToken.Token[0]))
                {
                    token.Add(new SpecialToken(sToken.Token, sToken.LineNumber));
                }
                else
                {
                    ValidateIdentifier(sToken);
                    token.Add(new IdentifierToken(sToken.Token, sToken.LineNumber));
                }
            }

            return(token);
        }
예제 #3
0
        /// <summary>
        /// Checks if token is a valid Number else an Exception is raised
        /// </summary>
        /// <param name="token">Token to Check</param>
        private static void ValidateIdentifier(LexerToken token)
        {
            string lowerToken = token.Token.ToLower();

            for (int i = 0; i < lowerToken.Length; i++)
            {
                if (lowerToken[i] != '_' && lowerToken[i] != 'a' && lowerToken[i] != 'b' && lowerToken[i] != 'c' &&
                    lowerToken[i] != 'd' && lowerToken[i] != 'e' && lowerToken[i] != 'f' && lowerToken[i] != 'g' &&
                    lowerToken[i] != 'h' && lowerToken[i] != 'i' && lowerToken[i] != 'j' && lowerToken[i] != 'k' &&
                    lowerToken[i] != 'l' && lowerToken[i] != 'm' && lowerToken[i] != 'n' && lowerToken[i] != 'o' &&
                    lowerToken[i] != 'p' && lowerToken[i] != 'q' && lowerToken[i] != 'r' && lowerToken[i] != 's' &&
                    lowerToken[i] != 't' && lowerToken[i] != 'u' && lowerToken[i] != 'v' && lowerToken[i] != 'w' &&
                    lowerToken[i] != 'x' && lowerToken[i] != 'y' && lowerToken[i] != 'z' && !IsCharDigit(lowerToken[i]))
                {
                    throw new LexerException(string.Format("Identifier {0} has an invalid Name.", token.Token), token.LineNumber);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Checks if token is a valid Number else an Exception is raised
        /// </summary>
        /// <param name="token">Token to Check</param>
        private static void ValidateNumber(LexerToken token)
        {
            bool dot = false;

            for (int i = 0; i < token.Token.Length; i++)
            {
                if (token.Token[i] == '.')
                {
                    if (dot)
                    {
                        throw new LexerException(string.Format("Invalid Number {0}.", token.Token), token.LineNumber);
                    }
                    else
                    {
                        dot = true;
                    }
                }
                else if (!IsCharDigit(token.Token[i]))
                {
                    throw new LexerException(string.Format("Invalid Number {0}.", token.Token), token.LineNumber);
                }
            }
        }