Repository: DesignLiquido/delegua
Pull request #632 (2024-02-07 18:24:03)

Declaração `InicioAlgoritmo` para formatador do VisuAlg.


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/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/estruturas/delegua-funcao.ts b/fontes/estruturas/delegua-funcao.ts
index 79b253d7..dc23cb67 100644
--- a/fontes/estruturas/delegua-funcao.ts
+++ b/fontes/estruturas/delegua-funcao.ts
@@ -8,7 +8,6 @@ import { FuncaoConstruto } from '../construtos';
 import { ArgumentoInterface } from '../interpretador/argumento-interface';
 import { PilhaEscoposExecucaoInterface } from '../interfaces/pilha-escopos-execucao-interface';
 import { inferirTipoVariavel } from '../interpretador/inferenciador';
-import { Retorna } from '../declaracoes';
 
 /**
  * Qualquer função declarada em código é uma DeleguaFuncao.
@@ -38,33 +37,7 @@ export class DeleguaFuncao extends Chamavel {
 
     paraTexto(): string {
         if (this.nome === null) return '<função>';
-        let resultado = `<função ${this.nome}`;
-        let parametros = '';
-        let retorno = '';
-
-        for (let parametro of this.declaracao.parametros) {
-            parametros += `${parametro.nome.lexema}${
-                parametro.tipoDado && parametro.tipoDado.tipo ? `: ${parametro.tipoDado.tipo}, ` : ', '
-            }`
-        }
-        if (this.declaracao.parametros.length > 0) {
-            parametros = `argumentos=<${parametros.slice(0, -2)}>`;
-        }
-
-        const retorna = this.declaracao.corpo.filter(c => c instanceof Retorna)[0];
-        if (retorna instanceof Retorna) {
-            const valor = retorna?.valor?.valor;
-            retorno = `retorna=<${typeof valor === 'number' ? valor : `'${valor}'`}>`
-        }
-
-        if (parametros) {
-            resultado += ` ${parametros}`
-        }
-        if (retorno) {
-            resultado += ` ${retorno}`
-        }
-        resultado += '>'
-        return resultado;
+        return `<função ${this.nome}>`;
     }
 
     async chamar(visitante: VisitanteComumInterface, argumentos: Array<ArgumentoInterface>): Promise<any> {
diff --git a/fontes/estruturas/objeto-delegua-classe.ts b/fontes/estruturas/objeto-delegua-classe.ts
index 42cdb2c4..306ea3ba 100644
--- a/fontes/estruturas/objeto-delegua-classe.ts
+++ b/fontes/estruturas/objeto-delegua-classe.ts
@@ -44,7 +44,7 @@ export class ObjetoDeleguaClasse {
         this.propriedades[simbolo.lexema] = valor;
     }
 
-    paraTexto(): string {
+    toString(): string {
         return '<Objeto ' + this.classe.simboloOriginal.lexema + '>';
     }
 }
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..9a90b68b 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,6 +163,10 @@ 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.');
     }
@@ -1591,9 +1596,8 @@ export class InterpretadorBase implements InterpretadorInterface {
 
         if (Array.isArray(objeto)) return objeto;
         if (objeto.valor instanceof ObjetoPadrao) return objeto.valor.paraTexto();
-        if (objeto instanceof ObjetoDeleguaClasse 
-            || objeto instanceof DeleguaFuncao) 
-            return objeto.paraTexto();
+        // TODO: Idealmente isso deveria devolver um texto estruturado representando o objeto.
+        if (objeto instanceof ObjetoDeleguaClasse) return objeto.toString();
         if (typeof objeto === tipoDeDadosPrimitivos.OBJETO) return JSON.stringify(objeto);
 
         return objeto.toString();
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),


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 9321efbb..35d46f30 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -15,82 +15,6 @@ describe('Interpretador', () => {
         });
 
         describe('Cenários de sucesso', () => {
-
-            describe('Descrever objetos - paraTexto()', () => {
-                it('Descrever função com parametros e tipos - DeleguaFuncao', async () => {
-                    let _saida: string = ""
-                    const retornoLexador = lexador.mapear([
-                        "funcao retorneAlgo(a: inteiro, b: texto) {",
-                        "}",
-                        "escreva(retorneAlgo)"
-                    ], -1);
-                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
-    
-                    interpretador.funcaoDeRetorno = (saida: any) => {
-                        _saida = saida;
-                    }
-    
-                    await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
-    
-                    expect(_saida).toBe("<função retorneAlgo argumentos=<a: inteiro, b: texto>>");
-                });
-
-                it('Descrever função com parametros sem tipos - DeleguaFuncao', async () => {
-                    let _saida: string = ""
-                    const retornoLexador = lexador.mapear([
-                        "funcao retorneAlgo(a, b) {",
-                        "}",
-                        "escreva(retorneAlgo)"
-                    ], -1);
-                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
-    
-                    interpretador.funcaoDeRetorno = (saida: any) => {
-                        _saida = saida;
-                    }
-    
-                    await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
-    
-                    expect(_saida).toBe("<função retorneAlgo argumentos=<a, b>>");
-                });
-
-                it('Descrever função com retorno - DeleguaFuncao', async () => {
-                    let _saida: string = ""
-                    const retornoLexador = lexador.mapear([
-                        "funcao retorneAlgo() {",
-                        "   retorna \"Algo\"",
-                        "}",
-                        "escreva(retorneAlgo)"
-                    ], -1);
-                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
-    
-                    interpretador.funcaoDeRetorno = (saida: any) => {
-                        _saida = saida;
-                    }
-    
-                    await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
-    
-                    expect(_saida).toBe("<função retorneAlgo retorna=<'Algo'>>");
-                });
-
-                it('Descrever nome função - DeleguaFuncao', async () => {
-                    let _saida: string = ""
-                    const retornoLexador = lexador.mapear([
-                        "funcao retorneAlgo() {",
-                        "}",
-                        "escreva(retorneAlgo)"
-                    ], -1);
-                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
-    
-                    interpretador.funcaoDeRetorno = (saida: any) => {
-                        _saida = saida;
-                    }
-    
-                    await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
-    
-                    expect(_saida).toBe("<função retorneAlgo>");
-                });
-            })
-
             describe('Atribuições', () => {
                 it('Trivial var/variavel', async () => {
                     const retornoLexador = lexador.mapear([
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