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