package Portugol.Language.Calcular; import java.util.Vector; public class CalculusElement { public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera"; static Vector<AbstractCalculus> elemCalc; static Functions calcFunctions; static Aritmeticos calcAritmeticos; static Logico calcLogico; static Relationals calcRelationals; static AccesosCompuestos calcAccesosCompuestos; static { calcFunctions = new Functions(); calcAritmeticos = new Aritmeticos(); calcLogico = new Logico(); calcRelationals = new Relationals(); calcAccesosCompuestos = new AccesosCompuestos(); elemCalc = new Vector<>(); elemCalc.add(calcFunctions); elemCalc.add(calcAritmeticos); elemCalc.add(calcLogico); elemCalc.add(calcRelationals); elemCalc.add(calcAccesosCompuestos); } //verifica se é uma função public static boolean IsFunction(String str) { return calcFunctions.IsValid(str); } //verifica se é um operador aritmetico public static boolean IsAritmetic(String str) { return calcAritmeticos.IsValid(str); } //verifica se é um operador logico public static boolean IsLogic(String str) { return calcLogico.IsValid(str); } //verifica se é um operador relacional public static boolean IsRelational(String str) { return calcRelationals.IsValid(str); } //verifica se é um operador relacional ou logico ou relacional public static boolean IsOperator(String str) { return IsRelational(str) || IsLogic(str) || IsAritmetic(str); } //verifica se é o testo é um elemento de cálculo public static boolean IsElemCalculus(String str) { return IsFunction(str) || IsAritmetic(str) || IsLogic(str) || IsRelational(str); } //verifica se é um elemento de cálculo válido public boolean IsCalculus(Object str) { if (str instanceof String && ((String) str).equals("(") || str instanceof String && ((String) str).equals(")")) { return true; } for (int index = 0; index < elemCalc.size(); index++) { if (((AbstractCalculus) elemCalc.get(index)).IsValid(str)) { return true; } } return false; } //-------------------------------------------------------------------------- public int GetNumParameters(Object str) throws Exception { for (int index = 0; index < elemCalc.size(); index++) { if (((AbstractCalculus) elemCalc.get(index)).IsValid(str)) { return ((AbstractCalculus) elemCalc.get(index)).GetNumParameters(str); } } throw new Exception("ERRO 014:\nPARÁMETROS DE OPERADOR DESCONHECIDO [" + str + "]"); } //--------------------------------------------------------------------------- public int GetPriority(Object str) throws Exception { if (str instanceof String && ((String)str).equalsIgnoreCase("(")) { return 0; } if (str instanceof String && ((String)str).equalsIgnoreCase(")")) { return 0; } for (int index = 0; index < elemCalc.size(); index++) { if (((AbstractCalculus) elemCalc.get(index)).IsValid(str)) { return ((AbstractCalculus) elemCalc.get(index)).GetPriority(str); } } throw new Exception("ERRO 014:\nNA PRIORIDADE [" + (String) str + "]"); } // Executa o calculo do elemento public String Calculate(Object str, Vector params) throws Exception { for (int index = 0; index < elemCalc.size(); index++) { if (((AbstractCalculus) elemCalc.get(index)).IsValid(str)) { return ((AbstractCalculus) elemCalc.get(index)).Calculate(str, params); } } throw new Exception("ERRO 014:\nNO CALCULO DE OPERADOR DESCONHECIDO [" + str + "]" + params.toString()); } }