Documentação de Usuário – GrView 0.2.1alpha

 

 

Introdução | Modelagem de Grafos | Visualização dos Grafos | Analisador Léxico | Rotinas Semânticas | Analisador Sintático | Exemplos

 

Nesta seção será mostrada brevemente a implementação de uma calculadora simples. A implementação no ASIN dessa calculadora pode ser vista em [1]. O grafo sintático criado no grView é exibido na figura 22:

 

 

Figura 22 – Grafo para a gramática de uma calculadora simples.

 

As rotinas semânticas rs1 e rs2, são utilizadas para implementar as operações de soma, subtração, divisão e multiplicação. A rotina rs1 é mostrada a seguir:

 

void rs1() {

            ParseStackNode aux

            int index = parseStack.size() - 1 //top

            int acumulator

            aux = (ParseStackNode)parseStack.elementAt(index)

            acumulator = aux.intSem()

            index--

            while (index > 0){

                  aux = (ParseStackNode)parseStack.elementAt(index)

                  if (aux.getSyn().equals("+")){

                        index--

                        aux = (ParseStackNode)parseStack.elementAt(index)

                        acumulator = acumulator + aux.intSem()

                        index--                      

                  }

                  else if (aux.getSyn().equals("-")){

                        index--

                        aux = (ParseStackNode)parseStack.elementAt(index)

                        acumulator = aux.intSem() - acumulator

                        index--

                  } else {                                             

                        break

                  }                

            }

            /* Stores the final result assigned to the non-terminal T into the first parse and semantic stack cell of T;

             * this way, the semantic stack will show the partial and final results. */

            ((ParseStackNode) parseStack.elementAt(++index)).setSem(acumulator+"")

            if (index <= 0){

                  output.println("Result: "+acumulator)                                  

            }

      }

 

 

Note que variáveis auxiliares do tipo ParseStackNode podem ser usadas para guardar valores da pilha de símbolos terminais.