package de.fuberlin.projecta.lexer; import java.util.HashMap; import de.fuberlin.commons.lexer.IToken; import de.fuberlin.commons.lexer.TokenType; public class Token implements IToken { /** * Get the real type of this token (used internally only) */ private TokenType internalType; private Object attribute; private int lineNumber; private int offset; private HashMap<TokenType, String> mapping = new HashMap<TokenType, String>(); public Token(TokenType internalType, Object attribute, int lineNumber, int offset) { this.internalType = internalType; this.attribute = attribute; this.lineNumber = lineNumber; this.offset = offset; initMapping(); } @Override public String getText() { return mapping.get(internalType); } @Override public String getType() { return internalType.toString(); } @Override public String toString() { return "<" + internalType + ", " + attribute + ", " + lineNumber + ", " + offset + ">"; } private void initMapping() { mapping.put(TokenType.OP_LE, "<"); mapping.put(TokenType.OP_LE, "<="); mapping.put(TokenType.OP_EQ, "=="); mapping.put(TokenType.OP_NE, "!="); mapping.put(TokenType.OP_GT, ">"); mapping.put(TokenType.OP_GE, ">="); mapping.put(TokenType.OP_OR, "||"); mapping.put(TokenType.OP_AND, "&&"); mapping.put(TokenType.OP_NOT, "!"); mapping.put(TokenType.OP_ADD, "+"); mapping.put(TokenType.OP_MINUS, "-"); mapping.put(TokenType.OP_MUL, "*"); mapping.put(TokenType.OP_DIV, "/"); mapping.put(TokenType.OP_ASSIGN, "="); mapping.put(TokenType.OP_COMMA, ","); mapping.put(TokenType.OP_DOT, "."); mapping.put(TokenType.OP_SEMIC, ";"); mapping.put(TokenType.IF, "if"); mapping.put(TokenType.THEN, "then"); mapping.put(TokenType.ELSE, "else"); mapping.put(TokenType.WHILE, "while"); mapping.put(TokenType.DO, "do"); mapping.put(TokenType.BREAK, "break"); mapping.put(TokenType.RETURN, "return"); mapping.put(TokenType.PRINT, "print"); mapping.put(TokenType.DEF, "def"); mapping.put(TokenType.BASIC, "basic"); mapping.put(TokenType.RECORD, "record"); mapping.put(TokenType.ID, "id"); mapping.put(TokenType.STRING_LITERAL, "string"); mapping.put(TokenType.INT_LITERAL, "num"); mapping.put(TokenType.REAL_LITERAL, "real"); mapping.put(TokenType.BOOL_LITERAL, "boolean"); mapping.put(TokenType.LPAREN, "("); mapping.put(TokenType.RPAREN, ")"); mapping.put(TokenType.LBRACKET, "["); mapping.put(TokenType.RBRACKET, "]"); mapping.put(TokenType.LBRACE, "{"); mapping.put(TokenType.RBRACE, "}"); mapping.put(TokenType.EOF, "EOF"); } public TokenType getInternalType() { return internalType; } public Object getAttribute() { return attribute; } public int getLineNumber() { return lineNumber; } public int getOffset() { return offset; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Token token = (Token) o; if (lineNumber != token.lineNumber) return false; if (offset != token.offset) return false; if (attribute != null ? !attribute.equals(token.attribute) : token.attribute != null) return false; return internalType == token.internalType; } @Override public int hashCode() { int result = internalType != null ? internalType.hashCode() : 0; result = 31 * result + (attribute != null ? attribute.hashCode() : 0); result = 31 * result + lineNumber; result = 31 * result + offset; return result; } }