Repository: DesignLiquido/delegua
Pull request #331 (2023-04-24 14:14:33)

While/birl

github-actions[bot]: <!-- jest coverage report action for options with hash 781087021f8e6c43aac1e668f4520603 -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage                                                     | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :------------------------------------------------------------- | :-------------: |
|                                                                           🟡                                                                           | Statements | <div title="Base coverage is: 73.66%">73.7% (+0.04% 🔼)</div>  |    5391/7315    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 62.12%">62.16% (+0.04% 🔼)</div> |    1682/2706    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 74.67%">74.72% (+0.05% 🔼)</div> |     795/1064    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 74.11%">74.15% (+0.04% 🔼)</div> |    5246/7075    |


## Test suite run success
389 tests passing in 35 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from aa8c1f45a2b939b972dc466e81ddafdac470cd24</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
index 3fd70827..f567733a 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
@@ -182,7 +182,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
         return new Expressao(expressao);
     }
 
-    declaracaoPara(): any {
+    declaracaoPara(): Para {
         const primeiroSimbolo = this.consumir(
             tiposDeSimbolos.MAIS,
             'Esperado expressão `MAIS` para iniciar o bloco `PARA`.'
@@ -516,6 +516,30 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
         throw new Error('Método não implementado.');
     }
 
+    declacacaoEnquanto(): Enquanto {
+        const simboloEnquanto: SimboloInterface = this.consumir(
+            tiposDeSimbolos.NEGATIVA,
+            'Esperado expressão `NEGATIVA`.'
+        );
+        this.consumir(tiposDeSimbolos.BAMBAM, 'Esperado expressão `BAMBAM` após `NEGATIVA`.');
+        this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `BAMBAM`.');
+        const condicao = this.declaracao(); // E para ser um binario.
+        this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, 'Esperado parêntese direito após expressão de condição.');
+        const declaracoes = [];
+        while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.BIRL)) {
+            declaracoes.push(this.declaracao());
+        }
+
+        return new Enquanto(
+            condicao,
+            new Bloco(
+                simboloEnquanto.hashArquivo,
+                Number(simboloEnquanto.linha),
+                declaracoes.filter((d) => d)
+            )
+        );
+    }
+
     declaracao(): any {
         const simboloAtual = this.simbolos[this.atual];
         switch (simboloAtual.tipo) {
@@ -526,7 +550,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             case tiposDeSimbolos.ELE:
                 return this.declaracaoSe();
             case tiposDeSimbolos.NEGATIVA:
-            // Retornar uma declaração de WHILE
+                return this.declacacaoEnquanto();
             case tiposDeSimbolos.MAIS:
                 return this.declaracaoPara();
             // Declaração de inteiros


Test patch:
diff --git a/testes/birl/avaliador-sintatico.test.ts b/testes/birl/avaliador-sintatico.test.ts
index ae978556..04a250be 100644
--- a/testes/birl/avaliador-sintatico.test.ts
+++ b/testes/birl/avaliador-sintatico.test.ts
@@ -1,6 +1,7 @@
 import { AvaliadorSintaticoBirl } from '../../fontes/avaliador-sintatico/dialetos';
-import { Para, Se } from '../../fontes/declaracoes';
+import { Enquanto, Para, Se } from '../../fontes/declaracoes';
 import { LexadorBirl } from '../../fontes/lexador/dialetos';
+import { RetornoLexador } from '../../fontes/interfaces/retornos/retorno-lexador';
 
 describe('Avaliador Sintático Birl', () => {
     describe('analisar()', () => {
@@ -216,6 +217,23 @@ describe('Avaliador Sintático Birl', () => {
                 expect(retornoAvaliadorSintatico.declaracoes[1].assinaturaMetodo).toBe('<principal>');
                 expect(retornoAvaliadorSintatico.declaracoes[1]).toBeInstanceOf(Para);
             });
+            it('Sucesso - declaração - while', () => {
+                const RetornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MONSTRO X = 5;\n',
+                    '   NEGATIVA BAMBAM (X > 2)',
+                    '       CE QUER VER ESSA PORRA? ("teste");\n',
+                    '       X--;\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                const RetornoAvaliadorSintatico = avaliadorSintatico.analisar(RetornoLexador, -1);
+                expect(RetornoAvaliadorSintatico).toBeTruthy();
+                expect(RetornoAvaliadorSintatico.declaracoes).toHaveLength(2);
+                expect(RetornoAvaliadorSintatico.declaracoes[1].assinaturaMetodo).toBe('<principal>');
+                expect(RetornoAvaliadorSintatico.declaracoes[1]).toBeInstanceOf(Enquanto);
+            })
         });
     });
 });