/* * #%~ * VDM Code Generator * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.codegen.ir; import java.util.HashMap; import org.overture.codegen.ir.expressions.AAddrEqualsBinaryExpIR; import org.overture.codegen.ir.expressions.AAddrNotEqualsBinaryExpIR; import org.overture.codegen.ir.expressions.AAndBoolBinaryExpIR; import org.overture.codegen.ir.expressions.ACastUnaryExpIR; import org.overture.codegen.ir.expressions.ADivideNumericBinaryExpIR; import org.overture.codegen.ir.expressions.AEqualsBinaryExpIR; import org.overture.codegen.ir.expressions.AGreaterEqualNumericBinaryExpIR; import org.overture.codegen.ir.expressions.AGreaterNumericBinaryExpIR; import org.overture.codegen.ir.expressions.AIntDivNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ALessEqualNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ALessNumericBinaryExpIR; import org.overture.codegen.ir.expressions.AMinusUnaryExpIR; import org.overture.codegen.ir.expressions.AModNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ANotEqualsBinaryExpIR; import org.overture.codegen.ir.expressions.ANotUnaryExpIR; import org.overture.codegen.ir.expressions.AOrBoolBinaryExpIR; import org.overture.codegen.ir.expressions.APlusNumericBinaryExpIR; import org.overture.codegen.ir.expressions.APlusUnaryExpIR; import org.overture.codegen.ir.expressions.APowerNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ARemNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ASubtractNumericBinaryExpIR; import org.overture.codegen.ir.expressions.ATernaryIfExpIR; import org.overture.codegen.ir.expressions.ATimesNumericBinaryExpIR; import org.overture.codegen.ir.expressions.AXorBoolBinaryExpIR; public class IROperatorLookup { // TODO: Operators must be added as they come. Are there more to be added? // In the VDM Languge Reference Manual the "ternary if" fits the "Constructor" // class of operators. (see p. 203) private static final int TERNARY_IF = -1; // Arithmetic private static final int PLUS = 1; private static final int SUB = 1; private static final int TIMES = 2; private static final int DIVIDE = 2; private static final int REM = 2; private static final int MOD = 2; private static final int DIV = 2; // Relation private static final int EQUALS = 1; private static final int NOT_EQUALS = 1; private static final int GREATER_EQUAL = 1; private static final int GREATER = 1; private static final int LESS_EQUAL = 1; private static final int LESS = 1; // TODO: This is not the way to do it! Fix operator precedence! private static final int POWER = 7; private static final int CAST = 9; private static final int OR = 10; private static final int AND = 11; private static final int XOR = 12; private static final int NOT = 13; // Unary private static final int UNARY_PLUS = 13; private static final int UNARY_MINUS = 13; private HashMap<Class<? extends SExpIR>, IROperatorInfo> lookup; public IROperatorInfo find(Class<? extends SExpIR> key) { return lookup.get(key); } public IROperatorLookup() { this.lookup = new HashMap<Class<? extends SExpIR>, IROperatorInfo>(); lookup.put(APlusNumericBinaryExpIR.class, new IROperatorInfo(PLUS, "+")); lookup.put(ASubtractNumericBinaryExpIR.class, new IROperatorInfo(SUB, "-")); lookup.put(ATimesNumericBinaryExpIR.class, new IROperatorInfo(TIMES, "*")); lookup.put(AIntDivNumericBinaryExpIR.class, new IROperatorInfo(DIV, "/")); lookup.put(ARemNumericBinaryExpIR.class, new IROperatorInfo(REM, "%")); lookup.put(AModNumericBinaryExpIR.class, new IROperatorInfo(MOD, "%")); lookup.put(ADivideNumericBinaryExpIR.class, new IROperatorInfo(DIVIDE, "/")); lookup.put(AEqualsBinaryExpIR.class, new IROperatorInfo(EQUALS, "=")); lookup.put(ANotEqualsBinaryExpIR.class, new IROperatorInfo(NOT_EQUALS, "<>")); lookup.put(AAddrEqualsBinaryExpIR.class, new IROperatorInfo(EQUALS, "==")); lookup.put(AAddrNotEqualsBinaryExpIR.class, new IROperatorInfo(NOT_EQUALS, "!=")); lookup.put(AGreaterEqualNumericBinaryExpIR.class, new IROperatorInfo(GREATER_EQUAL, ">=")); lookup.put(AGreaterNumericBinaryExpIR.class, new IROperatorInfo(GREATER, ">")); lookup.put(ALessEqualNumericBinaryExpIR.class, new IROperatorInfo(LESS_EQUAL, "<=")); lookup.put(ALessNumericBinaryExpIR.class, new IROperatorInfo(LESS, "<")); lookup.put(APowerNumericBinaryExpIR.class, new IROperatorInfo(POWER, "**")); lookup.put(ACastUnaryExpIR.class, new IROperatorInfo(CAST, "()")); lookup.put(AOrBoolBinaryExpIR.class, new IROperatorInfo(OR, "or")); lookup.put(AAndBoolBinaryExpIR.class, new IROperatorInfo(AND, "and")); lookup.put(AXorBoolBinaryExpIR.class, new IROperatorInfo(XOR, "*^")); lookup.put(ANotUnaryExpIR.class, new IROperatorInfo(NOT, "not")); lookup.put(AMinusUnaryExpIR.class, new IROperatorInfo(UNARY_MINUS, "-")); lookup.put(APlusUnaryExpIR.class, new IROperatorInfo(UNARY_PLUS, "+")); lookup.put(ATernaryIfExpIR.class, new IROperatorInfo(TERNARY_IF, "?:")); } }