package cn.liutils.ripple.impl.compiler; import java.util.Arrays; import java.util.HashSet; public final class Token { private static HashSet<String> keywords = new HashSet(Arrays.asList( "switch", "when", "default", "true", "false" )); public enum TokenType { EOS, IDENTIFIER, INTEGER, DOUBLE, SINGLE_SYMBOL, MULTI_SYMBOL, KEY_WORD, } public enum MultiCharSymbol { S_GE, S_LE, S_NE, //S_AND, //S_OR, } TokenType type; char sSymbol; MultiCharSymbol mSymbol; String str; int integerValue; double doubleValue; public boolean isSingleChar(char c) { return type == TokenType.SINGLE_SYMBOL && c == sSymbol; } public boolean isMultiChar(MultiCharSymbol m) { return type == TokenType.MULTI_SYMBOL && m == mSymbol; } public boolean isIdentifier() { return type == TokenType.IDENTIFIER; } public boolean isKeyword(String val) { return type == TokenType.KEY_WORD && str.equals(val); } public boolean isInteger() { return type == TokenType.INTEGER; } public boolean isDouble() { return type == TokenType.DOUBLE; } public boolean isEOS() { return type == TokenType.EOS; } public void setSingleChar(char c) { type = TokenType.SINGLE_SYMBOL; sSymbol = c; } public void setMultiChar(MultiCharSymbol m) { type = TokenType.MULTI_SYMBOL; mSymbol = m; } public void setInteger(int val) { type = TokenType.INTEGER; integerValue = val; } public void setDouble(double val) { type = TokenType.DOUBLE; doubleValue = val; } public void setString(String val) { if (keywords.contains(val)) { this.type = TokenType.KEY_WORD; } else { this.type = TokenType.IDENTIFIER; } this.str = val; } public void setEOS() { type = TokenType.EOS; } public BinaryOperator toBinOp() { if (this.type == TokenType.SINGLE_SYMBOL) { switch (this.sSymbol) { case '+': return BinaryOperator.ADD; case '-': return BinaryOperator.SUBSTRACT; case '*': return BinaryOperator.MULTIPLY; case '/': return BinaryOperator.DIVIDE; case '=': return BinaryOperator.EQUAL; case '>': return BinaryOperator.GREATER; case '<': return BinaryOperator.LESSER; case '&': return BinaryOperator.AND; case '|': return BinaryOperator.OR; } } else if (this.type == TokenType.MULTI_SYMBOL) { switch (this.mSymbol) { //case S_AND: return BinaryOperator.AND; case S_GE: return BinaryOperator.GREATER_EQUAL; case S_LE: return BinaryOperator.LESSER_EQUAL; case S_NE: return BinaryOperator.NOT_EQUAL; //case S_OR: return BinaryOperator.OR; } } return BinaryOperator.UNKNOWN; } public UnaryOperator toUnOp() { if (this.type == TokenType.SINGLE_SYMBOL) { switch (this.sSymbol) { case '-': return UnaryOperator.MINUS; case '!': return UnaryOperator.NOT; case '=': return UnaryOperator.U_EQUAL; case '>': return UnaryOperator.U_GREATER; case '<': return UnaryOperator.U_LESSER; } } else if (this.type == TokenType.MULTI_SYMBOL){ switch (this.mSymbol) { case S_GE: return UnaryOperator.U_GREATER_EQUAL; case S_LE: return UnaryOperator.U_LESSER_EQUAL; case S_NE: return UnaryOperator.U_NOT_EQUAL; default: } } return UnaryOperator.UNKNOWN; } @Override public String toString() { return "[" + type + " " + sSymbol + " " + str + "]"; } }