Repository: DesignLiquido/delegua
Pull request #291 (2023-03-06 13:13:40)

Birl
Implementando novas tipagem de birl como *MONSTRAO*, *MONSTRINHO* e *TRAPEZIO DESCENDENTE*.

Embora esses tipos representem respectivamente *long int*, *short int* e *double* eles não são utilizados por baixo dos panos.

Exemplos as 3 variações de inteiro tem o mesmo tratamento e todos são um int de 8 bytes (64 bits).

ItaloCobains: @leonelsanchesdasilva ainda não de merge dessa PR vou fazer novas implementações em breve.
github-actions[bot]: <!-- jest coverage report action for options with hash 825fd481788efa7282e8569b20438413 -->

## 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: 75.35%">72.67% (-2.67% 🔻)</div> |    4396/6049    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 63.43%">61.21% (-2.22% 🔻)</div> |    1351/2207    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 76.32%">72.92% (-3.4% 🔻)</div>  |     641/879     |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 75.78%">72.98% (-2.81% 🔻)</div> |    4248/5821    |


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                                                                                  | Statements                                                     | Branches                                                       | Functions                                                      | Lines                                                          |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- |
|                                                                           🟢                                                                           | lexador/lexador.ts                                                                                                                    | <div title="Base coverage is: 97.83%">96.04% (-1.79% 🔻)</div> | <div title="Base coverage is: 96.04%">94.06% (-1.98% 🔻)</div> | 100%                                                           | <div title="Base coverage is: 97.79%">95.96% (-1.82% 🔻)</div> |
|                                                                           🟢                                                                           | <div title="avaliador-sintatico/avaliador-sintatico.ts">`...` / avaliador-sintatico.ts</div>                                          | <div title="Base coverage is: 94.59%">91.71% (-2.89% 🔻)</div> | <div title="Base coverage is: 84.5%">78.05% (-6.45% 🔻)</div>  | <div title="Base coverage is: 96%">92% (-4% 🔻)</div>          | <div title="Base coverage is: 94.72%">91.59% (-3.14% 🔻)</div> |
|                                                                           🟡                                                                           | <div title="interpretador/interpretador-base.ts">`...` / interpretador-base.ts</div>                                                  | <div title="Base coverage is: 75.41%">74.58% (-0.83% 🔻)</div> | <div title="Base coverage is: 67.01%">65.96% (-1.05% 🔻)</div> | 82.76%                                                         | <div title="Base coverage is: 74.68%">73.78% (-0.9% 🔻)</div>  |
|                                                                           🔴                                                                           | <div title="interpretador/pilha-escopos-execucao.ts">`...` / pilha-escopos-execucao.ts</div>                                          | 49.35%                                                         | <div title="Base coverage is: 48%">40% (-8% 🔻)</div>          | 52.63%                                                         | 50.72%                                                         |
|                                                                           🟡                                                                           | <div title="avaliador-sintatico/avaliador-sintatico-base.ts">`...` / avaliador-sintatico-base.ts</div>                                | <div title="Base coverage is: 70.69%">63.03% (-7.66% 🔻)</div> | <div title="Base coverage is: 41.67%">46.15% (+4.49% 🔼)</div> | <div title="Base coverage is: 52.94%">48.57% (-4.37% 🔻)</div> | <div title="Base coverage is: 71.17%">62.83% (-8.34% 🔻)</div> |
|                                                                           🔴                                                                           | <div title="avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts">`...` / avaliador-sintatico-portugol-studio.ts</div> | <div title="Base coverage is: 89.96%">4.03% (-85.93% 🔻)</div> | <div title="Base coverage is: 76.81%">0% (-76.81% 🔻)</div>    | <div title="Base coverage is: 96.3%">0% (-96.3% 🔻)</div>      | <div title="Base coverage is: 90.34%">4.03% (-86.3% 🔻)</div>  |
|                                                                           🔴                                                                           | <div title="interpretador/dialetos/portugol-studio/interpretador-portugol-studio.ts">`...` / interpretador-portugol-studio.ts</div>   | <div title="Base coverage is: 100%">18.18% (-81.82% 🔻)</div>  | <div title="Base coverage is: 100%">0% (-100% 🔻)</div>        | <div title="Base coverage is: 100%">0% (-100% 🔻)</div>        | <div title="Base coverage is: 100%">20% (-80% 🔻)</div>        |

</details>

## Test suite run success
297 tests passing in 26 suites.

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

Patch:
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico-base.ts b/fontes/avaliador-sintatico/avaliador-sintatico-base.ts
index 51738c07..7ac8f704 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico-base.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico-base.ts
@@ -1,25 +1,25 @@
 import { Binario, Chamada, Construto, FuncaoConstruto, Logico, Unario } from '../construtos';
 import {
+    Classe,
+    Continua,
+    Declaracao,
+    Enquanto,
+    Escolha,
     Escreva,
     Expressao,
-    Se,
-    Enquanto,
+    Fazer,
+    FuncaoDeclaracao,
+    Importar,
+    Leia,
     Para,
-    Sustar,
-    Continua,
     Retorna,
-    Escolha,
-    Importar,
+    Se,
+    Sustar,
     Tente,
-    Fazer,
     Var,
-    FuncaoDeclaracao as FuncaoDeclaracao,
-    Classe,
-    Declaracao,
-    Leia,
 } from '../declaracoes';
 import { AvaliadorSintaticoInterface, ParametroInterface, SimboloInterface } from '../interfaces';
-import { RetornoLexador, RetornoAvaliadorSintatico } from '../interfaces/retornos';
+import { RetornoAvaliadorSintatico, RetornoLexador } from '../interfaces/retornos';
 import { ErroAvaliadorSintatico } from './erro-avaliador-sintatico';
 
 import tiposDeSimbolos from '../tipos-de-simbolos/comum';
@@ -37,6 +37,7 @@ export abstract class AvaliadorSintaticoBase implements AvaliadorSintaticoInterf
     atual: number;
     blocos: number;
 
+
     consumir(tipo: string, mensagemDeErro: string): SimboloInterface {
         if (this.verificarTipoSimboloAtual(tipo)) return this.avancarEDevolverAnterior();
         throw this.erro(this.simbolos[this.atual], mensagemDeErro);
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
index 9d610a39..fe828d5c 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
@@ -221,6 +221,9 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
     }
 
     declaracaoCaracteres(): Var[] {
+        if (this.verificarTipoSimboloAtual(tiposDeSimbolos.BICEPS)) {
+            this.consumir(tiposDeSimbolos.BICEPS, '');
+        }
         const simboloCaractere = this.consumir(tiposDeSimbolos.FRANGO, '');
 
         const inicializacoes = [];
@@ -235,7 +238,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             );
 
             // Inicialização de variáveis que podem ter valor definido;
-            let valorInicializacao = '';
+            let valorInicializacao: string | Array<string>;
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
                 this.consumir(tiposDeSimbolos.TEXTO, "Esperado ' para começar o texto.");
                 const literalInicializacao = this.consumir(
@@ -243,7 +246,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
                     'Esperado literal de FRANGO após símbolo de igual em declaração de variável.'
                 );
                 this.consumir(tiposDeSimbolos.TEXTO, "Esperado ' para terminar o texto.");
-                valorInicializacao = String(literalInicializacao.literal); // Error nessa linha
+                valorInicializacao = String(literalInicializacao.literal);
             }
 
             inicializacoes.push(
@@ -258,36 +261,45 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
     }
 
     declaracaoInteiros(): Var[] {
-        const simboloInteiro = this.consumir(tiposDeSimbolos.MONSTRO, '');
+        let simboloInteiro: SimboloInterface;
+        if (this.verificarTipoSimboloAtual(tiposDeSimbolos.MONSTRO)) {
+            simboloInteiro = this.consumir(tiposDeSimbolos.MONSTRO, '');
+        } else if (this.verificarTipoSimboloAtual(tiposDeSimbolos.MONSTRINHO)) {
+            simboloInteiro = this.consumir(tiposDeSimbolos.MONSTRINHO, '');
+        } else if (this.verificarTipoSimboloAtual(tiposDeSimbolos.MONSTRAO)) {
+            simboloInteiro = this.consumir(tiposDeSimbolos.MONSTRAO, '');
+        } else {
+            throw new Error('Simbolo referente a inteiro não especificado.');
+        }
 
         const inicializacoes = [];
         do {
             const identificador = this.consumir(
                 tiposDeSimbolos.IDENTIFICADOR,
-                "Esperado identificador após palavra reservada 'MONSTRO'."
+                `Esperado identificador após palavra reservada '${simboloInteiro.lexema}'.`
             );
             inicializacoes.push(new Var(identificador, new Literal(this.hashArquivo, Number(simboloInteiro.linha), 0)));
-
             // Inicializações de variáveis podem ter valores definidos.
-            let valorInicializacao = 0;
+            let valorInicializacao = 0x00;
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
                 const literalInicializacao = this.consumir(
                     tiposDeSimbolos.NUMERO,
-                    'Esperado literal de MONSTRO após símbolo de igual em declaração de variável.'
+                    `Esperado literal de ${simboloInteiro.lexema} após símbolo de igual em declaração de variável.`
                 );
                 valorInicializacao = Number(literalInicializacao.literal);
             }
-
             inicializacoes.push(
                 new Var(identificador, new Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao))
             );
         } while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
-
         return inicializacoes;
     }
 
     declaracaoPontoFlutuante(): Var[] {
         const simboloFloat = this.consumir(tiposDeSimbolos.TRAPEZIO, '');
+        if (this.verificarTipoSimboloAtual(tiposDeSimbolos.DESCENDENTE)) {
+            this.consumir(tiposDeSimbolos.DESCENDENTE, '');
+        }
 
         const inicializacoes = [];
 
@@ -377,7 +389,10 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
                 return this.declaracaoPara();
             // Declaração de inteiros
             case tiposDeSimbolos.MONSTRO:
+            case tiposDeSimbolos.MONSTRINHO:
+            case tiposDeSimbolos.MONSTRAO:
                 return this.declaracaoInteiros();
+            case tiposDeSimbolos.BICEPS:
             case tiposDeSimbolos.FRANGO:
                 return this.declaracaoCaracteres();
             case tiposDeSimbolos.TRAPEZIO:
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
index e8d3d254..ff0be759 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
@@ -62,7 +62,7 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
         try {
             const formatoTexto: string = await this.avaliarArgumentosEscrevaVisuAlg(declaracao.argumentos);
             this.mensagemPrompt = formatoTexto;
-            process.stdout.write(formatoTexto);
+            this.funcaoDeRetornoMesmaLinha(formatoTexto);
             return null;
         } catch (erro: any) {
             this.erros.push(erro);
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
index f8616add..7630caa9 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
@@ -72,7 +72,7 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
         try {
             const formatoTexto: string = await this.avaliarArgumentosEscrevaVisuAlg(declaracao.argumentos);
             this.mensagemPrompt = formatoTexto;
-            process.stdout.write(formatoTexto);
+            this.funcaoDeRetornoMesmaLinha(formatoTexto);
             return null;
         } catch (erro: any) {
             this.erros.push(erro);
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index fbe05934..11b7067b 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -73,6 +73,7 @@ export class InterpretadorBase implements InterpretadorInterface {
     erros: ErroInterpretador[];
     performance: boolean;
     funcaoDeRetorno: Function = null;
+    funcaoDeRetornoMesmaLinha: Function = null;
     interfaceDeEntrada: readline.Interface = null;
     resultadoInterpretador: Array<string> = [];
     declaracoes: Declaracao[];
@@ -84,12 +85,14 @@ export class InterpretadorBase implements InterpretadorInterface {
     constructor(
         diretorioBase: string,
         performance = false,
-        funcaoDeRetorno: Function = null
+        funcaoDeRetorno: Function = null,
+        funcaoDeRetornoMesmaLinha: Function = null
     ) {
         this.diretorioBase = diretorioBase;
         this.performance = performance;
 
         this.funcaoDeRetorno = funcaoDeRetorno || console.log;
+        this.funcaoDeRetornoMesmaLinha = funcaoDeRetornoMesmaLinha || process.stdout.write;
 
         this.erros = [];
         this.declaracoes = [];
@@ -761,7 +764,7 @@ export class InterpretadorBase implements InterpretadorInterface {
     async visitarExpressaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): Promise<any> {
         try {
             const formatoTexto: string = await this.avaliarArgumentosEscreva(declaracao.argumentos);
-            process.stdout.write(formatoTexto);
+            this.funcaoDeRetornoMesmaLinha(formatoTexto);
             return null;
         } catch (erro: any) {
             this.erros.push({
diff --git a/fontes/lexador/dialetos/palavras-reservadas/birl.ts b/fontes/lexador/dialetos/palavras-reservadas/birl.ts
index a68164a8..fe9bd648 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/birl.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/birl.ts
@@ -19,12 +19,14 @@ export default {
     bambam: tiposDeSimbolos.BAMBAM,
     birl: tiposDeSimbolos.BIRL,
     bora: tiposDeSimbolos.BORA,
+    biceps: tiposDeSimbolos.BICEPS,
     ce: tiposDeSimbolos.CE,
     cumpade: tiposDeSimbolos.CUMPADE,
     da: tiposDeSimbolos.DA,
     dar: tiposDeSimbolos.DAR,
     do: tiposDeSimbolos.DO,
     doente: tiposDeSimbolos.DOENTE,
+    descendente: tiposDeSimbolos.DESCENDENTE,
     ele: tiposDeSimbolos.ELE,
     essa: tiposDeSimbolos.ESSA,
     filho: tiposDeSimbolos.FILHO,
@@ -36,6 +38,7 @@ export default {
     maluco: tiposDeSimbolos.MALUCO,
     monstrao: tiposDeSimbolos.MONSTRAO,
     monstro: tiposDeSimbolos.MONSTRO,
+    monstrinho: tiposDeSimbolos.MONSTRINHO, // Essa palavra reservada faz referencia a um short int que em C tem 2bytes ou 16 bits, mas não tratamos ela assim, aqui ela é ignorada e a tratamos como um inteiros de 4 bytes ou 32 bits.
     nao: tiposDeSimbolos.NAO,
     negativa: tiposDeSimbolos.NEGATIVA,
     o: tiposDeSimbolos.O,
diff --git a/fontes/tipos-de-simbolos/birl.ts b/fontes/tipos-de-simbolos/birl.ts
index 9f33fab5..05d3f6b5 100644
--- a/fontes/tipos-de-simbolos/birl.ts
+++ b/fontes/tipos-de-simbolos/birl.ts
@@ -6,12 +6,14 @@ export default {
     BAMBAM: 'BAMBAM',
     BIRL: 'BIRL',
     BORA: 'BORA',
+    BICEPS: 'BICEPS',
     CE: 'CE',
     CUMPADE: 'CUMPADE',
     DA: 'DA',
     DAR: 'DAR',
     DO: 'DO',
     DOENTE: 'DOENTE',
+    DESCENDENTE: 'DESCENDENTE',
     ELE: 'ELE',
     ESSA: 'ESSA',
     FRANGAO: 'FRANGAO',
@@ -25,6 +27,7 @@ export default {
     MALUCO: 'MALUCO',
     MONSTRAO: 'MONSTRAO',
     MONSTRO: 'MONSTRO',
+    MONSTRINHO: 'MONSTRINHO',
     TRAPEZIO: 'TRAPEZIO',
     NAO: 'NAO',
     NEGATIVA: 'NEGATIVA',


Test patch:
diff --git a/testes/birl/avaliador-sintatico.test.ts b/testes/birl/avaliador-sintatico.test.ts
index dfa11e64..9ca1bf4c 100644
--- a/testes/birl/avaliador-sintatico.test.ts
+++ b/testes/birl/avaliador-sintatico.test.ts
@@ -92,5 +92,66 @@ describe('Avaliador Sintático Birl', () => {
             expect(retornoAvaliadorSintatico).toBeTruthy();
             expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
         });
+
+        describe('Sucesso - Variavel de tipagem não utilizada', () => {
+            it('Sucesso - Variavel - short int', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  MONSTRINHO M1 = 1.03; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador);
+
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+            });
+
+            it('Sucesso - Variavel - long int', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  MONSTRAO M1 = 16666666; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador);
+
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+            });
+
+            it('Sucesso - Variavel - double', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  TRAPEZIO DESCENDENTE TD = 0.37; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador);
+
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+            });
+
+            it('Sucesso - Variavel - unsigned char', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    `  BICEPS FRANGO TD = 'test'; \n`,
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador);
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(3);
+            });
+        });
     });
 });