Package sintatico

Examples of sintatico.Descritor


  protected void realizaAcao(int idAcao, Token token) throws SimboloNaoDeclaradoException, RedeclaracaoDeSimboloException {
    StringBuffer buffer = new StringBuffer();

    switch(idAcao){
    case CMD_ACAO_ID: // Recebeu um ID, verifica se foi declarado (espera em seguida atribuicao ou chamada de funcao))
      Descritor simbolo = simboloDeclarado(token,false);
      if(simbolo!=null){
        //  Existe, guarda na pilha (pois em seguida espera-se uma atribui��o ou chamada de funcao)
        pilhaSimbolos.push(simbolo);
      }else{
        throw new SimboloNaoDeclaradoException("Linha: "+ sintatico.getLinha() + ": S�mbolo n�o foi declarado: " + getInfoComplementar(token));
      }
      break;

    case CMD_ACAO_FIM_ATRIBUICAO_NORMAL:
      //  Ao final da atribui��o a uma variavel, o valor a ser atribuido estar� no ACC
      buffer.append("\tMOV\t" + pilhaSimbolos.pop().getLabel() + ",EAX\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_DETERMINOU_INDICE_VETOR:
      Descritor d = pilhaSimbolos.peek();
      String label = d.getLabel();
     
      // Qdo recebe "]", o indice do vetor esta no acumulador
      buffer.append("\tMOV\tT_AT,EAX\n"); // salva em T_AT
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_FIM_ATRIBUICAO_VETOR:
      // pega id do vetor, jogando endere�o base no EDI
      buffer.append("\tMOV\tEDI," + pilhaSimbolos.pop().getLabel() + "\n");
      // O indice esta guardado em T_AT
      buffer.append("\tMOV\tESI,T_AT\n"); // guarda o indice no ESI
      buffer.append("\tMOV\t[EDI+ESI*4], AL\n"); // copia byte pro endere�o
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_EA_1_COMP_IF_WHILE: // definiu valor da primeira EA da comparacao
      // entra aqui so qdo recebe o operador de compara��o, pq antes nao definiu o valor
      operadorComp = obtemValor(token); // guarda operador
      buffer.append("\tMOV\tT_COMP,EAX\n"); // valor esta no ACC, salva em T_COMP
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_EA_2_COMP_IF: // definiu valor da segunda EA da comparacao
      //  entra aqui so qdo recebe "then", pq antes nao definiu o valor
      // o valor de segunda EA esta no ACC
      buffer.append("\tSUB\tEAX,T_COMP\n"); // valor esta no ACC, subtrai T_COMP dela (B-A)
      numSerieAtual = getProximoNumSerie();
      if(operadorComp.equals(">")){
        buffer.append("\tJGE\tIF_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("<")){
        buffer.append("\tJLE\tIF_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("==")){
        buffer.append("\tJNE\tIF_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("!=")){
        buffer.append("\tJE\tIF_" + numSerieAtual + "\n");
      }
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      operadorComp = "";
      break;

    case CMD_ACAO_ELSE: // else
      buffer.append("\tJMP\tENDIF_"+ numSerieAtual + "\n"); // coloca label
      buffer.append("IF_"+ numSerieAtual + ":\n"); // coloca label
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;
     
    case CMD_ACAO_ENDIF_ELSE: // endif com else
      buffer.append("ENDIF_"+ numSerieAtual + ":\n"); // coloca label
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;
     
    case CMD_ACAO_ENDIF: // endif sem else
      buffer.append("IF_"+ numSerieAtual + ":\n"); // coloca label
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_WHILE:
      numSerieAtual = getProximoNumSerie();
      buffer.append("LOOP_"+ numSerieAtual + ":\n"); // coloca label
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_EA_2_COMP_WHILE:
      // definiu valor da segunda EA da comparacao
      //  entra aqui so qdo recebe "loop", pq antes nao definiu o valor
      // o valor de segunda EA esta no ACC
      buffer.append("\tSUB\tEAX,T_COMP\n"); // valor esta no ACC, subtrai T_COMP dela (B-A)
      if(operadorComp.equals(">")){
        buffer.append("\tJGE\tELOOP_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("<")){
        buffer.append("\tJLE\tELOOP_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("==")){
        buffer.append("\tJNE\tELOOP_" + numSerieAtual + "\n");
      }else if(operadorComp.equals("!=")){
        buffer.append("\tJE\tELOOP_" + numSerieAtual + "\n");
      }
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      operadorComp = "";
      break;

    case CMD_ACAO_END_LOOP: // end_loop
      buffer.append("\tJMP\tLOOP_"+ numSerieAtual + "\n")// volta p/ inicio do loop
      buffer.append("ELOOP_"+ numSerieAtual + ":\n"); // coloca label
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

    case CMD_ACAO_INI_BLOCO:
      nivelEscopo++;
      break;

    case CMD_ACAO_FIM_BLOCO:
      //  Tira simbolos criadas neste bloco da tabela de simbolos
      deletaSimbolosDoBloco(nivelEscopo);
      nivelEscopo--;
      break;

    case CMD_ACAO_DECLARACAO_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){//OBS era simboloExiste false
        String novoLabel = "N" + nivelEscopo + "_" + label;
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(label, d,false);
        pilhaSimbolos.push(d);
        buffer.append("\t"+ novoLabel + "\tdd\t0\n");
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case CMD_ACAO_DECLARACAO_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){//OBS era simboloExiste false
        String novoLabel = "N" + nivelEscopo + "_" + label;
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
        pilhaSimbolos.push(d);
        buffer.append("\t"+ novoLabel + "\tdd\t0\n");
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case CMD_ACAO_INI_DECLARACAO_VETOR_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS era simboloExiste false
        String novoLabel = "N" + nivelEscopo + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case CMD_ACAO_RECEBEU_TAM_VETOR:
      // Seta o tamanho do vetor no descritor
      d = pilhaSimbolos.peek();
      d.setNumParam(token.getIComplementaryInformation());
      break;

    case CMD_ACAO_FIM_DECLARACAO_VETOR:
      //  Recebeu valor do numero de elementos do vetor
      //  Reserva memoria
      d = pilhaSimbolos.pop(); // tira simbolo da pilha
      label = d.getLabel();
      int tam = d.getNumParam();
      int num = 0;//getProxNumSerieVetor();
      buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
      buffer.append("\t"+ label + "_"+ num + "\tdd\t");
      for(int i=0; i<tam-1; i++){
        buffer.append("0,");
      }
      buffer.append("0\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;

    case CMD_ACAO_INI_DECLARACAO_VETOR_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS era simboloExiste false
        String novoLabel = "N" + nivelEscopo + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
View Full Code Here


      str = sintatico.pegaInfoComplementar(token.getIComplementaryInformation());
    else if (str.equals(Constantes.NUMERO)){
      str = token.getIComplementaryInformation() + "";
    }
    else if (token.getTokenType().equals(Constantes.IDENTIFICADOR)){
      Descritor d = sintatico.simboloDeclarado(token,false);
      if(d!=null)
        str = d.getLabel();
      else
        str = sintatico.getSimbolo(token.getIComplementaryInformation());
    }else if(token.getTokenType().equals(Constantes.T_EA)){
      str = "T_EA";
    }
View Full Code Here

    case PROG_ACAO_DECLARACAO_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      String label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
        Descritor d = new Descritor(Tipo.VAR_INT,label,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
        buffer.append("\t"+ label + "\tdd\t0\n");
        // System.out.print(buffer.toString());
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        // System.out.println("ja tem: " + label);
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_DECLARACAO_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
        Descritor d = new Descritor(Tipo.VAR_BOOL,label,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
        buffer.append("\t"+ label + "\tdd\t0\n");
        // System.out.print(buffer.toString());
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        // System.out.println("ja tem: " + label);
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_INI_DECLARACAO_VETOR_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
        // Guarda id na pilha. Espera-se "[n]" em sequida
        Descritor d = new Descritor(Tipo.VAR_INT,label,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
      }else{
        // System.out.println("ja tem: " + label);
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_RECEBEU_TAM_VETOR:
      // Seta o tamanho do vetor no descritor
      Descritor d = pilhaSimbolos.peek();
      d.setNumParam(token.getIComplementaryInformation());
      break;

    case PROG_ACAO_FIM_DECLARACAO_VETOR:
      //  Recebeu valor do numero de elementos do vetor
      //  Reserva memoria
      d = pilhaSimbolos.pop(); // tira simbolo da pilha
      label = d.getLabel();
      int tam = d.getNumParam();
      int num = 0; //getProxNumSerieVetor();
      buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
      buffer.append("\t"+ label + "_"+ num + "\tdd\t");
      for(int i=0; i<tam-1; i++){
        buffer.append("0,");
      }
      buffer.append("0\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;

    case PROG_ACAO_INI_DECLARACAO_VETOR_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_BOOL,label,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_ID_FUNC_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(token);
      if(simboloDeclarado(token,false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
        d = new Descritor(Tipo.FUNC_INT,label,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(token), d,false);
        pilhaSimbolos.push(d)// guarda simbolo
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));
      }
      break;

    case PROG_ACAO_INI_FUNC_INT_BOOL:
      d = pilhaSimbolos.peek();
      d.setNumParam(numParametros); // seta num de parametros
      //  Gera codigo p/  label da funcao
      label = d.getLabel();
      funcAtual = label;
      buffer.append(label+"\tproc\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
//      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;

    case PROG_ACAO_INI_FUNC_VOID:
      d = pilhaSimbolos.peek();
      d.setNumParam(numParametros); // seta num de parametros
      //  Gera codigo p/  label da funcao
      label = d.getLabel();
      funcAtual = label;
      buffer.append(label+"\tproc\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
//      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;
     
    case PROG_ACAO_FUNC_PARAM_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String func = pilhaSimbolos.peek().getLabel();
        String novoLabel = func + "_" + label;
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
       
        // codigo definindo label (no formato <label_funcao>_<label>)
        buffer.append("\t" + novoLabel + "\tdd\t0\n");
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
//        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_PARAM_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String func = pilhaSimbolos.peek().getLabel();
        String novoLabel = func + "_" + label;
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
       
        // codigo definindo label (no formato <label_funcao>_<label>)
        buffer.append("\t" + novoLabel + "\tdd\t0\n");
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
//        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_INI_PARAM_VETOR_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String func = pilhaSimbolos.peek().getLabel();
        String novoLabel = func + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_PARAM_TAM_VETOR:
      // Seta o tamanho do vetor no descritor
      d = pilhaSimbolos.peek();
      d.setNumParam(token.getIComplementaryInformation());
      break;

    case PROG_ACAO_FUNC_FIM_PARAM_VETOR:
      //  Recebeu valor do numero de elementos do vetor
      //  Reserva memoria
      d = pilhaSimbolos.pop(); // tira simbolo da pilha
      label = d.getLabel();
      tam = d.getNumParam();
      num = 0; //getProxNumSerieVetor();
      buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
      buffer.append("\t"+ label + "_"+ num + "\tdd\t");
      for(int i=0; i<tam-1; i++){
        buffer.append("0,");
      }
      buffer.append("0\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;

    case PROG_ACAO_FUNC_INI_PARAM_VETOR_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String func = pilhaSimbolos.peek().getLabel();
        String novoLabel = func + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break


      /*
       *Declaracao de variaveis/vetor dentro da funcao
       */
    case PROG_ACAO_FUNC_DECLARACAO_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String novoLabel = funcAtual + "_" + label;
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
        buffer.append("\t"+ novoLabel + "\tdd\t0\n");
//        buffer.append("\tLOCAL\t"+ novoLabel + "\t:DWORD\n");
        //FIXME: aqui....
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_DECLARACAO_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String novoLabel = funcAtual + "_" + label;
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
//        buffer.append("\tLOCAL\t"+ novoLabel + "\t:DWORD\n");
        buffer.append("\t"+ novoLabel + "\tdd\t0\n");
        escreveNoArquivo(buffer.toString());
        escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_INI_DECLARACAO_VETOR_INT:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String novoLabel = funcAtual + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

    case PROG_ACAO_FUNC_RECEBEU_TAM_VETOR:
      // Seta o tamanho do vetor no descritor
      d = pilhaSimbolos.peek();
      d.setNumParam(token.getIComplementaryInformation());
      break;

    case PROG_ACAO_FUNC_FIM_DECLARACAO_VETOR:
      //  Recebeu valor do numero de elementos do vetor
      //  Reserva memoria
      d = pilhaSimbolos.pop(); // tira simbolo da pilha
      label = d.getLabel();
      tam = d.getNumParam();
      num = 0; //getProxNumSerieVetor();
      buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
      buffer.append("\t"+ label + "_"+ num + "\tdd\t");
      for(int i=0; i<tam-1; i++){
        buffer.append("0,");
      }
      buffer.append("0\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
      break;

    case PROG_ACAO_FUNC_INI_DECLARACAO_VETOR_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(getTokenAnterior());
      if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        String novoLabel = funcAtual + "_" + label;
        // Guarda id na pilha. Espera-se "[n]" em sequida
        d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,true);
        pilhaSimbolos.push(d);
        tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
      }
      break;

      /*
       * Retorno de funcao
       */ 
    case PROG_ACAO_RETURN:
      // o resultado da EA vai estar no ACC. Salva resultado em T_FUNC
      buffer.append("\tMOV\tT_FUNC,EAX\n");
      escreveNoArquivo(buffer.toString());
      escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
      break;

      /*
       * Declaracao de funcao bool
       */
    case PROG_ACAO_ID_FUNC_BOOL:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(token);
      if(simboloDeclarado(token,true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        d = new Descritor(Tipo.FUNC_BOOL,label,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(token), d,false);
        pilhaSimbolos.push(d)// guarda simbolo
      }else{
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));
      }
      break;

      /*
       * Declaracao de funcao void
       */
    case PROG_ACAO_ID_FUNC_VOID:
      //  Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
      //  adiciona na tabela de s�mbolos
      label = obtemValor(token);
      if(simboloDeclarado(token,true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
        d = new Descritor(Tipo.FUNC_VOID,label,0,nivelEscopo,false);
        tabelaSimbolosPut(getInfoComplementar(token), d,false);
        pilhaSimbolos.push(d)// guarda simbolo
      }else{
        // System.out.println("ja tem: " + label);
        throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));
View Full Code Here

    case EA_ACAO_ID:
      if(pilhaZerada(pilhaOperador)){
        expressaoRPN.add(token)//  Coloca operando na saida
//        System.out.println("COLOCOU NA SAIDA: "+ strToken);
//        imprimeStatus();
        pilhaSimbolos.push(new Descritor(Tipo.INDEFINIDO,obtemValor(token),0,nivelEscopo,false)); //guarda simb
      }else{
        pilhaOperando.push(token)//  Empilha operando
//        System.out.println("EMPILHOU OPERANDO: "+ strToken);
//        imprimeStatus();
      }
View Full Code Here

TOP

Related Classes of sintatico.Descritor

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.