/* * Copyright 2007 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.jjs.ast; /** * For precedence indices, see the Java Programming Language, 4th Edition, p. * 750, Table 2. I just numbered the table top to bottom as 0 through 14. Lower * number means higher precedence. */ public enum JBinaryOperator { // Don't renumber precs without checking implementation of isShiftOperator() MUL("*", 3), DIV("/", 3), MOD("%", 3), ADD("+", 4), CONCAT("+", 4), SUB("-", 4), SHL("<<", 5), SHR( ">>", 5), SHRU(">>>", 5), LT("<", 6), LTE("<=", 6), GT(">", 6), GTE(">=", 6), EQ("==", 7), NEQ("!=", 7), BIT_AND("&", 8), BIT_XOR("^", 9), BIT_OR( "|", 10), AND("&&", 11), OR("||", 12), ASG("=", 14), ASG_ADD("+=", 14, ADD), ASG_CONCAT("+=", 14, CONCAT), ASG_SUB("-=", 14, SUB), ASG_MUL("*=", 14, MUL), ASG_DIV("/=", 14, DIV), ASG_MOD("%=", 14, MOD), ASG_SHL("<<=", 14, SHL), ASG_SHR(">>=", 14, SHR), ASG_SHRU(">>>=", 14, SHRU), ASG_BIT_AND("&=", 14, BIT_AND), ASG_BIT_OR( "|=", 14, BIT_OR), ASG_BIT_XOR("^=", 14, BIT_XOR); private final JBinaryOperator nonAsg; private final int precedence; private final char[] symbol; private JBinaryOperator(String symbol, int precedence) { this(symbol, precedence, null); } private JBinaryOperator(String symbol, int precedence, JBinaryOperator nonAsg) { this.symbol = symbol.toCharArray(); this.precedence = precedence; this.nonAsg = nonAsg; } public JBinaryOperator getNonAssignmentOf() { return nonAsg; } public int getPrecedence() { return precedence; } public char[] getSymbol() { return symbol; } public boolean isAssignment() { return (this == ASG) || (getNonAssignmentOf() != null); } public boolean isShiftOperator() { // Fragile implementation. return precedence == 5 || (nonAsg != null && nonAsg.precedence == 5); } @Override public String toString() { return new String(getSymbol()); } }