package Portugol.Language.Criar; import Portugol.Language.Analisador.Keyword; import Portugol.Language.Analisador.ParteDeExpresion; import Portugol.Language.Analisador.Simbolo; import Portugol.Language.Analisador.Variavel; import Portugol.Language.Utilitario.LanguageException; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.JOptionPane; public class ExpandLer { public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera"; //------------------------------------------------------------------------------------- //------------ ---------------------------- //------------ V A R I A V E I S ---------------------------- //------------ ---------------------------- //------------------------------------------------------------------------------------- public static NodeInstruction ExpandRead(NodeInstruction node, int level, Vector memory) throws LanguageException { String LER = Keyword.GetTextKey(Keyword.LEIA); String RECEBE = "RECEBA"; NodeInstruction prevNode = null; //lugar para onde aponta node NodeInstruction originalNextNode = node.GetNext(); //intrucao String instruction = node.GetText().trim(); //verificar se a primeira palavra é leia String ler = instruction.substring(0, LER.length()); String receber = instruction.substring(0, 6); if ((!ler.equalsIgnoreCase(LER)) && (!receber.equalsIgnoreCase(RECEBE))) { throw new LanguageException( node.GetCharNum(), node.GetText(), " Esperava um encontrar um LEIA ou RECEBA", " VERIFICAR BEM A INSTRUÇÃO"); } if (ler.equalsIgnoreCase(LER)) { instruction = instruction.substring(LER.length()).trim(); } else if (receber.equalsIgnoreCase(RECEBE)) { instruction = instruction.substring(RECEBE.length()).trim(); } instruction = (instruction.trim()).replace('(', ' '); //Retira os parenteses instruction = instruction.replace(')', ' '); //dividir as variaveis StringTokenizer tok = new StringTokenizer(instruction, ","); while (tok.hasMoreElements()) { String variavel = ((String) tok.nextElement()).trim(); ParteDeExpresion v = Variavel.getVariable(variavel, memory); if (v == null || !(v instanceof Simbolo)) { throw new LanguageException( node.GetCharNum(), node.GetText(), "A VARIÁVEL \"" + variavel + "\" NÃO FOI DECLARADA", "DECLARE PRIMEIRO A VARIÁVEL \"" + variavel + "\" ANTES DE LER"); } if (((Simbolo) v).isConstant()) { throw new LanguageException( node.GetCharNum(), node.GetText(), variavel + " => É UMA CONSTANTE E NÃO PODE ALTERAR O SEU VALOR", "DECLARE \"" + variavel + "\" COMO VARIÁVEL "); } //texto da definiçao da variável String text = "LER " + variavel; if (prevNode == null) { node.SetText(text); prevNode = node; } else { NodeInstruction newNode = new NodeInstruction(node); newNode.SetText(text); newNode.SetPositionY(node.GetPositionY() + 1); prevNode.SetNext(newNode); prevNode = newNode; } } //fazer a ligação com o no da intruçao seguinte originalNextNode.SetPositionY(prevNode.GetPositionY() + 1); prevNode.SetNext(originalNextNode); //retornar o ultimo return prevNode; //------------------------------------------------------------------------------ } }