Repository: DesignLiquido/delegua
Pull request #628 (2024-02-06 22:57:02)

Construto de cabeçalho de programa para o VisuAlg
Só é útil para a formatação, mas evita o problema do `algoritmo ""`.


Patch:
diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts
index 29f699e9..d47129aa 100644
--- a/fontes/analisador-semantico/analisador-semantico.ts
+++ b/fontes/analisador-semantico/analisador-semantico.ts
@@ -2,6 +2,7 @@ import { Agrupamento, Atribuir, Binario, Chamada, Construto, ExpressaoRegular, F
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -60,6 +61,11 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
         this.atual = 0;
         this.diagnosticos = [];
     }
+
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return Promise.resolve();
+    }
+
     visitarExpressaoTupla(expressao: Tupla): Promise<any> {
         return Promise.resolve();
     }
diff --git a/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts b/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
index 14b24d52..b309a125 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-birl.ts
@@ -2,6 +2,7 @@ import { Atribuir, ExpressaoRegular, FimPara, FormatacaoEscrita, Literal, Super,
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -61,6 +62,11 @@ export class AnalisadorSemanticoBirl implements AnalisadorSemanticoInterface {
         this.atual = 0;
         this.diagnosticos = [];
     }
+    
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return Promise.resolve();
+    }
+
     visitarExpressaoTupla(expressao: Tupla): 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 23f9034c..e2dfbb28 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-mapler.ts
@@ -2,6 +2,7 @@ import { Atribuir, Binario, Chamada, Construto, ExpressaoRegular, FimPara, Forma
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -50,6 +51,11 @@ export class AnalisadorSemanticoMapler implements AnalisadorSemanticoInterface {
         this.atual = 0;
         this.diagnosticos = [];
     }
+    
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return Promise.resolve();
+    }
+
     visitarExpressaoTupla(expressao: Tupla): 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 288e87ab..73d7e50d 100644
--- a/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts
+++ b/fontes/analisador-semantico/dialetos/analisador-semantico-visualg.ts
@@ -2,6 +2,7 @@ import { Atribuir, Chamada, ExpressaoRegular, FimPara, FormatacaoEscrita, Funcao
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -50,6 +51,11 @@ export class AnalisadorSemanticoVisuAlg implements AnalisadorSemanticoInterface
         this.atual = 0;
         this.diagnosticos = [];
     }
+    
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return Promise.resolve();
+    }
+
     visitarExpressaoTupla(expressao: Tupla): 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 b8f4c169..32986c45 100644
--- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
@@ -3,6 +3,7 @@ import { AvaliadorSintaticoBase } from '../../avaliador-sintatico-base';
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Declaracao,
     Enquanto,
     Escolha,
@@ -59,12 +60,14 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
         this.blocoPrincipalIniciado = false;
     }
 
-    private validarSegmentoAlgoritmo(): void {
+    private validarSegmentoAlgoritmo(): SimboloInterface {
         this.consumir(tiposDeSimbolos.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
 
-        this.consumir(tiposDeSimbolos.CARACTERE, "Esperada cadeia de caracteres após palavra-chave 'algoritmo'.");
+        const descricaoAlgoritmo = this.consumir(tiposDeSimbolos.CARACTERE, "Esperada cadeia de caracteres após palavra-chave 'algoritmo'.");
 
         this.consumir(tiposDeSimbolos.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
+
+        return descricaoAlgoritmo;
     }
 
     private criarVetorNDimensional(dimensoes: number[]) {
@@ -1243,8 +1246,9 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
             this.avancarEDevolverAnterior();
         }
 
-        let declaracoes = [];
-        this.validarSegmentoAlgoritmo();
+        let declaracoes: Declaracao[] = [];
+        const simboloNomeAlgoritmo = this.validarSegmentoAlgoritmo();
+        declaracoes.push(new CabecalhoPrograma(simboloNomeAlgoritmo.linha, simboloNomeAlgoritmo.hashArquivo, simboloNomeAlgoritmo.literal));
 
         while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== tiposDeSimbolos.FIM_ALGORITMO) {
             const declaracao = this.resolverDeclaracaoForaDeBloco();
diff --git a/fontes/declaracoes/cabecalho-programa.ts b/fontes/declaracoes/cabecalho-programa.ts
new file mode 100644
index 00000000..32892d71
--- /dev/null
+++ b/fontes/declaracoes/cabecalho-programa.ts
@@ -0,0 +1,15 @@
+import { VisitanteComumInterface } from "../interfaces";
+import { Declaracao } from "./declaracao";
+
+export class CabecalhoPrograma extends Declaracao {
+    nomeProgramaAlgoritmo: string;
+
+    constructor(linha: number, hashArquivo: number, nomeProgramaAlgoritmo: string) {
+        super(linha, hashArquivo);
+        this.nomeProgramaAlgoritmo = nomeProgramaAlgoritmo;
+    }
+
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
+        return visitante.visitarDeclaracaoCabecalhoPrograma(this);
+    }
+}
\ No newline at end of file
diff --git a/fontes/declaracoes/index.ts b/fontes/declaracoes/index.ts
index a401933e..a4c062c3 100644
--- a/fontes/declaracoes/index.ts
+++ b/fontes/declaracoes/index.ts
@@ -1,4 +1,5 @@
 export * from './bloco';
+export * from './cabecalho-programa';
 export * from './classe';
 export * from './const';
 export * from './const-multiplo';
diff --git a/fontes/formatadores/formatador-delegua.ts b/fontes/formatadores/formatador-delegua.ts
index c6aa614c..56867ca1 100644
--- a/fontes/formatadores/formatador-delegua.ts
+++ b/fontes/formatadores/formatador-delegua.ts
@@ -50,6 +50,7 @@ import {
     Declaracao,
     Falhar,
     Aleatorio,
+    CabecalhoPrograma,
 } from '../declaracoes';
 import { VisitanteComumInterface } from '../interfaces';
 
@@ -77,6 +78,10 @@ export class FormatadorDelegua implements VisitanteComumInterface {
         this.deveIndentar = true;
     }
 
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     visitarExpressaoTupla(expressao: Tupla): any {
         return "";
     }
diff --git a/fontes/formatadores/formatador-portugol-studio.ts b/fontes/formatadores/formatador-portugol-studio.ts
index 6f6f3b51..1121a3b8 100644
--- a/fontes/formatadores/formatador-portugol-studio.ts
+++ b/fontes/formatadores/formatador-portugol-studio.ts
@@ -1,5 +1,5 @@
 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 } from "../declaracoes";
+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 { VisitanteComumInterface } from "../interfaces";
 import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from "../quebras";
 
@@ -20,6 +20,11 @@ export class FormatadorPortugolStudio implements VisitanteComumInterface {
         this.devePularLinha = true;
         this.deveIndentar = true;
     }
+
+    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");
     }
diff --git a/fontes/formatadores/formatador-visualg.ts b/fontes/formatadores/formatador-visualg.ts
index 222b8cf8..2d553dde 100644
--- a/fontes/formatadores/formatador-visualg.ts
+++ b/fontes/formatadores/formatador-visualg.ts
@@ -50,6 +50,7 @@ import {
     Sustar,
     Declaracao,
     Falhar,
+    CabecalhoPrograma,
 } from '../declaracoes';
 import { SimboloInterface, VisitanteComumInterface } from '../interfaces';
 import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
@@ -79,6 +80,10 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
         this.retornoFuncaoAtual = undefined;
     }
 
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): any {
+        this.codigoFormatado += `algoritmo "${declaracao.nomeProgramaAlgoritmo}"${this.quebraLinha}`;
+    }
+
     visitarDeclaracaoAleatorio(declaracao: Aleatorio): any {
         this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}aleatorio `;
         if (declaracao.argumentos.max > 0 && declaracao.argumentos.min > 0) {
@@ -551,6 +556,9 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
             case 'Bloco':
                 this.visitarExpressaoBloco(declaracaoOuConstruto as Bloco);
                 break;
+            case 'CabecalhoPrograma':
+                this.visitarDeclaracaoCabecalhoPrograma(declaracaoOuConstruto as CabecalhoPrograma);
+                break;
             case 'Chamada':
                 this.visitarExpressaoDeChamada(declaracaoOuConstruto as Chamada);
                 break;
@@ -590,6 +598,9 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
             case 'Fazer':
                 this.visitarDeclaracaoFazer(declaracaoOuConstruto as Fazer);
                 break;
+            case 'FimPara':
+                // FimPara só existe com um Para, então não é necessário formatá-lo.
+                break;
             case 'FormatacaoEscrita':
                 this.visitarExpressaoFormatacaoEscrita(declaracaoOuConstruto as FormatacaoEscrita);
                 break;
@@ -675,7 +686,7 @@ export class FormatadorVisuAlg implements VisitanteComumInterface {
 
     formatar(declaracoes: Declaracao[]): string {
         this.indentacaoAtual = 0;
-        this.codigoFormatado = `algoritmo ""${this.quebraLinha}`;
+        this.codigoFormatado = "";
         this.devePularLinha = true;
         this.deveIndentar = true;
         this.indentacaoAtual += this.tamanhoIndentacao;
diff --git a/fontes/interfaces/visitante-comum-interface.ts b/fontes/interfaces/visitante-comum-interface.ts
index 6f75c214..52bbbe58 100644
--- a/fontes/interfaces/visitante-comum-interface.ts
+++ b/fontes/interfaces/visitante-comum-interface.ts
@@ -2,6 +2,7 @@ import { AcessoMetodoOuPropriedade, Atribuir, ExpressaoRegular, FimPara, Literal
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     Continua,
@@ -30,7 +31,8 @@ import { ConstMultiplo } from '../declaracoes/const-multiplo';
 import { VarMultiplo } from '../declaracoes/var-multiplo';
 
 export interface VisitanteComumInterface {
-    visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>
+    visitarDeclaracaoAleatorio(declaracao: Aleatorio): Promise<any>;
+    visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any>;
     visitarDeclaracaoClasse(declaracao: Classe): any;
     visitarDeclaracaoConst(declaracao: Const): Promise<any>;
     visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any>;
diff --git a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
index be785092..71665d7f 100644
--- a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
+++ b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
@@ -23,6 +23,7 @@ import {
 } from '../../../construtos';
 import {
     Aleatorio,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -99,6 +100,11 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {
 
         carregarBibliotecaGlobal(this, this.pilhaEscoposExecucao);
     }
+    
+    async 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.');
     }
diff --git a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
index 7aebfb1e..1e449230 100644
--- a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
+++ b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
@@ -2,6 +2,7 @@ import { AcessoMetodoOuPropriedade, Construto, ExpressaoRegular, FimPara, Format
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Const,
     ConstMultiplo,
     Declaracao,
@@ -76,6 +77,11 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
         this.classeAtual = TipoClasse.NENHUM;
         this.cicloAtual = TipoClasse.NENHUM;
     }
+
+    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.');
     }
diff --git a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
index d468c222..13f8d209 100644
--- a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
+++ b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
@@ -2,6 +2,7 @@ import { Atribuir, Construto, ExpressaoRegular, FimPara, FormatacaoEscrita, Lite
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -74,6 +75,11 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
         };
         this.pilhaEscoposExecucao.empilhar(escopoExecucao);
     }
+
+    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.');
     }
diff --git a/fontes/interpretador/dialetos/visualg/comum.ts b/fontes/interpretador/dialetos/visualg/comum.ts
index a799e331..338eac4c 100644
--- a/fontes/interpretador/dialetos/visualg/comum.ts
+++ b/fontes/interpretador/dialetos/visualg/comum.ts
@@ -10,7 +10,7 @@ import {
     Unario,
     Variavel,
 } from '../../../construtos';
-import { Aleatorio, Declaracao, Expressao, Leia, Para } from '../../../declaracoes';
+import { Aleatorio, CabecalhoPrograma, Declaracao, Expressao, Leia, Para } from '../../../declaracoes';
 import { Simbolo } from '../../../lexador';
 import { SimboloInterface, VariavelInterface } from '../../../interfaces';
 import { inferirTipoVariavel } from '../../inferenciador';
@@ -19,6 +19,10 @@ import tiposDeSimbolos from '../../../tipos-de-simbolos/visualg';
 import { ErroEmTempoDeExecucao } from '../../../excecoes';
 import { InterpretadorBase } from '../../interpretador-base';
 
+export async function visitarDeclaracaoCabecalhoPrograma(interpretador: InterpretadorBase, declaracao: CabecalhoPrograma): 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 2015346d..7f06c3fa 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
@@ -5,7 +5,7 @@ import {
     registrarBibliotecaCaracteresVisuAlg,
 } from '../../../bibliotecas/dialetos/visualg';
 import { AcessoElementoMatriz, AtribuicaoPorIndicesMatriz, Binario, Construto, FimPara, Logico } from '../../../construtos';
-import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const, Para, Bloco, Aleatorio } from '../../../declaracoes';
+import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const, Para, Bloco, Aleatorio, CabecalhoPrograma } from '../../../declaracoes';
 import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
 import { InterpretadorComDepuracao } from '../../interpretador-com-depuracao';
 import * as comum from './comum';
@@ -24,6 +24,10 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
+    }
+
     visitarDeclaracaoConst(declaracao: Const): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
index 3057348d..0f98d1ac 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
@@ -1,5 +1,5 @@
 import { AcessoElementoMatriz, AtribuicaoPorIndicesMatriz, Binario, Construto, FimPara, Logico, Variavel } from '../../../construtos';
-import { Aleatorio, Const, Escreva, EscrevaMesmaLinha, Fazer, Leia, Para } from '../../../declaracoes';
+import { Aleatorio, CabecalhoPrograma, Const, Escreva, EscrevaMesmaLinha, Fazer, Leia, Para } from '../../../declaracoes';
 import { InterpretadorBase } from '../..';
 import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
 import { registrarBibliotecaNumericaVisuAlg } from '../../../bibliotecas/dialetos/visualg/numerica';
@@ -28,6 +28,10 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        return comum.visitarDeclaracaoCabecalhoPrograma(this, declaracao);
+    }
+
     visitarDeclaracaoConst(declaracao: Const): Promise<any> {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index 34344e5b..416ec7e3 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -11,6 +11,7 @@ import { InterpretadorInterface, ParametroInterface, SimboloInterface, VariavelI
 import {
     Aleatorio,
     Bloco,
+    CabecalhoPrograma,
     Classe,
     Const,
     ConstMultiplo,
@@ -161,6 +162,10 @@ export class InterpretadorBase implements InterpretadorInterface {
         carregarBibliotecasGlobais(this, this.pilhaEscoposExecucao);
     }
 
+    async visitarDeclaracaoCabecalhoPrograma(declaracao: CabecalhoPrograma): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     async visitarExpressaoTupla(expressao: any): Promise<any> {
         const chaves = Object.keys(expressao)
         const valores = [];
diff --git a/fontes/tradutores/tradutor-reverso-visualg.ts b/fontes/tradutores/tradutor-reverso-visualg.ts
index 0e2bec80..3d630d26 100644
--- a/fontes/tradutores/tradutor-reverso-visualg.ts
+++ b/fontes/tradutores/tradutor-reverso-visualg.ts
@@ -1,5 +1,5 @@
 import { Agrupamento, Atribuir, Binario, FimPara, Literal, Logico, Variavel } from '../construtos';
-import { Bloco, Declaracao, Expressao, Para, Se, Var } from '../declaracoes';
+import { Bloco, Declaracao, Escreva, Expressao, Para, Se, Var } from '../declaracoes';
 import { SimboloInterface } from '../interfaces';
 
 import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
@@ -258,7 +258,7 @@ export class TradutorReversoVisuAlg {
         return resultado;
     }
 
-    tradzirDeclaracaoEscrevaMesmaLinha(declaracaoEscreva: any): string {
+    traduzirDeclaracaoEscrevaMesmaLinha(declaracaoEscreva: Escreva): string {
         return this.traduzirDeclaracaoEscreva(declaracaoEscreva);
     }
 
@@ -282,7 +282,8 @@ export class TradutorReversoVisuAlg {
 
     dicionarioDeclaracoes = {
         Bloco: this.traduzirDeclaracaoBloco.bind(this),
-        EscrevaMesmaLinha: this.tradzirDeclaracaoEscrevaMesmaLinha.bind(this),
+        CabecalhoPrograma: () => "",
+        EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
         Escolha: this.traduzirDeclaracaoEscolha.bind(this),
         Escreva: this.traduzirDeclaracaoEscreva.bind(this),
         Expressao: this.traduzirDeclaracaoExpressao.bind(this),


Test patch:
diff --git a/testes/visualg/avaliador-sintatico.test.ts b/testes/visualg/avaliador-sintatico.test.ts
index 33211a4a..435d84c7 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(1);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(2);
             });
 
             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(6);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(7);
             });
 
             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(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
 
             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(8);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(9);
             });
 
             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(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
 
             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(2);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
             });
 
             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(2);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
             });
 
             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(6);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(7);
             });
 
             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(3);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
             });
 
             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(22);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(23);
             });
 
             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(2);
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
             });
         });
 
diff --git a/testes/visualg/formatador-visualg.test.ts b/testes/visualg/formatador-visualg.test.ts
index 16d1761f..a15671a0 100644
--- a/testes/visualg/formatador-visualg.test.ts
+++ b/testes/visualg/formatador-visualg.test.ts
@@ -176,7 +176,7 @@ describe('Formatadores > VisualG', () => {
 
         expect(linhasResultado).toHaveLength(13)
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
     });
 
     it('Leia', () => {
@@ -228,7 +228,7 @@ describe('Formatadores > VisualG', () => {
 
         expect(linhasResultado).toHaveLength(9)
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(2);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
     });
 
     /* it('Procedimento', () => {
@@ -284,7 +284,7 @@ describe('Formatadores > VisualG', () => {
 
         expect(linhasResultado).toHaveLength(10);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(4);
     });
 
     it('XOU', () => {
@@ -319,7 +319,7 @@ describe('Formatadores > VisualG', () => {
 
         expect(linhasResultado).toHaveLength(29);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(22);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(23);
     });
 
     it('Sucesso - Aleatorio - Números', () => {
@@ -344,6 +344,6 @@ describe('Formatadores > VisualG', () => {
 
         expect(linhasResultado).toHaveLength(8);
         expect(retornoAvaliadorSintatico).toBeTruthy();
-        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(2);
+        expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
     });
 });
\ No newline at end of file