//// token = lexico.getToken();
//// System.out.println("Token recebido: " + token.getTokenType() + " " + token.getIComplementaryInformation());
// System.out.println("END");
// System.exit(0);
Token token = lexico.getToken();
while(!token.getTokenType().equals(Constantes.TOKEN_FIM_DE_ARQUIVO) || !pilhaStatus.isEmpty()){
// System.out.println("Token recebido: " + token.getTokenType() + " " + token.getIComplementaryInformation());
if(token.getTokenType().equals(Constantes.TOKEN_FIM_DE_ARQUIVO)){
// Recebeu token de fim de arquivo mas ainda est� numa submaquina
// Desempilha a submaquina
statusAtual = pilhaStatus.pop();
// Volta a m�quina anterior p/ o estado e estava
statusAtual.getMaquina().setEstadoAtual(statusAtual.getEstado());
}
int tipoTransicao = statusAtual.getMaquina().opera(token);
statusAtual.setEstado(statusAtual.getMaquina().getEstadoAtual());
switch(tipoTransicao){
case TRANSICAO_NORMAL:
tokenAnterior = token;
token = lexico.getToken();
break;
case TRANSICAO_EA:
// Empilha o status atual (m�quina + estado)
pilhaStatus.push(new Status(statusAtual.getMaquina(),statusAtual.getEstado()));
statusAtual.setMaquina(maquinaExpressao);
maquinaExpressao.setEstadoAtual(Constantes.ESTADO_INICIAL);
statusAtual.setEstado(Constantes.ESTADO_INICIAL);
break;
case TRANSICAO_CMD:
// Empilha o status atual (m�quina + estado)
pilhaStatus.push(new Status(statusAtual.getMaquina(),statusAtual.getEstado()));
statusAtual.setMaquina(maquinaComando);
maquinaComando.setEstadoAtual(Constantes.ESTADO_INICIAL);
statusAtual.setEstado(Constantes.ESTADO_INICIAL);
break;
case ESTADO_FINAL:
// Se for estado final verifica se a pilha cont�m subm�quinas empilhadas
if(!pilhaStatus.isEmpty()){
statusAtual = pilhaStatus.pop();
// Volta a m�quina anterior p/ o estado e estava
statusAtual.getMaquina().setEstadoAtual(statusAtual.getEstado());
}else{
// Se n�o possuir sub-m�quinas empilhadas e o token n�o for de fim de arquivo, � erro
if(!token.getTokenType().equals(Constantes.TOKEN_FIM_DE_ARQUIVO)){
throw new StateMachineException("Pr�ximo estado inexistente: Erro na transi��o: ");
}
}
break;
}