Repository: DesignLiquido/delegua
Pull request #631 (2024-02-07 15:22:44)

Melhoria validação de Tuplas e definição de tipos


Patch:
diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts
index d47129aa..05482cb1 100644
--- a/fontes/analisador-semantico/analisador-semantico.ts
+++ b/fontes/analisador-semantico/analisador-semantico.ts
@@ -28,6 +28,7 @@ import {
     Var,
     VarMultiplo,
 } from '../declaracoes';
+import { InicioAlgoritmo } from '../declaracoes/inicio-algoritmo';
 import { SimboloInterface } from '../interfaces';
 import { AnalisadorSemanticoInterface } from '../interfaces/analisador-semantico-interface';
 import { DiagnosticoAnalisadorSemantico, DiagnosticoSeveridade } from '../interfaces/erros';
@@ -77,13 +78,19 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
     visitarExpressaoAcessoElementoMatriz(expressao: any) {
         return Promise.resolve();
     }
+
     visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: any): Promise<any> {
         return Promise.resolve();
     }
+
     visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<any> {
         return Promise.resolve();
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        return Promise.resolve();
+    }
+
     erro(simbolo: SimboloInterface, mensagem: string): void {
         this.diagnosticos.push({
             simbolo: simbolo,
diff --git a/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts b/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
index b309a125..13d74976 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
@@ -27,6 +27,7 @@ import {
     Var,
     VarMultiplo,
 } from '../../declaracoes';
+import { InicioAlgoritmo } from '../../declaracoes/inicio-algoritmo';
 import { AnalisadorSemanticoInterface } from '../../interfaces/analisador-semantico-interface';
 import { DiagnosticoAnalisadorSemantico, DiagnosticoSeveridade } from '../../interfaces/erros';
 import { RetornoAnalisadorSemantico } from '../../interfaces/retornos/retorno-analisador-semantico';
@@ -62,6 +63,10 @@ export class AnalisadorSemanticoBirl implements AnalisadorSemanticoInterface {
         this.atual = 0;
         this.diagnosticos = [];
     }
+
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        return Promise.resolve();
+    }
     
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         return Promise.resolve();
diff --git a/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts b/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts
index e2dfbb28..17b393ed 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts
@@ -28,6 +28,7 @@ import {
     Var,
     VarMultiplo,
 } from '../../declaracoes';
+import { InicioAlgoritmo } from '../../declaracoes/inicio-algoritmo';
 import { SimboloInterface } from '../../interfaces';
 import { AnalisadorSemanticoInterface } from '../../interfaces/analisador-semantico-interface';
 import { DiagnosticoAnalisadorSemantico, DiagnosticoSeveridade } from '../../interfaces/erros';
@@ -51,6 +52,10 @@ export class AnalisadorSemanticoMapler implements AnalisadorSemanticoInterface {
         this.atual = 0;
         this.diagnosticos = [];
     }
+
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        return Promise.resolve();
+    }
     
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         return Promise.resolve();
diff --git a/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts b/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts
index 73d7e50d..4c2191e3 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts
@@ -27,6 +27,7 @@ import {
     Var,
     VarMultiplo
 } from "../../declaracoes";
+import { InicioAlgoritmo } from "../../declaracoes/inicio-algoritmo";
 import { SimboloInterface } from "../../interfaces";
 import { AnalisadorSemanticoInterface } from "../../interfaces/analisador-semantico-interface";
 import { DiagnosticoAnalisadorSemantico, DiagnosticoSeveridade } from "../../interfaces/erros";
@@ -51,6 +52,10 @@ export class AnalisadorSemanticoVisuAlg implements AnalisadorSemanticoInterface
         this.atual = 0;
         this.diagnosticos = [];
     }
+
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        return Promise.resolve();
+    }
     
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         return Promise.resolve();
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 6a1e6ddf..5cbc7a3c 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -1,4 +1,5 @@
 import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
+import tipoDeDadosDelegua from '../tipos-de-dados/delegua';
 import hrtime from 'browser-process-hrtime';
 
 import { AvaliadorSintaticoInterface, ParametroInterface, SimboloInterface } from '../interfaces';
@@ -107,13 +108,21 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
     }
 
     verificarDefinicaoTipoAtual(): TiposDadosInterface {
-        const tipos = ['inteiro', 'qualquer', 'real', 'texto', 'vazio', 'vetor'];
+        // const tipos = [
+        //     tipoDeDadosDelegua.INTEIRO, 
+        //     tipoDeDadosDelegua.QUALQUER,
+        //     tipoDeDadosDelegua.REAL, 
+        //     tipoDeDadosDelegua.TEXTO,
+        //     tipoDeDadosDelegua.VAZIO, 
+        //     tipoDeDadosDelegua.VETOR
+        // ];
+        const tipos = [...Object.values(tipoDeDadosDelegua)]
 
         const lexema = this.simboloAtual().lexema.toLowerCase();
         const contemTipo = tipos.find((tipo) => tipo === lexema);
 
         if (contemTipo && this.verificarTipoProximoSimbolo(tiposDeSimbolos.COLCHETE_ESQUERDO)) {
-            const tiposVetores = ['inteiro[]', 'qualquer[]', 'real[]', 'texto[]'];
+            const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
             this.avancarEDevolverAnterior();
 
             if (!this.verificarTipoProximoSimbolo(tiposDeSimbolos.COLCHETE_DIREITO)) {
@@ -1131,6 +1140,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
         }
 
         for (let [indice, identificador] of identificadores.entries()) {
+            tipo = inicializadores[indice] instanceof Tupla ? tipoDeDadosDelegua.TUPLA : tipo;
             retorno.push(new Var(identificador, inicializadores[indice], tipo));
         }
 
diff --git a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
index 32986c45..cda13db6 100644
--- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
@@ -44,6 +44,7 @@ import tiposDeSimbolos from '../../../tipos-de-simbolos/visualg';
 import { ParametroVisuAlg } from './parametro-visualg';
 import { TiposDadosInterface } from '../../../interfaces/tipos-dados-interface';
 import { ErroAvaliadorSintatico } from '../../erro-avaliador-sintatico';
+import { InicioAlgoritmo } from '../../../declaracoes/inicio-algoritmo';
 
 export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
     blocoPrincipalIniciado: boolean;
@@ -275,11 +276,12 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
         return inicializacoes;
     }
 
-    private validarSegmentoInicio(algoritmoOuFuncao: string): void {
-        this.consumir(
+    private validarSegmentoInicio(algoritmoOuFuncao: string): SimboloInterface {
+        const simboloInicio = this.consumir(
             tiposDeSimbolos.INICIO,
             `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`
         );
+        return simboloInicio;
     }
 
     estaNoFinal(): boolean {
@@ -1181,8 +1183,8 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
             case tiposDeSimbolos.FUNCAO:
                 return this.funcao('funcao');
             case tiposDeSimbolos.INICIO:
-                this.validarSegmentoInicio('algoritmo');
-                return null;
+                const simboloInicio = this.validarSegmentoInicio('algoritmo');
+                return new InicioAlgoritmo(simboloInicio.linha, simboloInicio.hashArquivo);
             case tiposDeSimbolos.INTERROMPA:
                 return this.declaracaoInterrompa();
             case tiposDeSimbolos.LEIA:
diff --git a/fontes/declaracoes/index.ts b/fontes/declaracoes/index.ts
index a4c062c3..b92510d8 100644
--- a/fontes/declaracoes/index.ts
+++ b/fontes/declaracoes/index.ts
@@ -14,6 +14,7 @@ export * from './falhar';
 export * from './fazer';
 export * from './funcao';
 export * from './importar';
+export * from './inicio-algoritmo';
 export * from './leia';
 export * from './leia-multiplo';
 export * from './para';
diff --git a/fontes/declaracoes/inicio-algoritmo.ts b/fontes/declaracoes/inicio-algoritmo.ts
new file mode 100644
index 00000000..d620d333
--- /dev/null
+++ b/fontes/declaracoes/inicio-algoritmo.ts
@@ -0,0 +1,13 @@
+import { VisitanteComumInterface } from "../interfaces";
+import { Declaracao } from "./declaracao";
+
+export class InicioAlgoritmo extends Declaracao {
+
+    constructor(linha: number, hashArquivo: number) {
+        super(linha, hashArquivo);
+    }
+
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
+        return visitante.visitarDeclaracaoInicioAlgoritmo(this);
+    }
+}
diff --git a/fontes/formatadores/formatador-delegua.ts b/fontes/formatadores/formatador-delegua.ts
index 56867ca1..d9b49777 100644
--- a/fontes/formatadores/formatador-delegua.ts
+++ b/fontes/formatadores/formatador-delegua.ts
@@ -52,6 +52,7 @@ import {
     Aleatorio,
     CabecalhoPrograma,
 } from '../declaracoes';
+import { InicioAlgoritmo } from '../declaracoes/inicio-algoritmo';
 import { VisitanteComumInterface } from '../interfaces';
 
 import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
@@ -78,6 +79,10 @@ export class FormatadorDelegua implements VisitanteComumInterface {
         this.deveIndentar = true;
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/formatadores/formatador-portugol-studio.ts b/fontes/formatadores/formatador-portugol-studio.ts
index 1121a3b8..b54b77dc 100644
--- a/fontes/formatadores/formatador-portugol-studio.ts
+++ b/fontes/formatadores/formatador-portugol-studio.ts
@@ -1,5 +1,6 @@
 import { AcessoIndiceVariavel, AcessoMetodoOuPropriedade, Agrupamento, AtribuicaoPorIndice, Atribuir, Binario, Chamada, Construto, DefinirValor, Dicionario, ExpressaoRegular, FimPara, FormatacaoEscrita, FuncaoConstruto, Isto, Literal, Logico, Super, TipoDe, Tupla, Unario, Variavel, Vetor } from "../construtos";
 import { Classe, Const, ConstMultiplo, Expressao, FuncaoDeclaracao, Enquanto, Escolha, Escreva, Fazer, Importar, Para, ParaCada, Se, Tente, Var, VarMultiplo, Bloco, Continua, EscrevaMesmaLinha, Leia, LeiaMultiplo, Retorna, Sustar, Declaracao, Falhar, Aleatorio, CabecalhoPrograma } from "../declaracoes";
+import { InicioAlgoritmo } from "../declaracoes/inicio-algoritmo";
 import { VisitanteComumInterface } from "../interfaces";
 import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from "../quebras";
 
@@ -21,6 +22,10 @@ export class FormatadorPortugolStudio implements VisitanteComumInterface {
         this.deveIndentar = true;
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error("Método não implementado.");
     }
diff --git a/fontes/formatadores/formatador-visualg.ts b/fontes/formatadores/formatador-visualg.ts
index 2d553dde..426a23f3 100644
--- a/fontes/formatadores/formatador-visualg.ts
+++ b/fontes/formatadores/formatador-visualg.ts
@@ -52,6 +52,7 @@ import {
     Falhar,
     CabecalhoPrograma,
 } from '../declaracoes';
+import { InicioAlgoritmo } from '../declaracoes/inicio-algoritmo';
 import { SimboloInterface, VisitanteComumInterface } from '../interfaces';
 import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
 import tiposDeSimbolos from '../tipos-de-simbolos/visualg';
@@ -64,7 +65,6 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
     devePularLinha: boolean;
     deveIndentar: boolean;
     contadorDeclaracaoVar: number;
-    deveAdicionarInicio: boolean;
     retornoFuncaoAtual: SimboloInterface;
 
     constructor(quebraLinha: string, tamanhoIndentacao: number = 4) {
@@ -76,10 +76,13 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
         this.devePularLinha = false;
         this.deveIndentar = true;
         this.contadorDeclaracaoVar = 0;
-        this.deveAdicionarInicio = true;
         this.retornoFuncaoAtual = undefined;
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): any {
+        this.codigoFormatado += `inicio${this.quebraLinha}`;
+    }
+
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): any {
         this.codigoFormatado += `algoritmo "${declaracao.nomeProgramaAlgoritmo}"${this.quebraLinha}`;
     }
@@ -613,6 +616,9 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
             case 'Importar':
                 this.visitarDeclaracaoImportar(declaracaoOuConstruto as Importar);
                 break;
+            case 'InicioAlgoritmo':
+                this.visitarDeclaracaoInicioAlgoritmo(declaracaoOuConstruto as InicioAlgoritmo);
+                break;
             case 'Isto':
                 this.visitarExpressaoIsto(declaracaoOuConstruto as Isto);
                 break;
@@ -692,11 +698,6 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
         this.indentacaoAtual += this.tamanhoIndentacao;
 
         for (let declaracao of declaracoes) {
-            if (!(declaracao instanceof Var) && this.deveAdicionarInicio) {
-                this.codigoFormatado += `${this.quebraLinha}inicio${this.quebraLinha}`;
-                this.deveAdicionarInicio = false;
-            } else if (declaracao instanceof Var) this.deveAdicionarInicio = true;
-
             this.formatarDeclaracaoOuConstruto(declaracao);
         }
 
diff --git a/fontes/interfaces/visitante-comum-interface.ts b/fontes/interfaces/visitante-comum-interface.ts
index 52bbbe58..2ddd2f6d 100644
--- a/fontes/interfaces/visitante-comum-interface.ts
+++ b/fontes/interfaces/visitante-comum-interface.ts
@@ -29,8 +29,10 @@ import { FormatacaoEscrita } from '../construtos/formatacao-escrita';
 import { LeiaMultiplo } from '../declaracoes/leia-multiplo';
 import { ConstMultiplo } from '../declaracoes/const-multiplo';
 import { VarMultiplo } from '../declaracoes/var-multiplo';
+import { InicioAlgoritmo } from '../declaracoes/inicio-algoritmo';
 
 export interface VisitanteComumInterface {
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any>;
     visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>;
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any>;
     visitarDeclaracaoClasse(declaracao: Classe): any;
diff --git a/fontes/interpretador/dialetos/birl/interpretador-birl-com-depuracao.ts b/fontes/interpretador/dialetos/birl/interpretador-birl-com-depuracao.ts
index 115b7204..24e4a44a 100644
--- a/fontes/interpretador/dialetos/birl/interpretador-birl-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/birl/interpretador-birl-com-depuracao.ts
@@ -22,9 +22,11 @@ export class InterpretadorBirlComDepuracao extends InterpretadorComDepuracao imp
     async resolveQuantidadeDeInterpolacoes(expressao: Literal): Promise<RegExpMatchArray> {
         return comum.resolveQuantidadeDeInterpolacoes(expressao);
     }
+
     async verificaTipoDaInterpolação(dados: { tipo: string; valor: any }): Promise<boolean> {
         return comum.verificaTipoDaInterpolação(dados);
     }
+    
     async substituirValor(stringOriginal: string, novoValor: any, simboloTipo: string): Promise<string> {
         return comum.substituirValor(stringOriginal, novoValor, simboloTipo);
     }
diff --git a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
index 71665d7f..90972f74 100644
--- a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
+++ b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
@@ -59,6 +59,7 @@ import tiposDeSimbolos from '../../../tipos-de-simbolos/egua-classico';
 import carregarBibliotecaGlobal from '../../../bibliotecas/dialetos/egua-classico/biblioteca-global';
 import { ResolvedorEguaClassico } from './resolvedor/resolvedor';
 import { ArgumentoInterface } from '../../argumento-interface';
+import { InicioAlgoritmo } from '../../../declaracoes/inicio-algoritmo';
 
 /**
  * O Interpretador visita todos os elementos complexos gerados pelo analisador sintático (Parser)
@@ -100,20 +101,27 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {
 
         carregarBibliotecaGlobal(this, this.pilhaEscoposExecucao);
     }
+
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
     
-    async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error('Método não implementado.');
     }
 
     visitarExpressaoTupla(expressao: Tupla): Promise<any> {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAcessoElementoMatriz(expressao: any) {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: any): Promise<any> {
         throw new Error('Método não implementado.');
     }
+    
     visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
index 1e449230..c7d31bf4 100644
--- a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
+++ b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
@@ -15,6 +15,7 @@ import {
     Var,
     VarMultiplo,
 } from '../../../../declaracoes';
+import { InicioAlgoritmo } from '../../../../declaracoes/inicio-algoritmo';
 import { EspacoVariaveis } from '../../../../espaco-variaveis';
 import { InterpretadorInterface, SimboloInterface } from '../../../../interfaces';
 import { PilhaEscoposExecucaoInterface } from '../../../../interfaces/pilha-escopos-execucao-interface';
@@ -78,6 +79,10 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
         this.cicloAtual = TipoClasse.NENHUM;
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error('Método não implementado.');
     }
@@ -85,9 +90,11 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
     visitarExpressaoTupla(expressao: Tupla): Promise<any> {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAcessoElementoMatriz(expressao: any) {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: any): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
index 13f8d209..76ad61e7 100644
--- a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
+++ b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
@@ -40,6 +40,7 @@ import { PilhaEscoposExecucao } from '../../pilha-escopos-execucao';
 
 import tiposDeSimbolos from '../../../tipos-de-simbolos/portugol-ipt';
 import { inferirTipoVariavel } from '../../inferenciador';
+import { InicioAlgoritmo } from '../../../declaracoes/inicio-algoritmo';
 
 export class InterpretadorPortugolIpt implements InterpretadorInterface {
     diretorioBase: any;
@@ -76,6 +77,10 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
         this.pilhaEscoposExecucao.empilhar(escopoExecucao);
     }
 
+    visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error('Método não implementado.');
     }
@@ -83,12 +88,15 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
     visitarExpressaoTupla(expressao: Tupla): Promise<any> {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAcessoElementoMatriz(expressao: any) {
         throw new Error('Método não implementado.');
     }
+
     visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: any): Promise<any> {
         throw new Error('Método não implementado.');
     }
+    
     visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/dialetos/visualg/comum.ts b/fontes/interpretador/dialetos/visualg/comum.ts
index 338eac4c..6ad6c389 100644
--- a/fontes/interpretador/dialetos/visualg/comum.ts
+++ b/fontes/interpretador/dialetos/visualg/comum.ts
@@ -18,11 +18,16 @@ import { inferirTipoVariavel } from '../../inferenciador';
 import tiposDeSimbolos from '../../../tipos-de-simbolos/visualg';
 import { ErroEmTempoDeExecucao } from '../../../excecoes';
 import { InterpretadorBase } from '../../interpretador-base';
+import { InicioAlgoritmo } from '../../../declaracoes/inicio-algoritmo';
 
 export async function visitarDeclaracaoCabecalhoPrograma(interpretador: InterpretadorBase, declaracao: CabecalhoPrograma): Promise<any> {
     return Promise.resolve();
 }
 
+export async function visitarDeclaracaoInicioAlgoritmo(interpretador: InterpretadorBase, declaracao: InicioAlgoritmo): Promise<any> {
+    return Promise.resolve();
+}
+
 export async function atribuirVariavel(
     interpretador: InterpretadorBase,
     expressao: Construto,
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
index 7f06c3fa..e61b45d0 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
@@ -24,6 +24,10 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoInicioAlgoritmo(declaracao: CabecalhoPrograma): Promise<any> {
+        return comum.visitarDeclaracaoInicioAlgoritmo(this, declaracao);
+    }
+
     async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
     }
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
index 0f98d1ac..9db42b09 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
@@ -28,6 +28,10 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoInicioAlgoritmo(declaracao: CabecalhoPrograma): Promise<any> {
+        return comum.visitarDeclaracaoInicioAlgoritmo(this, declaracao);
+    }
+
     async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
     }
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index e88528e7..a52ec806 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -84,6 +84,7 @@ import primitivasVetor from '../bibliotecas/primitivas-vetor';
 import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
 import tipoDeDadosPrimitivos from '../tipos-de-dados/primitivos';
 import tipoDeDadosDelegua from '../tipos-de-dados/delegua';
+import { InicioAlgoritmo } from '../declaracoes/inicio-algoritmo';
 
 /**
  * O Interpretador visita todos os elementos complexos gerados pelo avaliador sintático (_parser_),
@@ -162,11 +163,15 @@ export class InterpretadorBase implements InterpretadorInterface {
         carregarBibliotecasGlobais(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
         throw new Error('Método não implementado.');
     }
 
-    async visitarExpressaoTupla(expressao: any): Promise<any> {
+    async visitarExpressaoTupla(expressao: Tupla): Promise<any> {
         const chaves = Object.keys(expressao)
         const valores = [];
         for (let chave of chaves) {
@@ -207,11 +212,11 @@ export class InterpretadorBase implements InterpretadorInterface {
 
         if (
             tipoDe instanceof Binario ||
+            tipoDe instanceof Chamada ||
             tipoDe instanceof TipoDe ||
             tipoDe instanceof Unario ||
             tipoDe instanceof Variavel ||
-            tipoDe instanceof Agrupamento ||
-            tipoDe instanceof Chamada
+            tipoDe instanceof Agrupamento
         ) {
             tipoDe = await this.avaliar(tipoDe);
             return tipoDe.tipo || inferirTipoVariavel(tipoDe);
@@ -650,6 +655,24 @@ export class InterpretadorBase implements InterpretadorInterface {
 
             if (entidadeChamada instanceof MetodoPrimitiva) {
                 const argumentosResolvidos: any[] = [];
+
+                if (expressao instanceof Chamada) {
+                    if (expressao.entidadeChamada instanceof AcessoMetodoOuPropriedade) {
+                        if (expressao.entidadeChamada.objeto instanceof Variavel) {
+                            let eTupla = this.procurarVariavel(expressao.entidadeChamada.objeto.simbolo)
+                            if (eTupla.subtipo === tipoDeDadosDelegua.TUPLA) {
+                                return Promise.reject(
+                                    new ErroEmTempoDeExecucao(
+                                        expressao.entidadeChamada.objeto.simbolo,
+                                        'Tupla é imutável, seus elementos não podem ser alterados, adicionados ou removidos.',
+                                        expressao.linha
+                                    )
+                                );
+                            }
+                        }
+                    }
+                }
+
                 for (const argumento of expressao.argumentos) {
                     const valorResolvido: any = await this.avaliar(argumento);
                     argumentosResolvidos.push(
@@ -1206,7 +1229,7 @@ export class InterpretadorBase implements InterpretadorInterface {
         let indice = promises[1];
         const valor = promises[2];
 
-        if (objeto.imutavel) {
+        if (objeto.subtipo === tipoDeDadosDelegua.TUPLA) {
             return Promise.reject(
                 new ErroEmTempoDeExecucao(
                     expressao.objeto.simbolo.lexema,
@@ -1547,9 +1570,8 @@ export class InterpretadorBase implements InterpretadorInterface {
         if (declaracao.tipo !== undefined && declaracao.tipo !== null) {
             subtipo = declaracao.tipo;
         }
-        
-        const eTupla = declaracao.inicializador instanceof Tupla;
 
+        let eTupla = declaracao.tipo === tipoDeDadosDelegua.TUPLA;
         this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, subtipo, eTupla);
 
         return null;
diff --git a/fontes/interpretador/pilha-escopos-execucao.ts b/fontes/interpretador/pilha-escopos-execucao.ts
index bf357202..ba05ed5c 100644
--- a/fontes/interpretador/pilha-escopos-execucao.ts
+++ b/fontes/interpretador/pilha-escopos-execucao.ts
@@ -91,7 +91,7 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
             valor: this.converterValor(tipo, valor),
             tipo: tipo,
             subtipo: undefined,
-            imutavel: imutavel,
+            imutavel,
         };
 
         if (subtipo !== undefined) {
diff --git a/fontes/tipos-de-dados/delegua.ts b/fontes/tipos-de-dados/delegua.ts
index ed9942cb..05a16f47 100644
--- a/fontes/tipos-de-dados/delegua.ts
+++ b/fontes/tipos-de-dados/delegua.ts
@@ -8,6 +8,10 @@ export default {
     NÚMERO: 'número',
     NULO: 'nulo',
     OBJETO: 'objeto',
+    QUALQUER: 'qualquer',
+    REAL: 'real',
     TEXTO: 'texto',
+    TUPLA: 'tupla',
+    VAZIO: 'vazio',
     VETOR: 'vetor'
 };
\ No newline at end of file
diff --git a/fontes/tradutores/tradutor-reverso-visualg.ts b/fontes/tradutores/tradutor-reverso-visualg.ts
index 3d630d26..9a6e4fde 100644
--- a/fontes/tradutores/tradutor-reverso-visualg.ts
+++ b/fontes/tradutores/tradutor-reverso-visualg.ts
@@ -288,6 +288,7 @@ export class TradutorReversoVisuAlg {
         Escreva: this.traduzirDeclaracaoEscreva.bind(this),
         Expressao: this.traduzirDeclaracaoExpressao.bind(this),
         FimPara: this.traduzirDeclaracaoFimPara.bind(this),
+        InicioAlgoritmo: () => "",
         Leia: this.traduzirDeclaracaoLeia.bind(this),
         Para: this.traduzirDeclaracaoPara.bind(this),
         Se: this.traduzirDeclaracaoSe.bind(this),
diff --git a/package.json b/package.json
index 9798f358..25485fa6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@designliquido/delegua",
-    "version": "0.32.1",
+    "version": "0.32.2",
     "description": "Linguagem de programação simples e moderna usando português estruturado, com suporte a múltiplos dialetos",
     "main": "index.js",
     "scripts": {


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 9321efbb..f53bc3c2 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -1627,7 +1627,7 @@ describe('Interpretador', () => {
                     );
                 });
 
-                it('Tupla - Dupla', async () => {
+                it('Tupla Dupla - Atribuição por indice', async () => {
                     const retornoLexador = lexador.mapear([
                         "var t = [(1, 2)]",
                         "t[0] = 3",
@@ -1640,6 +1640,20 @@ describe('Interpretador', () => {
                         'Não é possível modificar uma tupla. As tuplas são estruturas de dados imutáveis.'
                     );
                 });
+
+                it('Tupla Dupla - Primitiva adicionar()', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "var t = [(1, 2)]",
+                        "t.adicionar(3)"
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros[0].erroInterno.mensagem).toBe(
+                        'Tupla é imutável, seus elementos não podem ser alterados, adicionados ou removidos.'
+                    );
+                });
             })
         });
     });
diff --git a/testes/visualg/avaliador-sintatico.test.ts b/testes/visualg/avaliador-sintatico.test.ts
index 435d84c7..5af78f3c 100644
--- a/testes/visualg/avaliador-sintatico.test.ts
+++ b/testes/visualg/avaliador-sintatico.test.ts
@@ -20,7 +20,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(2);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
             });
 
             it('Sucesso - Atribuição', () => {
@@ -42,7 +42,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
                 expect(retornoAvaliadorSintatico.erros).toHaveLength(0);
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(7);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(8);
             });
 
             it('Sucesso - Enquanto', () => {
@@ -63,7 +63,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(5);
             });
 
             it('Sucesso - Escolha', () => {
@@ -117,7 +117,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(9);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(10);
             });
 
             it('Sucesso - Interrompa', () => {
@@ -141,7 +141,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(5);
             });
 
             it('Sucesso - Leia', () => {
@@ -180,7 +180,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
 
             it('Sucesso - Para (usando seta de ateribuiÇão)', () => {
@@ -199,7 +199,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
 
             it('Sucesso - Procedimento', () => {
@@ -228,7 +228,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(7);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(8);
             });
 
             it('Sucesso - Repita', () => {
@@ -249,7 +249,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(5);
             });
 
             it('Sucesso - Xou', () => {
@@ -282,7 +282,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(23);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(24);
             });
 
             it('Sucesso - Aleatorio - Números', () => {
@@ -302,7 +302,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
                 const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                 expect(retornoAvaliadorSintatico).toBeTruthy();
-                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
         });
 
diff --git a/testes/visualg/formatador-visualg.test.ts b/testes/visualg/formatador-visualg.test.ts
index a15671a0..f1f19c72 100644
--- a/testes/visualg/formatador-visualg.test.ts
+++ b/testes/visualg/formatador-visualg.test.ts
@@ -22,7 +22,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(6)
+        expect(linhasResultado).toHaveLength(5)
     })
 
     it('Lendo variaveis', () => {
@@ -45,7 +45,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(13)
+        expect(linhasResultado).toHaveLength(12)
     })
 
     it('Atribuição', () => {
@@ -68,7 +68,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
 
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
-        expect(linhasResultado).toHaveLength(11)
+        expect(linhasResultado).toHaveLength(10)
     })
 
     it('Enquanto', () => {
@@ -91,7 +91,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
 
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
-        expect(linhasResultado).toHaveLength(10)
+        expect(linhasResultado).toHaveLength(9)
     })
 
     it('Escolha', () => {
@@ -118,7 +118,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
 
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
-        expect(linhasResultado).toHaveLength(16)
+        expect(linhasResultado).toHaveLength(15)
     });
 
     it('Função', () => {
@@ -149,7 +149,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes);
 
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
-        expect(linhasResultado).toHaveLength(22)
+        expect(linhasResultado).toHaveLength(21)
     });
 
     it('Interrompa', () => {
@@ -174,9 +174,9 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(13)
+        expect(linhasResultado).toHaveLength(12)
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(5);
     });
 
     it('Leia', () => {
@@ -203,7 +203,7 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(12)
+        expect(linhasResultado).toHaveLength(11)
 
         expect(retornoAvaliadorSintatico).toBeTruthy();
         expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
@@ -226,9 +226,9 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(9)
+        expect(linhasResultado).toHaveLength(8)
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
     });
 
     /* it('Procedimento', () => {
@@ -282,9 +282,9 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(10);
+        expect(linhasResultado).toHaveLength(9);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(5);
     });
 
     it('XOU', () => {
@@ -317,9 +317,9 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(29);
+        expect(linhasResultado).toHaveLength(28);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(23);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(24);
     });
 
     it('Sucesso - Aleatorio - Números', () => {
@@ -342,8 +342,8 @@ describe('Formatadores > VisualG', () => {
         const resultado = formatadorVisuAlg.formatar(retornoAvaliadorSintatico.declaracoes)
         const linhasResultado = resultado.split(sistemaOperacional.EOL)
 
-        expect(linhasResultado).toHaveLength(8);
+        expect(linhasResultado).toHaveLength(7);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
     });
 });
\ No newline at end of file