Repository: DesignLiquido/delegua
Pull request #504 (2023-09-21 20:57:56)

Método global para limpar tela
Resolve: https://github.com/DesignLiquido/delegua/issues/502


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
index d8749ff2..d3f60e6b 100644
--- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
@@ -263,6 +263,10 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
         return this.atual === this.simbolos.length;
     }
 
+    eLimpaTela(): Boolean {
+        return this.simboloAnterior().lexema === 'limpatela';
+    }
+
     metodoBibliotecaGlobal(): Construto {
         const simboloAnterior = this.simbolos[this.atual - 1];
 
@@ -394,10 +398,34 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
         return declaracoes;
     }
 
+    finalizarChamada(entidadeChamada: Construto): Construto {
+        const argumentos: Array<Construto> = [];
+
+        if(this.eLimpaTela()) {
+            return new Chamada(this.hashArquivo, entidadeChamada, null, argumentos);
+        }
+
+        if (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
+            do {
+                if (argumentos.length >= 255) {
+                    throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
+                }
+                argumentos.push(this.expressao());
+            } while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
+        }
+
+        const parenteseDireito = this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
+
+        return new Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
+    }
+
     chamar(): Construto {
         let expressao = this.primario();
 
         while (true) {
+            if(this.eLimpaTela()) {
+                expressao = this.finalizarChamada(expressao);
+            }
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PARENTESE_ESQUERDO)) {
                 expressao = this.finalizarChamada(expressao);
             } else if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_ESQUERDO)) {
diff --git a/fontes/bibliotecas/dialetos/visualg/caracteres.ts b/fontes/bibliotecas/dialetos/visualg/caracteres.ts
index f0d56ef0..5253e72f 100644
--- a/fontes/bibliotecas/dialetos/visualg/caracteres.ts
+++ b/fontes/bibliotecas/dialetos/visualg/caracteres.ts
@@ -53,6 +53,11 @@ export function registrarBibliotecaCaracteresVisuAlg(
         })
     );
 
+    pilhaEscoposExecucao.definirVariavel(
+        'limpatela',
+        new FuncaoPadrao(0, console.clear)
+    );
+
     pilhaEscoposExecucao.definirVariavel(
         'maiusc',
         new FuncaoPadrao(1, function(valor: any) {
diff --git a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
index 347d8231..0483c29c 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
@@ -42,6 +42,7 @@ export const palavrasReservadas = {
     inteiro: tiposDeSimbolos.INTEIRO,
     interrompa: tiposDeSimbolos.INTERROMPA,
     leia: tiposDeSimbolos.LEIA,
+    limpatela: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     log: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     logn: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     logico: tiposDeSimbolos.LOGICO,


Test patch:
diff --git a/testes/visualg/biblioteca-global.test.ts b/testes/visualg/biblioteca-global.test.ts
index 3292b8f4..77d7de1f 100644
--- a/testes/visualg/biblioteca-global.test.ts
+++ b/testes/visualg/biblioteca-global.test.ts
@@ -276,6 +276,11 @@ describe('Biblioteca de caracteres', () => {
             expect(funcaoCopia('Uma cadeia de caracteres', 4, 6)).toBe('cadeia');
         });
 
+        it('limpatela', () => {
+            const limpaTela = funcoes['limpatela'].funcao;
+            expect(limpaTela()).toBe(undefined);
+        });
+
         it('maiusc', () => {
             const funcaoMaiusc = funcoes['maiusc'].funcao;
             expect(funcaoMaiusc('a')).toBe('A');
diff --git a/testes/visualg/interpretador.test.ts b/testes/visualg/interpretador.test.ts
index 1f9ca0df..91426608 100644
--- a/testes/visualg/interpretador.test.ts
+++ b/testes/visualg/interpretador.test.ts
@@ -89,6 +89,27 @@ describe('Interpretador', () => {
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
 
+            it('Sucesso - limpatela', async () => {
+
+                const retornoLexador = lexador.mapear([
+                    'Algoritmo "limpatela"',
+                    'Var',
+                    'Inicio',
+                    '    escreval("Teste 1")',
+                    '    limpatela',
+                    '    escreval("Teste 2")',
+                    '    limpatela',
+                    '    escreval("Teste 3")',
+                    'Fimalgoritmo'
+                ], -1);
+    
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+    
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
+
             it('Sucesso - Leia', async () => {
                 // Aqui vamos simular a resposta para cinco variáveis de `leia()`.
                 const respostas = [1, 2, 3, 4, 5];