public ITokenizerState Exec(char currentChar, int position, string statement, ref StringBuilder token, List <Token> tokens) { if (InStringState.IsStringDelimiter(currentChar)) { tokens.Add(new Token(token.ToString(), TokenType.String)); token = new StringBuilder(); return(new DefaultState()); } token.Append(currentChar); return(this); // stay in string state }
public ITokenizerState Exec(char currentChar, int position, string statement, ref StringBuilder token, List <Token> tokens) { if (char.IsWhiteSpace(currentChar) || char.IsControl(currentChar)) { return(this); // stay in Whitespace state } if (InStringState.IsStringDelimiter(currentChar)) { return(new InStringState()); } ITokenizerState defState = new DefaultState(); defState.Exec(currentChar, position, statement, ref token, tokens); return(defState); }
public ITokenizerState Exec(char currentChar, int position, string statement, ref StringBuilder token, List <Token> tokens) { if (char.IsWhiteSpace(currentChar)) { if (token.Length > 0) { tokens.Add(new Token(token.ToString())); token = new StringBuilder(); } return(new WhiteSpaceState()); } if (InStringState.IsStringDelimiter(currentChar)) { return(new InStringState()); } if (InCommentState.IsCommentStart(currentChar, position > 0?statement[position - 1]:'\x0000')) { return(new InCommentState(statement.Substring(position - 1, 2))); } switch (currentChar) { case '(': case ')': case '[': case ']': case '=': // an equals sign that is not inside string quotes should trigger a new token case ',': // add commas to their own token if (token.Length > 0) { tokens.Add(new Token(token.ToString())); token = new StringBuilder(); } tokens.Add(new Token(currentChar.ToString(), TokenType.Comma)); break; default: //else add the current char to the string builder token.Append(currentChar); break; } return(this); // stay in default state }