package Portugol.Language.Calcular; import Portugol.Language.Analisador.Simbolo; import Portugol.Language.Analisador.SymbolArray; import Portugol.Language.Analisador.SymbolComposto; import Portugol.Language.Analisador.SymbolObjeto; import Portugol.Language.Utilitario.Values; import java.util.Vector; public class FuncaoTexto extends AbstractCalculus { public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera"; private static String functions1 = " COMPRIMENTO "; private static String functions2 = " LETRA "; //VERIFICA SE O PARAMETRO E UM ELEMENTO DE CALCULO public boolean IsValid(Object str) { if (!(str instanceof String)) { return false; } return functions1.indexOf(" " + ((String) str).toUpperCase() + " ") != -1 || functions2.indexOf(" " + ((String) str).toUpperCase() + " ") != -1; } //-------------------------------------------------------------------------- public int GetNumParameters(Object oper) throws Exception { if (!(oper instanceof String)) { throw new Exception("ERRO 013:\nFUNÇÂO DESCOHECIDA "); } if (functions1.indexOf(" " + ((String) oper).toUpperCase() + " ") != -1) { return 1; } if (functions2.indexOf(" " + ((String) oper).toUpperCase() + " ") != -1) { return 2; } throw new Exception("ERRO 013:\nNOS PARAMETROS DAS FUNCOES [" + (String) oper + "]"); } //-------------------------------------------------------------------------- public int GetPriority(Object oper) throws Exception { if (IsValid(oper)) { return AbstractCalculus.FUNCTION_PRIORITY; } throw new Exception("ERRO 013:\nNA PRIORIDADE DAS FUNCOES"); } //--------------------------------------------------------------------------- @Override public String Calculate(Object oper, Vector params) throws Exception { if (!(oper instanceof String)) { throw new Exception("ERRO 013:\nFUNÇÂO DESCOHECIDA "); } if (params.size() == 1) { return Calculate1((String) oper, params.get(0)); } if (params.size() == 2) { return Calculate2((String) oper, params.get(0), params.get(1)); } throw new Exception("ERRO 013:\nFUNCAO COM PARAMETROS ERRADOS [" + oper + "] " + "" + params.toString()); } //-------------------------------------------------------------------------- private String Calculate1(String oper, Object param) throws Exception { double val = 0; // param = "texto" => comprimento -2 porque " nao conta if (((String) oper).equalsIgnoreCase("COMPRIMENTO")) { if (param instanceof String) { val = ((String) param).length() - 2; } else if (param instanceof SymbolComposto) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER REGISTO [" + ((SymbolComposto) param).getName() + "]"); } else if (param instanceof SymbolObjeto) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER OBJETO [" + ((SymbolObjeto) param).getName() + "]"); } else if (param instanceof SymbolArray) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER VETOR [" + ((SymbolArray) param).getName() + "]"); } else if (param instanceof Simbolo) { if (((Simbolo) param).getType() != Simbolo.TEXTO) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER DO TIPO [" + ((Simbolo) param).getTypeLexema() + "]"); } val = ((String) ((Simbolo) param).getValue()).length(); //David: aqui nao é preciso "-2" } } else { throw new Exception("ERRO 013:\nFUNCOES DESCONHECIDAS [" + oper + "]"); } return Values.IntegerToString(val); } //-------------------------------------------------------------------------- private String Calculate2(String oper, Object param1, Object param2) throws Exception { if (((String) oper).equalsIgnoreCase("LETRA")) { int pos = 0; String val = ""; if (param2 instanceof String) { pos = Values.StringToInteger((String) param2) + 1; } else if (param2 instanceof SymbolComposto) { throw new Exception("ERRO 013:\nA POSIÇAO NAO POSE SER REGISTO [" + ((SymbolComposto) param2).getName() + "]"); } else if (param2 instanceof SymbolObjeto) { throw new Exception("ERRO 013:\nA POSIÇAO NAO POSE SER OBJETO [" + ((SymbolObjeto) param2).getName() + "]"); } else if (param2 instanceof SymbolArray) { throw new Exception("ERRO 013:\nA POSIÇAO NAO POSE SER VETOR [" + ((SymbolArray) param2).getName() + "]"); } else if (param2 instanceof Simbolo) { if (((Simbolo) param2).getType() != Simbolo.INTEIRO) { throw new Exception("ERRO 013:\nA POSIÇAO NAO POSE SER DO TIPO [" + ((Simbolo) param2).getTypeLexema() + "]"); } pos = ((Integer) ((Simbolo) param2).getValue()); //David: aqui nao é preciso "-2" } else { throw new Exception("ERRO 013:\nA POSIÇAO NAO É VALIDO "); } if (param1 instanceof String) { val = (String) param1; } else if (param1 instanceof SymbolComposto) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER REGISTO [" + ((SymbolComposto) param1).getName() + "]"); } else if (param1 instanceof SymbolObjeto) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER OBJETO [" + ((SymbolObjeto) param1).getName() + "]"); } else if (param1 instanceof SymbolArray) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER VETOR [" + ((SymbolArray) param1).getName() + "]"); } else if (param1 instanceof Simbolo) { if (((Simbolo) param1).getType() != Simbolo.TEXTO) { throw new Exception("ERRO 013:\nOPERANDO NAO POSE SER DO TIPO [" + ((Simbolo) param1).getTypeLexema() + "]"); } val = ((String) ((Simbolo) param1).getValue()); //David: aqui nao é preciso "-2" } else { throw new Exception("ERRO 013:\nOPERANDO NAO É VALIDO "); } char ch = val.charAt(pos); return Values.StringToText("" + ch); } else { throw new Exception("ERRO 013:\nFUNCAO DESCONHECIDA [" + oper + "]"); } } }