Repository: DesignLiquido/delegua
Pull request #241 (2023-01-14 19:08:57)

Adequações para possibilitar depuração de código do VisuAlg.


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
index b639707a..e34bfcdd 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
@@ -8,9 +8,7 @@ import tiposDeSimbolos from '../../tipos-de-simbolos/birl';
 
 export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
     validarSegmentoHoraDoShow(): void {
-        this.consumir(tiposDeSimbolos.HORA, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
-        this.consumir(tiposDeSimbolos.DO, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
-        this.consumir(tiposDeSimbolos.SHOW, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
+        this.consumir(tiposDeSimbolos.HORA_DO_SHOW, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
         this.blocos += 1;
     }
 
diff --git a/fontes/delegua.ts b/fontes/delegua.ts
index 5fd513d9..66359914 100644
--- a/fontes/delegua.ts
+++ b/fontes/delegua.ts
@@ -36,6 +36,7 @@ import { AvaliadorSintaticoBirl } from './avaliador-sintatico/dialetos/avaliador
 import { TradutorJavaScript, TradutorReversoJavaScript } from './tradutores';
 import { InterpretadorVisuAlg } from './interpretador/dialetos/visualg';
 import { ErroInterpretador } from './interpretador';
+import { InterpretadorVisuAlgComDepuracao } from './interpretador/dialetos';
 
 /**
  * O núcleo da linguagem.
@@ -134,7 +135,9 @@ export class Delegua implements DeleguaInterface {
                     this.conteudoArquivosAbertos,
                     depurador
                 );
-                this.interpretador = new InterpretadorVisuAlg(this.importador, process.cwd(), false, console.log);
+                this.interpretador = depurador
+                    ? new InterpretadorVisuAlgComDepuracao(this.importador, process.cwd(), funcaoDeRetorno)
+                    : new InterpretadorVisuAlg(this.importador, process.cwd(), false, console.log);
                 break;
             default:
                 this.lexador = new Lexador(performance);
@@ -355,9 +358,14 @@ export class Delegua implements DeleguaInterface {
         this.interpretador.interfaceEntradaSaida = interfaceLeitura;
 
         if (this.modoDepuracao) {
-            (this.interpretador as InterpretadorComDepuracaoInterface).prepararParaDepuracao(
-                retornoImportador.retornoAvaliadorSintatico.declaracoes
-            );
+            try {
+                (this.interpretador as InterpretadorComDepuracaoInterface).prepararParaDepuracao(
+                    retornoImportador.retornoAvaliadorSintatico.declaracoes
+                );
+            } catch (erro: any) {
+                console.error(chalk.red(`[Erro de execução]`) + ` Dialeto ${this.dialeto} não suporta depuração.`);
+            }
+            
         } else {
             const { erros } = await this.executar(retornoImportador);
             errosExecucao = erros;
diff --git a/fontes/interpretador/dialetos/index.ts b/fontes/interpretador/dialetos/index.ts
index 6890d4d9..8813b62e 100644
--- a/fontes/interpretador/dialetos/index.ts
+++ b/fontes/interpretador/dialetos/index.ts
@@ -1,2 +1,3 @@
 export * from './egua-classico';
 export * from './visualg';
+export * from './visualg-com-depuracao';
diff --git a/fontes/interpretador/dialetos/visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg-com-depuracao.ts
new file mode 100644
index 00000000..de005792
--- /dev/null
+++ b/fontes/interpretador/dialetos/visualg-com-depuracao.ts
@@ -0,0 +1,61 @@
+import { Construto } from "../../construtos";
+import { EscrevaMesmaLinha, Escreva } from "../../declaracoes";
+import { ImportadorInterface } from "../../interfaces";
+import { InterpretadorComDepuracao } from "../interpretador-com-depuracao";
+
+export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao {
+    constructor(
+        importador: ImportadorInterface,
+        diretorioBase: string,
+        funcaoDeRetorno: Function = null
+    ) {
+        super(importador, diretorioBase, funcaoDeRetorno);
+    }
+
+    private async avaliarArgumentosEscrevaVisuAlg(argumentos: Construto[]): Promise<string> {
+        let formatoTexto: string = '';
+
+        for (const argumento of argumentos) {
+            const resultadoAvaliacao = await this.avaliar(argumento);
+            let valor = resultadoAvaliacao?.hasOwnProperty('valor')
+                        ? resultadoAvaliacao.valor
+                        : resultadoAvaliacao;
+
+            formatoTexto += `${this.paraTexto(valor)}`;
+        }
+
+        return formatoTexto;
+    }
+
+    /**
+     * Execução de uma escrita na saída padrão, sem quebras de linha.
+     * Implementada para alguns dialetos, como VisuAlg.
+     * @param declaracao A declaração.
+     * @returns Sempre nulo, por convenção de visita.
+     */
+    async visitarExpressaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): Promise<any> {
+        try {
+            const formatoTexto: string = await this.avaliarArgumentosEscrevaVisuAlg(declaracao.argumentos);
+            process.stdout.write(formatoTexto);
+            return null;
+        } catch (erro: any) {
+            this.erros.push(erro);
+        }
+    }
+
+    /**
+     * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
+     * alguma função para escrever numa página Web.
+     * @param declaracao A declaração.
+     * @returns Sempre nulo, por convenção de visita.
+     */
+    async visitarExpressaoEscreva(declaracao: Escreva): Promise<any> {
+        try {
+            const formatoTexto: string = await this.avaliarArgumentosEscrevaVisuAlg(declaracao.argumentos);
+            this.funcaoDeRetorno(formatoTexto);
+            return null;
+        } catch (erro: any) {
+            this.erros.push(erro);
+        }
+    }
+}
\ No newline at end of file
diff --git a/fontes/lexador/dialetos/lexador-birl.ts b/fontes/lexador/dialetos/lexador-birl.ts
index d3389bb1..64f5d24f 100644
--- a/fontes/lexador/dialetos/lexador-birl.ts
+++ b/fontes/lexador/dialetos/lexador-birl.ts
@@ -1,11 +1,9 @@
 import { RetornoLexador } from '../../interfaces/retornos';
 import { ErroLexador } from '../erro-lexador';
+import tiposDeSimbolos from '../../tipos-de-simbolos/birl';
 import { LexadorBaseLinhaUnica } from '../lexador-base-linha-unica';
 import { Simbolo } from '../simbolo';
 
-import palavrasReservadas from './palavras-reservadas/birl';
-import tiposDeSimbolos from '../../tipos-de-simbolos/birl';
-
 export class LexadorBirl extends LexadorBaseLinhaUnica {
     adicionarSimbolo(tipo: string, lexema: string = '', literal: any = null): void {
         this.simbolos.push(new Simbolo(tipo, lexema, literal, this.linha, -1));
@@ -58,29 +56,14 @@ export class LexadorBirl extends LexadorBaseLinhaUnica {
     }
 
     identificarPalavraChave(): void {
-        while (this.eAlfabetoOuDigito(this.simboloAtual())) {
+        while (this.simboloAtual() !== '\n' && this.simboloAtual() !== '?') {
             this.avancar();
         }
 
-        const codigo: string = this.codigo[this.linha].substring(
-            this.inicioSimbolo,
-            this.atual
-        );
-
-        const tipo: string =
-            codigo in palavrasReservadas
-                ? palavrasReservadas[codigo]
-                : tiposDeSimbolos.IDENTIFICADOR;
-
-        this.adicionarSimbolo(tipo);
-        /* while (
-            this.simboloAtual() !== '\n' &&
-            this.simboloAtual() !== '?'
-        ) {
-            this.avancar();
-        }
+        const proximo = this.simboloAtual();
 
-        const valor = this.simboloAtual() !== '?'
+        const valor =
+            proximo !== '?'
                 ? this.codigo.substring(this.inicioSimbolo, this.atual - 1).trim()
                 : this.codigo.substring(this.inicioSimbolo, this.atual + 1).trim();
 
@@ -113,14 +96,10 @@ export class LexadorBirl extends LexadorBaseLinhaUnica {
                 this.adicionarSimbolo(tiposDeSimbolos.NAO_VAI_DAR_NAO);
                 this.avancar();
                 break;
-            case 'MONSTRO?':
-                this.adicionarSimbolo(tiposDeSimbolos.MONSTRO);
-                this.avancar();
-                break;
             default:
                 this.avancar();
                 break;
-        } */
+        }
     }
 
     analisarToken(): void {
@@ -136,17 +115,12 @@ export class LexadorBirl extends LexadorBaseLinhaUnica {
                 this.avancar();
                 break;
             case '=':
-                this.avancar();
-                if (this.simboloAtual() === '=') {
-                    this.adicionarSimbolo(tiposDeSimbolos.IGUAL_IGUAL);
-                    this.avancar();
-                } else {
-                    this.adicionarSimbolo(tiposDeSimbolos.IGUAL);
-                }
-
-                break;
-            case '+':
-                this.adicionarSimbolo(tiposDeSimbolos.ADICAO);
+                const bool = this.proximoIgualA('=') ? true : false;
+                this.adicionarSimbolo(
+                    bool ? tiposDeSimbolos.IGUAL_IGUAL : tiposDeSimbolos.IGUAL,
+                    bool ? '==' : '=',
+                    null
+                );
                 this.avancar();
                 break;
             case "'":
@@ -163,13 +137,13 @@ export class LexadorBirl extends LexadorBaseLinhaUnica {
                 this.avancar();
                 break;
             case '\0':
-            case '\n':                
-                this.adicionarSimbolo(tiposDeSimbolos.QUEBRA_LINHA, null, null);
+                this.adicionarSimbolo(tiposDeSimbolos.QUEBRA_LINHA, '\0', null);
                 this.avancar();
                 break;
             case ' ':
             case '\r':
             case '\t':
+            case '\n':
             case '':
                 this.avancar();
                 break;
diff --git a/fontes/lexador/dialetos/palavras-reservadas/birl.ts b/fontes/lexador/dialetos/palavras-reservadas/birl.ts
index e8642f43..508878de 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/birl.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/birl.ts
@@ -1,54 +1,16 @@
 import tiposDeSimbolos from '../../../tipos-de-simbolos/birl';
 
 export default {
-    // HORA_DO_SHOW: tiposDeSimbolos.HORA_DO_SHOW,
-    // BIRL: tiposDeSimbolos.BIRL,
-    // QUE_QUE_CE_QUER_MONSTRAO: tiposDeSimbolos.QUE_QUE_CE_QUER_MONSTRAO,
-    // ELE_QUE_A_GENTE_QUER: tiposDeSimbolos.ELE_QUE_A_GENTE_QUER,
-    // NAO_VAI_DAR_NAO: tiposDeSimbolos.NAO_VAI_DAR_NAO,
-    // QUE_NAO_VAI_DAR_O_QUE: tiposDeSimbolos.QUE_NAO_VAI_DAR_O_QUE,
-    // NEGATIVA_BAMBAM: tiposDeSimbolos.NEGATIVA_BAMBAM,
-    // MAIS_QUERO_MAIS: tiposDeSimbolos.MAIS_QUERO_MAIS,
-    // VAMO_MONSTRO: tiposDeSimbolos.VAMO_MONSTRO,
-    // SAI_FILHO_DA_PUTA: tiposDeSimbolos.SAI_FILHO_DA_PUTA,
-    // OH_O_HOME_AI_PO: tiposDeSimbolos.OH_O_HOME_AI_PO,
-    // AJUDA_O_MALUCO_TA_DOENTE: tiposDeSimbolos.AJUDA_O_MALUCO_TA_DOENTE,
-    a: tiposDeSimbolos.A,
-    ai: tiposDeSimbolos.AI,
-    ajuda: tiposDeSimbolos.AJUDA,
-    bambam: tiposDeSimbolos.BAMBAM,
-    birl: tiposDeSimbolos.BIRL,
-    bora: tiposDeSimbolos.BORA,
-    ce: tiposDeSimbolos.CE,
-    cumpade: tiposDeSimbolos.CUMPADE,
-    da: tiposDeSimbolos.DA,
-    dar: tiposDeSimbolos.DAR,
-    do: tiposDeSimbolos.DO,
-    doente: tiposDeSimbolos.DOENTE,
-    ele: tiposDeSimbolos.ELE,
-    essa: tiposDeSimbolos.ESSA,
-    filho: tiposDeSimbolos.FILHO,
-    gente: tiposDeSimbolos.GENTE,
-    home: tiposDeSimbolos.HOME,
-    hora: tiposDeSimbolos.HORA,
-    mais: tiposDeSimbolos.MAIS,
-    maluco: tiposDeSimbolos.MALUCO,
-    monstrao: tiposDeSimbolos.MONSTRAO,
-    monstro: tiposDeSimbolos.MONSTRO,
-    nao: tiposDeSimbolos.NAO,
-    negativa: tiposDeSimbolos.NEGATIVA,
-    o: tiposDeSimbolos.O,
-    oh: tiposDeSimbolos.OH,
-    po: tiposDeSimbolos.PO,
-    porra: tiposDeSimbolos.PORRA,
-    puta: tiposDeSimbolos.PUTA,
-    que: tiposDeSimbolos.QUE,
-    quer: tiposDeSimbolos.QUER,
-    quero: tiposDeSimbolos.QUERO,
-    sai: tiposDeSimbolos.SAI,
-    show: tiposDeSimbolos.SHOW,
-    ta: tiposDeSimbolos.TA,
-    vai: tiposDeSimbolos.VAI,
-    vamo: tiposDeSimbolos.VAMO,
-    ver: tiposDeSimbolos.VER
+    HORA_DO_SHOW: tiposDeSimbolos.HORA_DO_SHOW,
+    BIRL: tiposDeSimbolos.BIRL,
+    QUE_QUE_CE_QUER_MONSTRAO: tiposDeSimbolos.QUE_QUE_CE_QUER_MONSTRAO,
+    ELE_QUE_A_GENTE_QUER: tiposDeSimbolos.ELE_QUE_A_GENTE_QUER,
+    NAO_VAI_DAR_NAO: tiposDeSimbolos.NAO_VAI_DAR_NAO,
+    QUE_NAO_VAI_DAR_O_QUE: tiposDeSimbolos.QUE_NAO_VAI_DAR_O_QUE,
+    NEGATIVA_BAMBAM: tiposDeSimbolos.NEGATIVA_BAMBAM,
+    MAIS_QUERO_MAIS: tiposDeSimbolos.MAIS_QUERO_MAIS,
+    VAMO_MONSTRO: tiposDeSimbolos.VAMO_MONSTRO,
+    SAI_FILHO_DA_PUTA: tiposDeSimbolos.SAI_FILHO_DA_PUTA,
+    OH_O_HOME_AI_PO: tiposDeSimbolos.OH_O_HOME_AI_PO,
+    AJUDA_O_MALUCO_TA_DOENTE: tiposDeSimbolos.AJUDA_O_MALUCO_TA_DOENTE,
 };
diff --git a/fontes/tipos-de-simbolos/birl.ts b/fontes/tipos-de-simbolos/birl.ts
index 813a83b5..98a880f5 100644
--- a/fontes/tipos-de-simbolos/birl.ts
+++ b/fontes/tipos-de-simbolos/birl.ts
@@ -1,57 +1,28 @@
 export default {
-    // Palavras reservadas
-    A: 'A',
-    AI: 'AI',
-    AJUDA: 'AJUDA',
-    BAMBAM: 'BAMBAM',
+    // Comandos da linguagem do bambam
+    HORA_DO_SHOW: 'HORA DO SHOW',
     BIRL: 'BIRL',
-    BORA: 'BORA',
-    CE: 'CE',
-    CUMPADE: 'CUMPADE',
-    DA: 'DA',
-    DAR: 'DAR',
-    DO: 'DO',
-    DOENTE: 'DOENTE',
-    ELE: 'ELE',
-    ESSA: 'ESSA',
-    FILHO: 'FILHO',
-    GENTE: 'GENTE',
-    HOME: 'HOME',
-    HORA: 'HORA',
-    MAIS: 'MAIS',
-    MALUCO: 'MALUCO',
-    MONSTRAO: 'MONSTRAO',
-    MONSTRO: 'MONSTRO',
-    NAO: 'NAO',
-    NEGATIVA: 'NEGATIVA',
-    O: 'O',
-    OH: 'OH',
-    PO: 'PO',
-    PORRA: 'PORRA',
-    PUTA: 'PUTA',
-    QUE: 'QUE',
-    QUER: 'QUER',
-    QUERO: 'QUERO',
-    SAI: 'SAI',
-    SHOW: 'SHOW',
-    TA: 'TA',
-    VAI: 'VAI',
-    VAMO: 'VAMO',
-    VER: 'VER',
+    CE_QUER_VER_ESSA_PORRA: 'CE QUER VER ESSA PORRA?',
+    QUE_QUE_CE_QUER_MONSTRAO: 'QUE QUE CE QUER MONSTRAO?',
+    ELE_QUE_A_GENTE_QUER: 'ELE QUE A GENTE QUER?',
+    NAO_VAI_DAR_NAO: 'NAO VAI DAR NAO',
+    QUE_NAO_VAI_DAR_O_QUE: 'QUE NAO VAI DAR O QUE?',
+    NEGATIVA_BAMBAM: 'NEGATIVA BAMBAM',
+    MAIS_QUERO_MAIS: 'MAIS QUERO MAIS',
+    VAMO_MONSTRO: 'VAMO MONSTRO;',
+    SAI_FILHO_DA_PUTA: 'SAI FILHO DA PUTA;',
+    OH_O_HOME_AI_PO: 'OH O HOME AI PO',
+    AJUDA_O_MALUCO_TA_DOENTE: 'AJUDA O MALUCO TA DOENTE',
+    BORA_CUMPADE: 'BORA CUMPADE',
 
-    // Símbolos de propósito geral
+    // simbolos
     PARENTESE_DIREITO: 'PARENTESE_DIREITO',
     PARENTESE_ESQUERDO: 'PARENTESE_ESQUERDO',
     IGUAL: 'IGUAL',
     IGUAL_IGUAL: 'IGUAL_IGUAL',
     PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
     QUEBRA_LINHA: 'QUEBRA_LINHA',
-    INTERROGACAO: 'INTERROGACAO',
-
-    // Operações matemáticas
-    ADICAO: 'ADICAO',
 
     TEXTO: 'TEXTO',
     NUMERO: 'NUMERO',
-    IDENTIFICADOR: 'IDENTIFICADOR',
 };


Test patch:
diff --git a/testes/birl/lexador.test.ts b/testes/birl/lexador.test.ts
index 42e85c1b..7c7ba793 100644
--- a/testes/birl/lexador.test.ts
+++ b/testes/birl/lexador.test.ts
@@ -1,61 +1,36 @@
 import { Delegua } from '../../fontes/delegua';
 
-describe('Lexador', () => {
-    describe('mapear()', () => {
-        let delegua: Delegua;
+describe('Lexador Birl', () => {
+    let delegua: Delegua;
 
-        beforeEach(() => {
-            delegua = new Delegua('birl');
-        });
-
-        describe('Cenário de sucesso', () => {
-            it('Arquivo vazio.', () => {
-                const resultado = delegua.lexador.mapear([''], -1);
-
-                expect(resultado).toBeTruthy();
-                expect(resultado.simbolos).toHaveLength(1);
-            });
-
-            it('Programa vazio.', () => {
-                const resultado = delegua.lexador.mapear(['HORA DO SHOW \n', 'BIRL \n'], -1);
-
-                expect(resultado).toBeTruthy();
-                expect(resultado.simbolos).toHaveLength(8);
-            });
-
-            it('Programa Olá mundo simples.', () => {
-                const resultado = delegua.lexador.mapear(
-                    [
-                        'HORA DO SHOW \n',
-                        '   CE QUER VER ESSA PORRA? ("Hello, World! Porra!\n"); \n',
-                        '   BORA CUMPADE? 0; \n',
-                        'BIRL \n',
-                    ],
-                    -1
-                );
-
-                expect(resultado).toBeTruthy();
-                expect(resultado.simbolos).toHaveLength(24);
-                expect(resultado.erros).toHaveLength(0);
-            });
+    beforeEach(() => {
+        delegua = new Delegua('birl');
+    });
+    it('Arquivo vazio.', () => {
+        const resultado = delegua.lexador.mapear([''], -1);
 
-            it('Sucesso - Variavel - Atribuição', () => {
-                const resultado = delegua.lexador.mapear(
-                    [
-                        'HORA DO SHOW \n',
-                        '  MONSTRO? M1 = 1; \n',
-                        '  M1 = M1 + 1',
-                        '  CE QUER VER ESSA PORRA? (M1); \n',
-                        '  BORA CUMPADE? 0; \n',
-                        'BIRL \n',
-                    ],
-                    -1
-                );
+        expect(resultado).toBeTruthy();
+        expect(resultado.simbolos).toHaveLength(0);
+    });
+    it('Programa vazio.', () => {
+        const resultado = delegua.lexador.mapear(['HORA DO SHOW \n', 'BIRL \n'], -1);
 
-                expect(resultado).toBeTruthy();
-                expect(resultado.simbolos).toHaveLength(34);
-                expect(resultado.erros).toHaveLength(0);
-            });
-        });
+        expect(resultado).toBeTruthy();
+        expect(resultado.simbolos).toHaveLength(2);
+    });
+    it('Programa Olá mundo simples.', () => {
+        const resultado = delegua.lexador.mapear(
+            [
+                'HORA DO SHOW \n',
+                '   CE QUER VER ESSA PORRA? ("Hello, World! Porra!\n"); \n',
+                '   BORA CUMPADE? 0; \n',
+                'BIRL \n',
+            ],
+            -1
+        );
+
+        expect(resultado).toBeTruthy();
+        expect(resultado.simbolos).toHaveLength(9);
+        expect(resultado.erros).toHaveLength(0);
     });
 });