/* * @(#)Token.java 1.2 98/05/04 * * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. * */ package examples.javakit; import java.io.Serializable; import sun.tools.java.Constants; /** * Simple class to represent a lexical token. This * wraps the Constants used by the scanner to provide * a convenient class that can be stored as a attribute * value. * * @author Timothy Prinzing * @version 1.2 05/04/98 */ public class Token implements Serializable { Token(String representation, int scanValue) { this.representation = representation; this.scanValue = scanValue; } /** * A human presentable form of the token, useful * for things like lists, debugging, etc. */ public String toString() { return representation; } /** * Numeric value of this token. This is the value * returned by the scanner and is the tie between * the lexical scanner and the tokens. */ public int getScanValue() { return scanValue; } /** * Specifies the category of the token as a * string that can be used as a label. */ public String getCategory() { String nm = getClass().getName(); int nmStart = nm.lastIndexOf('.') + 1; // not found results in 0 return nm.substring(nmStart, nm.length()); } /** * Returns a hashcode for this set of attributes. * @return a hashcode value for this set of attributes. */ public final int hashCode() { return scanValue; } /** * Compares this object to the specifed object. * The result is true if and only if the argument is not * null and is a Font object with the same * name, style, and point size as this font. * @param obj the object to compare this font with. * @return true if the objects are equal; * false otherwise. */ public final boolean equals(Object obj) { if (obj instanceof Token) { Token t = (Token) obj; return (scanValue == t.scanValue); } return false; } // --- variables ------------------------------------- public static final int MaximumScanValue = Constants.INLINENEWINSTANCE + 1; /** * Key to be used in AttributeSet's holding a value of Token. */ public static final Object TokenAttribute = new AttributeKey(); String representation; int scanValue; public static class Operator extends Token { Operator(String representation, int scanValue) { super(representation, scanValue); } } public static class Value extends Token { Value(String representation, int scanValue) { super(representation, scanValue); } } public static class Type extends Token { Type(String representation, int scanValue) { super(representation, scanValue); } } public static class Expression extends Token { Expression(String representation, int scanValue) { super(representation, scanValue); } } public static class Statement extends Token { Statement(String representation, int scanValue) { super(representation, scanValue); } } public static class Declaration extends Token { Declaration(String representation, int scanValue) { super(representation, scanValue); } } public static class Modifier extends Token { Modifier(String representation, int scanValue) { super(representation, scanValue); } } public static class Punctuation extends Token { Punctuation(String representation, int scanValue) { super(representation, scanValue); } } public static class Special extends Token { Special(String representation, int scanValue) { super(representation, scanValue); } } static class AttributeKey { private AttributeKey() { } public String toString() { return "token"; } } /* * Operators */ public static final Token COMMA = new Operator(Constants.opNames[Constants.COMMA], Constants.COMMA); public static final Token ASSIGN = new Operator(Constants.opNames[Constants.ASSIGN], Constants.ASSIGN); public static final Token ASGMUL = new Operator(Constants.opNames[Constants.ASGMUL], Constants.ASGMUL); public static final Token ASGDIV = new Operator(Constants.opNames[Constants.ASGDIV], Constants.ASGDIV); public static final Token ASGREM = new Operator(Constants.opNames[Constants.ASGREM], Constants.ASGREM); public static final Token ASGADD = new Operator(Constants.opNames[Constants.ASGADD], Constants.ASGADD); public static final Token ASGSUB = new Operator(Constants.opNames[Constants.ASGSUB], Constants.ASGSUB); public static final Token ASGLSHIFT = new Operator(Constants.opNames[Constants.ASGLSHIFT], Constants.ASGLSHIFT); public static final Token ASGRSHIFT = new Operator(Constants.opNames[Constants.ASGRSHIFT], Constants.ASGRSHIFT); public static final Token ASGURSHIFT = new Operator(Constants.opNames[Constants.ASGURSHIFT], Constants.ASGURSHIFT); public static final Token ASGBITAND = new Operator(Constants.opNames[Constants.ASGBITAND], Constants.ASGBITAND); public static final Token ASGBITOR = new Operator(Constants.opNames[Constants.ASGBITOR], Constants.ASGBITOR); public static final Token ASGBITXOR = new Operator(Constants.opNames[Constants.ASGBITOR], Constants.ASGBITOR); public static final Token COND = new Operator(Constants.opNames[Constants.COND], Constants.COND); public static final Token OR = new Operator(Constants.opNames[Constants.OR], Constants.OR); public static final Token AND = new Operator(Constants.opNames[Constants.AND], Constants.AND); public static final Token BITOR = new Operator(Constants.opNames[Constants.BITOR], Constants.BITOR); public static final Token BITXOR = new Operator(Constants.opNames[Constants.BITXOR], Constants.BITXOR); public static final Token BITAND = new Operator(Constants.opNames[Constants.BITAND], Constants.BITAND); public static final Token NE = new Operator(Constants.opNames[Constants.NE], Constants.NE); public static final Token EQ = new Operator(Constants.opNames[Constants.EQ], Constants.EQ); public static final Token GE = new Operator(Constants.opNames[Constants.GE], Constants.GE); public static final Token GT = new Operator(Constants.opNames[Constants.GT], Constants.GT); public static final Token LE = new Operator(Constants.opNames[Constants.LE], Constants.LE); public static final Token LT = new Operator(Constants.opNames[Constants.LT], Constants.LT); public static final Token INSTANCEOF = new Operator(Constants.opNames[Constants.INSTANCEOF], Constants.INSTANCEOF); public static final Token LSHIFT = new Operator(Constants.opNames[Constants.LSHIFT], Constants.LSHIFT); public static final Token RSHIFT = new Operator(Constants.opNames[Constants.RSHIFT], Constants.RSHIFT); public static final Token URSHIFT = new Operator(Constants.opNames[Constants.URSHIFT], Constants.URSHIFT); public static final Token ADD = new Operator(Constants.opNames[Constants.ADD], Constants.ADD); public static final Token SUB = new Operator(Constants.opNames[Constants.SUB], Constants.SUB); public static final Token DIV = new Operator(Constants.opNames[Constants.DIV], Constants.DIV); public static final Token REM = new Operator(Constants.opNames[Constants.REM], Constants.REM); public static final Token MUL = new Operator(Constants.opNames[Constants.MUL], Constants.MUL); public static final Token CAST = new Operator(Constants.opNames[Constants.CAST], Constants.CAST); public static final Token POS = new Operator(Constants.opNames[Constants.POS], Constants.POS); public static final Token NEG = new Operator(Constants.opNames[Constants.NEG], Constants.NEG); public static final Token NOT = new Operator(Constants.opNames[Constants.NOT], Constants.NOT); public static final Token BITNOT = new Operator(Constants.opNames[Constants.BITNOT], Constants.BITNOT); public static final Token PREINC = new Operator(Constants.opNames[Constants.PREINC], Constants.PREINC); public static final Token PREDEC = new Operator(Constants.opNames[Constants.PREDEC], Constants.PREDEC); public static final Token NEWARRAY = new Operator(Constants.opNames[Constants.NEWARRAY], Constants.NEWARRAY); public static final Token NEWINSTANCE = new Operator(Constants.opNames[Constants.NEWINSTANCE], Constants.NEWINSTANCE); public static final Token NEWFROMNAME = new Operator(Constants.opNames[Constants.NEWFROMNAME], Constants.NEWFROMNAME); public static final Token POSTINC = new Operator(Constants.opNames[Constants.POSTINC], Constants.POSTINC); public static final Token POSTDEC = new Operator(Constants.opNames[Constants.POSTDEC], Constants.POSTDEC); public static final Token FIELD = new Operator(Constants.opNames[Constants.FIELD], Constants.FIELD); public static final Token METHOD = new Operator(Constants.opNames[Constants.METHOD], Constants.METHOD); public static final Token ARRAYACCESS = new Operator(Constants.opNames[Constants.ARRAYACCESS], Constants.ARRAYACCESS); public static final Token NEW = new Operator(Constants.opNames[Constants.NEW], Constants.NEW); public static final Token INC = new Operator(Constants.opNames[Constants.INC], Constants.INC); public static final Token DEC = new Operator(Constants.opNames[Constants.DEC], Constants.DEC); public static final Token CONVERT = new Operator(Constants.opNames[Constants.CONVERT], Constants.CONVERT); public static final Token EXPR = new Operator(Constants.opNames[Constants.EXPR], Constants.EXPR); public static final Token ARRAY = new Operator(Constants.opNames[Constants.ARRAY], Constants.ARRAY); public static final Token GOTO = new Operator(Constants.opNames[Constants.GOTO], Constants.GOTO); /* * Value tokens */ public static final Token IDENT = new Value(Constants.opNames[Constants.IDENT], Constants.IDENT); public static final Token BOOLEANVAL = new Value(Constants.opNames[Constants.BOOLEANVAL], Constants.BOOLEANVAL); public static final Token BYTEVAL = new Value(Constants.opNames[Constants.BYTEVAL], Constants.BYTEVAL); public static final Token CHARVAL = new Value(Constants.opNames[Constants.CHARVAL], Constants.CHARVAL); public static final Token SHORTVAL = new Value(Constants.opNames[Constants.SHORTVAL], Constants.SHORTVAL); public static final Token INTVAL = new Value(Constants.opNames[Constants.INTVAL], Constants.INTVAL); public static final Token LONGVAL = new Value(Constants.opNames[Constants.LONGVAL], Constants.LONGVAL); public static final Token FLOATVAL = new Value(Constants.opNames[Constants.FLOATVAL], Constants.FLOATVAL); public static final Token DOUBLEVAL = new Value(Constants.opNames[Constants.DOUBLEVAL], Constants.DOUBLEVAL); public static final Token STRINGVAL = new Value(Constants.opNames[Constants.STRINGVAL], Constants.STRINGVAL); /* * Type keywords */ public static final Token BYTE = new Type(Constants.opNames[Constants.BYTE], Constants.BYTE); public static final Token CHAR = new Type(Constants.opNames[Constants.CHAR], Constants.CHAR); public static final Token SHORT = new Type(Constants.opNames[Constants.SHORT], Constants.SHORT); public static final Token INT = new Type(Constants.opNames[Constants.INT], Constants.INT); public static final Token LONG = new Type(Constants.opNames[Constants.LONG], Constants.LONG); public static final Token FLOAT = new Type(Constants.opNames[Constants.FLOAT], Constants.FLOAT); public static final Token DOUBLE = new Type(Constants.opNames[Constants.DOUBLE], Constants.DOUBLE); public static final Token VOID = new Type(Constants.opNames[Constants.VOID], Constants.VOID); public static final Token BOOLEAN = new Type(Constants.opNames[Constants.BOOLEAN], Constants.BOOLEAN); /* * Expression keywords */ public static final Token TRUE = new Expression(Constants.opNames[Constants.TRUE], Constants.TRUE); public static final Token FALSE = new Expression(Constants.opNames[Constants.FALSE], Constants.FALSE); public static final Token THIS = new Expression(Constants.opNames[Constants.THIS], Constants.THIS); public static final Token SUPER = new Expression(Constants.opNames[Constants.SUPER], Constants.SUPER); public static final Token NULL = new Expression(Constants.opNames[Constants.NULL], Constants.NULL); /* * Statement keywords */ public static final Token IF = new Statement(Constants.opNames[Constants.IF], Constants.IF); public static final Token ELSE = new Statement(Constants.opNames[Constants.ELSE], Constants.ELSE); public static final Token FOR = new Statement(Constants.opNames[Constants.FOR], Constants.FOR); public static final Token WHILE = new Statement(Constants.opNames[Constants.WHILE], Constants.WHILE); public static final Token DO = new Statement(Constants.opNames[Constants.DO], Constants.DO); public static final Token SWITCH = new Statement(Constants.opNames[Constants.SWITCH], Constants.SWITCH); public static final Token CASE = new Statement(Constants.opNames[Constants.CASE], Constants.CASE); public static final Token DEFAULT = new Statement(Constants.opNames[Constants.DEFAULT], Constants.DEFAULT); public static final Token BREAK = new Statement(Constants.opNames[Constants.BREAK], Constants.BREAK); public static final Token CONTINUE = new Statement(Constants.opNames[Constants.CONTINUE], Constants.CONTINUE); public static final Token RETURN = new Statement(Constants.opNames[Constants.RETURN], Constants.RETURN); public static final Token TRY = new Statement(Constants.opNames[Constants.TRY], Constants.TRY); public static final Token CATCH = new Statement(Constants.opNames[Constants.CATCH], Constants.CATCH); public static final Token FINALLY = new Statement(Constants.opNames[Constants.FINALLY], Constants.FINALLY); public static final Token THROW = new Statement(Constants.opNames[Constants.THROW], Constants.THROW); public static final Token STAT = new Statement(Constants.opNames[Constants.STAT], Constants.STAT); public static final Token EXPRESSION = new Statement(Constants.opNames[Constants.EXPRESSION], Constants.EXPRESSION); public static final Token DECLARATION = new Statement(Constants.opNames[Constants.DECLARATION], Constants.DECLARATION); public static final Token VARDECLARATION = new Statement(Constants.opNames[Constants.VARDECLARATION], Constants.VARDECLARATION); /* * Declaration keywords */ public static final Token IMPORT = new Declaration(Constants.opNames[Constants.IMPORT], Constants.IMPORT); public static final Token CLASS = new Declaration(Constants.opNames[Constants.CLASS], Constants.CLASS); public static final Token EXTENDS = new Declaration(Constants.opNames[Constants.EXTENDS], Constants.EXTENDS); public static final Token IMPLEMENTS = new Declaration(Constants.opNames[Constants.IMPLEMENTS], Constants.IMPLEMENTS); public static final Token INTERFACE = new Declaration(Constants.opNames[Constants.INTERFACE], Constants.INTERFACE); public static final Token PACKAGE = new Declaration(Constants.opNames[Constants.PACKAGE], Constants.PACKAGE); /* * Modifier keywords */ public static final Token PRIVATE = new Modifier(Constants.opNames[Constants.PRIVATE], Constants.PRIVATE); public static final Token PUBLIC = new Modifier(Constants.opNames[Constants.PUBLIC], Constants.PUBLIC); public static final Token PROTECTED = new Modifier(Constants.opNames[Constants.PROTECTED], Constants.PROTECTED); public static final Token CONST = new Modifier(Constants.opNames[Constants.CONST], Constants.CONST); public static final Token STATIC = new Modifier(Constants.opNames[Constants.STATIC], Constants.STATIC); public static final Token TRANSIENT = new Modifier(Constants.opNames[Constants.TRANSIENT], Constants.TRANSIENT); public static final Token SYNCHRONIZED = new Modifier(Constants.opNames[Constants.SYNCHRONIZED], Constants.SYNCHRONIZED); public static final Token NATIVE = new Modifier(Constants.opNames[Constants.NATIVE], Constants.NATIVE); public static final Token FINAL = new Modifier(Constants.opNames[Constants.FINAL], Constants.FINAL); public static final Token VOLATILE = new Modifier(Constants.opNames[Constants.VOLATILE], Constants.VOLATILE); public static final Token ABSTRACT = new Modifier(Constants.opNames[Constants.ABSTRACT], Constants.ABSTRACT); /* * Punctuation */ public static final Token SEMICOLON = new Punctuation(Constants.opNames[Constants.SEMICOLON], Constants.SEMICOLON); public static final Token COLON = new Punctuation(Constants.opNames[Constants.COLON], Constants.COLON); public static final Token QUESTIONMARK = new Punctuation(Constants.opNames[Constants.QUESTIONMARK], Constants.QUESTIONMARK); public static final Token LBRACE = new Punctuation(Constants.opNames[Constants.LBRACE], Constants.LBRACE); public static final Token RBRACE = new Punctuation(Constants.opNames[Constants.RBRACE], Constants.RBRACE); public static final Token LPAREN = new Punctuation(Constants.opNames[Constants.LPAREN], Constants.LPAREN); public static final Token RPAREN = new Punctuation(Constants.opNames[Constants.RPAREN], Constants.RPAREN); public static final Token LSQBRACKET = new Punctuation(Constants.opNames[Constants.LSQBRACKET], Constants.LSQBRACKET); public static final Token RSQBRACKET = new Punctuation(Constants.opNames[Constants.RSQBRACKET], Constants.RSQBRACKET); public static final Token THROWS = new Punctuation(Constants.opNames[Constants.THROWS], Constants.THROWS); /* * Special tokens */ public static final Token ERROR = new Special(Constants.opNames[Constants.ERROR], Constants.ERROR); public static final Token COMMENT = new Special(Constants.opNames[Constants.COMMENT], Constants.COMMENT); public static final Token TYPE = new Special(Constants.opNames[Constants.TYPE], Constants.TYPE); public static final Token LENGTH = new Special(Constants.opNames[Constants.LENGTH], Constants.LENGTH); public static final Token INLINERETURN = new Special(Constants.opNames[Constants.INLINERETURN], Constants.INLINERETURN); public static final Token INLINEMETHOD = new Special(Constants.opNames[Constants.INLINEMETHOD], Constants.INLINEMETHOD); public static final Token INLINENEWINSTANCE = new Special(Constants.opNames[Constants.INLINENEWINSTANCE], Constants.INLINENEWINSTANCE); public static final Token UNSCANNED = new Special("unscanned", MaximumScanValue); static Token[] operators = { COMMA, ASSIGN, ASGMUL, ASGDIV, ASGREM, ASGADD, ASGSUB, ASGLSHIFT, ASGRSHIFT, ASGURSHIFT, ASGBITAND, ASGBITOR, ASGBITXOR, COND, OR, AND, BITOR, BITXOR, BITAND, NE, EQ, GE, GT, LE, LT, INSTANCEOF, LSHIFT, RSHIFT, URSHIFT, ADD, SUB, DIV, REM, MUL, CAST, POS, NEG, NOT, BITNOT, PREINC, PREDEC, NEWARRAY, NEWINSTANCE, NEWFROMNAME, POSTINC, POSTDEC, FIELD, METHOD, ARRAYACCESS, NEW, INC, DEC, CONVERT, EXPR, ARRAY, GOTO }; static Token[] values = { IDENT, BOOLEANVAL, BYTEVAL, CHARVAL, SHORTVAL, INTVAL, LONGVAL, FLOATVAL, DOUBLEVAL, STRINGVAL }; static Token[] types = { BYTE, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, VOID, BOOLEAN }; static Token[] expressions = { TRUE, FALSE, THIS, SUPER, NULL }; static Token[] statements = { IF, ELSE, FOR, WHILE, DO, SWITCH, CASE, DEFAULT, BREAK, CONTINUE, RETURN, TRY, CATCH, FINALLY, THROW, STAT, EXPRESSION, DECLARATION, VARDECLARATION }; static Token[] declarations = { IMPORT, CLASS, EXTENDS, IMPLEMENTS, INTERFACE, PACKAGE }; static Token[] modifiers = { PRIVATE, PUBLIC, PROTECTED, CONST, STATIC, TRANSIENT, SYNCHRONIZED, NATIVE, FINAL, VOLATILE, ABSTRACT }; static Token[] punctuations = { SEMICOLON, COLON, QUESTIONMARK, LBRACE, RBRACE, LPAREN, RPAREN, LSQBRACKET, RSQBRACKET, THROWS }; static Token[] specials = { ERROR, COMMENT, TYPE, LENGTH, INLINERETURN, INLINEMETHOD, INLINENEWINSTANCE, UNSCANNED }; static Token[] all = { COMMA, ASSIGN, ASGMUL, ASGDIV, ASGREM, ASGADD, ASGSUB, ASGLSHIFT, ASGRSHIFT, ASGURSHIFT, ASGBITAND, ASGBITOR, ASGBITXOR, COND, OR, AND, BITOR, BITXOR, BITAND, NE, EQ, GE, GT, LE, LT, INSTANCEOF, LSHIFT, RSHIFT, URSHIFT, ADD, SUB, DIV, REM, MUL, CAST, POS, NEG, NOT, BITNOT, PREINC, PREDEC, NEWARRAY, NEWINSTANCE, NEWFROMNAME, POSTINC, POSTDEC, FIELD, METHOD, ARRAYACCESS, NEW, INC, DEC, CONVERT, EXPR, ARRAY, GOTO, IDENT, BOOLEANVAL, BYTEVAL, CHARVAL, SHORTVAL, INTVAL, LONGVAL, FLOATVAL, DOUBLEVAL, STRINGVAL, BYTE, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, VOID, BOOLEAN, TRUE, FALSE, THIS, SUPER, NULL, IF, ELSE, FOR, WHILE, DO, SWITCH, CASE, DEFAULT, BREAK, CONTINUE, RETURN, TRY, CATCH, FINALLY, THROW, STAT, EXPRESSION, DECLARATION, VARDECLARATION, IMPORT, CLASS, EXTENDS, IMPLEMENTS, INTERFACE, PACKAGE, PRIVATE, PUBLIC, PROTECTED, CONST, STATIC, TRANSIENT, SYNCHRONIZED, NATIVE, FINAL, VOLATILE, ABSTRACT, SEMICOLON, COLON, QUESTIONMARK, LBRACE, RBRACE, LPAREN, RPAREN, LSQBRACKET, RSQBRACKET, THROWS, ERROR, COMMENT, TYPE, LENGTH, INLINERETURN, INLINEMETHOD, INLINENEWINSTANCE, UNSCANNED }; }