Repository: DesignLiquido/delegua
Pull request #500 (2023-09-21 16:01:50)

"Repita Até" com acento - VisuAlg


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
index 411844eb..d8749ff2 100644
--- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
@@ -647,12 +647,14 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
         const declaracoes = [];
         do {
             declaracoes.push(this.resolverDeclaracaoForaDeBloco());
-        } while (![tiposDeSimbolos.ATE].includes(this.simbolos[this.atual].tipo));
+        } while (![tiposDeSimbolos.ATE, tiposDeSimbolos.ATÉ].includes(this.simbolos[this.atual].tipo));
 
-        this.consumir(
-            tiposDeSimbolos.ATE,
-            "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'."
-        );
+        if(!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ATE, tiposDeSimbolos.ATÉ)) {
+            this.consumir(
+                this.simbolos[this.atual].tipo,
+                "Esperado palavra-chave 'ate' ou 'até' após declaração de bloco em instrução 'repita'."
+            );
+        }
 
         const condicao = this.expressao();
 
diff --git a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
index d3991298..347d8231 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
@@ -7,6 +7,7 @@ export const palavrasReservadas = {
     arcsen: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     arctan: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     ate: tiposDeSimbolos.ATE,
+    até: tiposDeSimbolos.ATÉ,
     caracter: tiposDeSimbolos.CARACTER,
     caractere: tiposDeSimbolos.CARACTERE,
     caso: tiposDeSimbolos.CASO,
diff --git a/fontes/tipos-de-simbolos/visualg.ts b/fontes/tipos-de-simbolos/visualg.ts
index f0d39cf1..88163f02 100644
--- a/fontes/tipos-de-simbolos/visualg.ts
+++ b/fontes/tipos-de-simbolos/visualg.ts
@@ -2,6 +2,7 @@ export default {
     ADICAO: 'ADICAO',
     ALGORITMO: 'ALGORITMO',
     ATE: 'ATE',
+    ATÉ: 'ATÉ',
     CARACTER: 'CARACTER',
     CARACTERE: 'CARACTERE',
     CASO: 'CASO',
diff --git a/package.json b/package.json
index 4fd9fbca..dd964cd4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@designliquido/delegua",
-    "version": "0.25.4",
+    "version": "0.25.5",
     "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/visualg/interpretador.test.ts b/testes/visualg/interpretador.test.ts
index 22b4c73d..1f9ca0df 100644
--- a/testes/visualg/interpretador.test.ts
+++ b/testes/visualg/interpretador.test.ts
@@ -163,6 +163,41 @@ describe('Interpretador', () => {
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
 
+            it('Sucesso - "Repita Até" com acento', async () => {
+                const respostas = [0];
+                interpretador.interfaceEntradaSaida = {
+                    question: (mensagem: string, callback: Function) => {
+                        callback(respostas.shift());
+                    }
+                };
+
+                const retornoLexador = lexador.mapear([
+                    'algoritmo "Repita Até"',
+                        'var',
+                        'opcao: inteiro',
+                    'inicio',
+                        'repita',
+                            'escreval("1 - Dizer olá!")',
+                            'escreval("2 – Dizer oi! ")',
+                            'escreval("0 - Sair do programa")',
+                            'leia(opcao)',
+                            'se (opcao = 1) entao',
+                                'escreval("Olá!")',
+                            'fimse',
+                            'se (opcao = 2) entao',
+                                'escreval("Oi!")',
+                            'fimse',
+                        'até (opcao = 0)',
+                    'fimalgoritmo'
+                ], -1);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
+
             it('Sucesso - IMC', async () => {
                 // Aqui vamos simular a resposta para duas variáveis de `leia()`.
                 const respostas = [78, 1.78];