001    /* Copyright 2000, 2001, Compaq Computer Corporation */
002    
003    package javafe.ast;
004    
005    import javafe.util.Assert;
006    
007    /**
008     * <code>OperatorTags</code> is a class defining a partially-opaque
009     * type for tags used in the AST.  See <code>TagConstants</code> for
010     * more information.
011     */
012    
013    public class OperatorTags extends GeneratedTags
014    {
015        // Binary operator tags
016        public static final int FIRST_TAG = javafe.ast.GeneratedTags.LAST_TAG + 1;
017        public static final int OR = FIRST_TAG;
018        public static final int AND = OR + 1;
019        public static final int BITOR = AND + 1;
020        public static final int BITXOR = BITOR + 1;
021        public static final int BITAND = BITXOR + 1;
022        public static final int NE = BITAND + 1;
023        public static final int EQ = NE + 1;
024        public static final int GE = EQ + 1;
025        public static final int GT = GE + 1;
026        public static final int LE = GT + 1;
027        public static final int LT = LE + 1;
028        public static final int LSHIFT = LT + 1;
029        public static final int RSHIFT = LSHIFT + 1;
030        public static final int URSHIFT = RSHIFT + 1;
031        public static final int ADD = URSHIFT + 1;
032        public static final int SUB = ADD + 1;
033        public static final int DIV = SUB + 1;
034        public static final int MOD = DIV + 1;
035        public static final int STAR = MOD + 1;
036    
037        // Assignment-operator tags
038        public static final int ASSIGN = STAR + 1;
039        public static final int ASGMUL = ASSIGN + 1;
040        public static final int ASGDIV = ASGMUL + 1;
041        public static final int ASGREM = ASGDIV + 1;
042        public static final int ASGADD = ASGREM + 1;
043        public static final int ASGSUB = ASGADD + 1;
044        public static final int ASGLSHIFT = ASGSUB + 1;
045        public static final int ASGRSHIFT = ASGLSHIFT + 1;
046        public static final int ASGURSHIFT = ASGRSHIFT + 1;
047        public static final int ASGBITAND = ASGURSHIFT + 1;
048        public static final int ASGBITOR = ASGBITAND + 1;
049        public static final int ASGBITXOR = ASGBITOR + 1;
050    
051        // Unary operator tags
052        public static final int UNARYADD = ASGBITXOR + 1;
053        public static final int UNARYSUB = UNARYADD + 1;
054        public static final int NOT = UNARYSUB + 1;
055        public static final int BITNOT = NOT + 1;
056        public static final int INC = BITNOT + 1;
057        public static final int DEC = INC + 1;
058    
059        // Postfix unary operators
060        public static final int POSTFIXINC = DEC + 1;
061        public static final int POSTFIXDEC = POSTFIXINC + 1;
062    
063        public static final int LAST_TAG = POSTFIXDEC;
064    
065        /**
066         * @return the text representation of <code>code</code>.  For
067         * example, return the string "=" for the tag {@link #ASSIGN}.
068         */
069        //@ ensures \result != null;
070        public static String toString(int opTag) {
071            if (FIRST_TAG <= opTag && opTag <= LAST_TAG)
072                return opStrings[opTag - FIRST_TAG];
073    
074            if (opTag < FIRST_TAG)
075                return GeneratedTags.toString(opTag);
076    
077            return "Unknown tag <" + opTag + ">";
078        }
079    
080    //    private static final /*@ non_null @*/ int[] opTags = {
081    //        OR, AND, BITOR, BITXOR, BITAND, NE, EQ, GE, GT, LE, LT,
082    //        LSHIFT, RSHIFT, URSHIFT, ADD, SUB, DIV, MOD, STAR,
083    //        ASSIGN, ASGMUL, ASGDIV, ASGREM, ASGADD, ASGSUB,
084    //        ASGLSHIFT, ASGRSHIFT, ASGURSHIFT, ASGBITAND, ASGBITOR, ASGBITXOR,
085    //        UNARYADD, UNARYSUB, NOT, BITNOT, INC, DEC, POSTFIXINC, POSTFIXDEC
086    //    };
087    
088        //@ private invariant \nonnullelements(opStrings);
089    //    //@ private invariant opTags.length == opStrings.length;
090        private static final /*@ non_null @*/ String[] opStrings = {
091            "||", "&&", "|", "^", "&", "!=", "==", ">=", ">", "<=", "<",
092            "<<", ">>", ">>>", "+", "-", "/", "%", "*",
093            "=", "*=", "/=", "%=", "+=", "-=",
094            "<<=", ">>=", ">>>=", "&=", "|=", "^=",
095            "+", "-", "!", "~", "++", "--", "++", "--"
096        };
097    
098    }