package Portugol.Language.Criar;
import Portugol.Language.Analisador.Expressao;
import Portugol.Language.Analisador.Keyword;
import Portugol.Language.Analisador.Simbolo;
import Portugol.Language.Utilitario.LanguageException;
import java.util.Vector;
public class ExpandFazEnquanto {
public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera";
//------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//------------ ---------------------
//------------ I N S T R U Ç A O F A Z E N Q U A N T O ---------------------
//------------ --------------------
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
public static void ExpandDoWhile(NodeInstruction doNode,NodeInstruction endNode,int level, Vector memory)throws LanguageException{
String FAZ = Keyword.GetTextKey( Keyword.FAZ);
String FAZENQUANTO = Keyword.GetTextKey( Keyword.FAZENQUANTO);
//marcar o no como FAZ
doNode.SetType(Keyword.FAZ);
doNode.SetLevel(level);
NodeInstruction tmp = doNode.GetNext();
if (tmp.equals(endNode)) {
//no caso do ciclo vazio, não permitir, mas se permitere tem as condições para executar sem problemas
throw new LanguageException(
endNode.GetCharNum(),
doNode.GetText()+" - "+endNode.GetText(),
"O ciclo Faz-ENQUANTO está vazío",
"Acrecente instruções dentro do ciclo.");
}
//procurar o fim do ciclo
while(!tmp.equals(endNode)){
tmp.SetLevel(level+1);
tmp = tmp.GetNext();
}
//fim do Faz enquanto
NodeInstruction endDoNode = tmp;
//fazer o no do endDowhile
String condic = (endDoNode.GetText().trim()).substring(FAZENQUANTO.length()).trim();
//verificar a condicao
if( Expressao.TypeExpression(condic,memory)!= Simbolo.LOGICO)
throw new LanguageException(
doNode.GetCharNum(), doNode.GetText(),
"\"" + condic + "\" NÃO É UMA CONDIÇÃO VÁLIDA" ,
"VERIFIQUE SE A CONDIÇÃO ESTÁ BEM ESCRITA");
//alterar o texto para a condicao
endDoNode.SetText(condic);
//tipo de no dp tipo DOWHILE
endDoNode.SetType(Keyword.FAZENQUANTO);
//nivel do no
endDoNode.SetLevel(level);
//se for verdadeiro volta para cima
endDoNode.SetIfTrue(doNode);
//se for falso continua
endDoNode.SetIfFalse(endDoNode.GetNext());
//ligar o FAZ é primeira instrucao fora do ciclo.
// utilizo esta ligacao para escrever (toString)
doNode.SetIfTrue(endDoNode.GetNext());
doNode.SetIfFalse(endDoNode.GetNext());
}
public static void CalculatePositions( NodeInstruction begin ,double Y, double X ){
double PY , PX ;
PX = 0.5/(begin.level + 1.0);
begin.SetPositionY(Y);
begin.SetPositionX(X);
NodeInstruction tmp = begin.GetNext();
//fazer o if
PY = Y+1;
while(tmp.GetIfTrue() != begin){
// FluxogramVisual.ProcessNodePosition(tmp, PY , X + PX);
PY = tmp.GetPositionY() + 1;
tmp = tmp.GetNext();
}
//colocar a decisao ao mesmo nivel do faz
tmp.SetPositionY(PY);
tmp.SetPositionX(X);
}
public static String toString(NodeInstruction begin){
StringBuffer str = new StringBuffer();
str.append(begin.toString()+"\n");
NodeInstruction tmp = begin.GetNext();
while(tmp.GetIfTrue() != begin){
str.append(Intermediario.GetCode(tmp));
tmp = tmp.GetNext();
}
return str.toString();
}
}