package Portugol.Language.Criar; import Portugol.Language.Analisador.Expressao; import Portugol.Language.Analisador.ParteDeExpresion; import Portugol.Language.Analisador.Simbolo; import Portugol.Language.Analisador.SimboloDeParametro; import Portugol.Language.Analisador.TipoDeParametro; import Portugol.Language.Analisador.Variavel; import Portugol.Language.Utilitario.LanguageException; import java.util.Vector; /** * @author Augusto Bilabila original de Antonio manso */ public class ExpandDefinirVariavel { public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera"; //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- public static NodeInstruction Define(String alter, String type, String name, String value, NodeInstruction node, Vector memory) throws LanguageException { //verificar se is um nome aceitavel if (!Variavel.isNameAcceptable(name)) { throw new LanguageException( node.GetCharNum(), node.GetText(), " SIMBOLO " + name + " INVÁLIDO :" + Variavel.getErrorName(name), "ALTERE O NOME DO SIMBOLO " + name); } //verificar se a variavel ja esta definida //David: ParteDeExpresion tmpVar = Variavel.getVariable(name, memory); if (tmpVar != null && tmpVar instanceof Simbolo/*&& tmpVar.getLevel() == node.GetLevel()*/) //David: quitado lo de posible repeticion de variables para niveles distintos { throw new LanguageException( node.GetCharNum(), node.GetText(), "O SIMBOLO <" + name + "> JÁ FOI DECLARADO", " MUDE DE NOME <" + name + "> ."); } //verificar a expressao try { if (!Expressao.IsExpression(value, memory)) { throw new LanguageException( node.GetCharNum(), node.GetText(), "O ELEMENTO \"" + Expressao.ErrorExpression(value, memory) + "\" NÃO É UMA EXPRESSÃO VÁLIDA", " VERIFIQUE A EXPRESSÃO"); } } catch (Exception e) { if (e instanceof LanguageException) { if (((LanguageException)e).line > 0 && !((LanguageException)e).codeLine.isEmpty()) { throw e; } throw new LanguageException( node.GetCharNum(), node.GetText(), ((LanguageException)e).error, ((LanguageException)e).solution); } else { throw new LanguageException( node.GetCharNum(), node.GetText(), "O ELEMENTO \"" + Expressao.ErrorExpression(value, memory) + "\" NÃO É UMA EXPRESSÃO VÁLIDA", " VERIFIQUE A EXPRESSÃO"); } } //Avaliar a expressao // se nao for possivel avaliar provoca erro Object memValue; try { memValue = Expressao.Evaluate(value, memory, true); } catch (Exception e) { throw new LanguageException( node.GetCharNum(), node.GetText(), e.toString(), "VERIFIQUE A EXPRESSÃO <" + value + ">"); } //verificar se o resultado da expressao e compativel com a variavel if (!Simbolo.IsCompatible(type, memValue)) { throw new LanguageException( node.GetCharNum(), node.GetText(), "O VALOR <" + value + "> NÃO É PERMITIDO PARA UMA VARIÁVEL " + type, " VERIFIQUE A EXPRESSÃO :" + value); } //normalizar o texto da expressao String text = alter + " " + type + " " + name + " <- " + value; // fazer um novo no NodeInstruction newNode = new NodeInstruction(node); newNode.SetText(text); Variavel.defineVAR(newNode, memory, new Vector<TipoDeParametro>(), new Vector<SimboloDeParametro>()); return newNode; } }