Advertisement
Guest User

ExpLoader

a guest
Apr 24th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.24 KB | None | 0 0
  1. package br.cefetmg.inf.cefetiny.interpretador.expressao;
  2.  
  3. import java.util.Stack;
  4.  
  5. import br.cefetmg.inf.cefetiny.excecoes.ErroSintatico;
  6. import br.cefetmg.inf.cefetiny.interpretador.Interpretador;
  7. import br.cefetmg.inf.cefetiny.interpretador.Simbolo;
  8. import br.cefetmg.inf.cefetiny.interpretador.Constantes;
  9.  
  10. public class ExpLoader {
  11.  
  12.     private Interpretador parser = null;        // pilha de expressoes
  13.     private Stack<Expressao> expStack;  // pilha de expressoes
  14.     private Simbolo simboloAtual;           // ultimo simbolo lido
  15.  
  16.     public ExpLoader(Interpretador p) {
  17.         this.parser = p;
  18.     }
  19.  
  20.     public Expressao load() {
  21.         this.expStack = new Stack<>();
  22.         this.simboloAtual = parser.obterSimbolo();
  23.         Expressao exp = start();
  24.         parser.ungetSimbol();
  25.         return exp;
  26.     }
  27.  
  28.     private Expressao start() {
  29.         addop();            // avalie o operador de adicao
  30.         // enquanto operador relacional
  31.         while (simboloAtual.getToken() == Constantes.RELOP) {
  32.             // obtenha o operador
  33.             String op = simboloAtual.getLexema();
  34.  
  35.             // obtenha o proximo operando ou '('
  36.             simboloAtual = parser.obterSimbolo();
  37.             // avalie os operadores de maior prioridade
  38.             addop();
  39.  
  40.             // obtenha a ultima expressao
  41.             Expressao e2 = (Expressao) expStack.pop();
  42.             // obtenha a penultima expressao
  43.             Expressao e1 = (Expressao) expStack.pop();
  44.  
  45.             // crie expressao logica
  46.             expStack.push(new ExpLogica(e1, op, e2));
  47.         } // fim while
  48.  
  49.         return (Expressao) expStack.pop();
  50.     }
  51.  
  52.     // para avaliar os operadores do tipo 'ADDOP'
  53.     private void addop() {
  54.         mulop();            //
  55.         // enquanto operadores ADDOP
  56.         while (simboloAtual.getToken() == Constantes.ADDOP) {
  57.             // obtenha o operador
  58.             String op = simboloAtual.getLexema();
  59.             // obtenha o proximo operando ou '('
  60.             simboloAtual = parser.obterSimbolo();
  61.             mulop();    // avalie os operadores de maior prioridade
  62.             // obtenha a ultima expressao
  63.             Expressao e2 = (Expressao) expStack.pop();
  64.             // obtenha a penultima expressao
  65.             Expressao e1 = (Expressao) expStack.pop();
  66.  
  67.             // se for operador logico
  68.             if (op.equals("or")) // crie expressao logica
  69.                 expStack.push(new ExpLogica(e1, op, e2));
  70.             else // senao
  71.             // crie expressao binaria
  72.                 expStack.push(new ExpBinaria(e1, op, e2));
  73.         } // fim while
  74.     }
  75.  
  76.     // para avaliar os operadores do tipo 'MULOP'
  77.     private void mulop() {
  78.         fator();        // avalie a palavra lida
  79.         // enquanto operadores MULOP
  80.         while (simboloAtual.getToken() == Constantes.MULOP) {
  81.             // obtenha o operador
  82.             String op = simboloAtual.getLexema();
  83.             // obtenha o proximo operando '('
  84.             simboloAtual = parser.obterSimbolo();
  85.             fator();    // avalie o fator lido
  86.             // obtenha a ultima expressao
  87.             Expressao e2 = (Expressao) expStack.pop();
  88.             // obtenha a penultima expressao
  89.             Expressao e1 = (Expressao) expStack.pop();
  90.  
  91.             // se for operador logico
  92.             if (op.equals("and")) // crie expressao logica
  93.             {
  94.                 expStack.push(new ExpLogica(e1, op, e2));
  95.             } else // senao
  96.             // crie expressao binaria
  97.             {
  98.                 expStack.push(new ExpBinaria(e1, op, e2));
  99.             }
  100.         } // fim while
  101.     }
  102.  
  103.     // para avaliar os fatores da expressao
  104.     private void fator() {
  105.         // verifique o fator lido
  106.         switch (simboloAtual.getToken()) {
  107.             case Constantes.T_IDENTIFIER:       // se variavel
  108.                 // empilhe expressao variavel
  109.                 expStack.push(new ExpVariavel(simboloAtual.getLexema()));
  110.                 break;
  111.             case Constantes.T_CONSTANT:     // se constante
  112.                 // empilhe expressao constante
  113.                 expStack.push(new ExpConstante(simboloAtual.getTipo(), simboloAtual.getLexema()));
  114.                 break;
  115.             case Constantes.ABREPAR:        // se abre parentese
  116.                 // obtenha o proximo simbolo
  117.                 simboloAtual = parser.obterSimbolo();
  118.                 expStack.push(start());     // inicie nova expressao
  119.                 // se o simbolo apos a expressao nao for um fechamento de parentese
  120.                 if (simboloAtual.getToken() != Constantes.FECHAPAR) // ative uma excecao de erro sintatico
  121.                     throw new ErroSintatico("Era esperado ')'");
  122.  
  123.                 break;
  124.             case Constantes.UNOP:        // se for sqrt ou not
  125.                 // obtenha o comando
  126.                 String cmd = simboloAtual.getLexema();
  127.                 // obtenha o proximo simbolo
  128.                 simboloAtual = parser.obterSimbolo();
  129.                 // se o simbolo atual nao for abertura de parentese
  130.                 if (simboloAtual.getToken() != Constantes.ABREPAR) // ative uma excecao de erro sintatico
  131.                     throw new ErroSintatico("Era esperado um '(' na linha " + parser.getLineNumber());
  132.  
  133.                 // obtenha o proximo simbolo
  134.                 simboloAtual = parser.obterSimbolo();
  135.                 // analise a expressao desse comando
  136.                 expStack.push(start());
  137.                 // se o simbolo apos a expressao nao for um fechamento de parentese
  138.                 if (simboloAtual.getToken() != Constantes.FECHAPAR) // ative uma excecao de erro sintatico
  139.                     throw new ErroSintatico("Era esperado ')' na linha " + parser.getLineNumber());
  140.  
  141.                 // desempilhe uma expressao
  142.                 Expressao exp = (Expressao) expStack.pop();
  143.                 // crie e empilhe uma expressao unaria
  144.                 expStack.push(new ExpUnaria(cmd, exp));
  145.                 break;
  146.             default:    // se o simbolo lido nao for valido
  147.                 // ative um erro sintatico
  148.                 throw new ErroSintatico("Erro: era esperado um operando ou um '(' na linha " + parser.getLineNumber());
  149.         } // fim switch
  150.  
  151.         // obtenha o proximo simbolo
  152.         simboloAtual = parser.obterSimbolo();
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement