anchor.diff:      ;
   
   declaracao_global
  -    : { pilhaDeTabelas.empilhar(new infrastructure.TabelaDeSimbolos("procedimento")); }
  +    : { pilhaDeTabelas.empilhar(new TabelaDeSimbolos("procedimento")); }
         'procedimento' IDENT
         '(' parametros_opcional ')' declaracoes_locais comandos 'fim_procedimento'
         { pilhaDeTabelas.desempilhar(); }
  -    | { pilhaDeTabelas.empilhar(new infrastructure.TabelaDeSimbolos("funcao")); }
  +    | { pilhaDeTabelas.empilhar(new TabelaDeSimbolos("funcao")); }
         'funcao' IDENT
         '(' parametros_opcional '):' tipo_estendido declaracoes_locais comandos 'fim_funcao'
         { pilhaDeTabelas.desempilhar(); }
  
positive.code:     | 'caso' exp_aritmetica 'seja' selecao senao_opcional 'fim_caso'
      | 'para'
        {   //Empilha (Cria) um novo escopo para o FOR
            pilhaDeTabelas.empilhar(new infrastructure.TabelaDeSimbolos("para"));
        }
        IDENT 
        {   // Logs semantic error if variable wasnt found in any of the simbol tables
            if (!pilhaDeTabelas.existeSimbolo($IDENT.getText().toLowerCase())) {
                 infrastructure.ErrorListeners.SemanticErrorListener.VariableDoesntExist($IDENT.line,$IDENT.getText());
            }
        }
        '<-' exp_aritmetica 'ate' exp_aritmetica 'faca' comandos 'fim_para'
  
negative.code:       {
           String escopo = pilhaDeTabelas.topo().getEscopo();
           if (!escopo.equals("funcao")) {
              SemanticErrorListener.ScopeNotAllowed($RETORNAR.line);
           }
        }
      ;
  