Repository: DesignLiquido/delegua
Pull request #173 (2022-12-01 00:47:08)

Tente pegue com parametro
```
tente {
    var a = 1 / 0
} pegue (erro) {
    escreva(erro)
}
```


Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 6049cb02..b51877ef 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -210,7 +210,7 @@
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                // "interpretador.test.ts",
+                "interpretador.test.ts",
                 "--runInBand"
             ],
             "skipFiles": ["<node_internals>/**", "node_modules/**"],
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 305ae604..5fa1985a 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -705,23 +705,28 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
         const simboloTente: SimboloInterface = this.simbolos[this.atual - 1];
         this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
 
-        const blocoTente = this.blocoEscopo();
+        const blocoTente: any[] = this.blocoEscopo();
 
-        let blocoPegue = null;
+        let blocoPegue: FuncaoConstruto = null;
         if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PEGUE)) {
-            this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
-
-            blocoPegue = this.blocoEscopo();
+            if (this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_ESQUERDO)) {
+                // Caso 1: com parâmetro de erro.
+                blocoPegue = this.corpoDaFuncao("bloco `pegue`");
+            } else {
+                // Caso 2: sem parâmetro de erro.
+                const simboloBlocoPegue = this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
+                blocoPegue = new FuncaoConstruto(this.hashArquivo, Number(simboloBlocoPegue.linha), null, this.blocoEscopo());
+            }
         }
 
-        let blocoSenao = null;
+        let blocoSenao: any[] = null;
         if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SENAO, tiposDeSimbolos.SENÃO)) {
             this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
 
             blocoSenao = this.blocoEscopo();
         }
 
-        let blocoFinalmente = null;
+        let blocoFinalmente: any[] = null;
         if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.FINALMENTE)) {
             this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
 
diff --git a/fontes/construtos/chamada.ts b/fontes/construtos/chamada.ts
index 5d100567..4d54d255 100644
--- a/fontes/construtos/chamada.ts
+++ b/fontes/construtos/chamada.ts
@@ -6,14 +6,14 @@ export class Chamada implements Construto {
     hashArquivo?: number;
 
     entidadeChamada: Construto;
-    argumentos: any;
+    argumentos: any[];
     parentese: any;
 
     constructor(
         hashArquivo: number,
         entidadeChamada: Construto,
         parentese: any,
-        argumentos: any
+        argumentos: any[]
     ) {
         this.linha = entidadeChamada.linha;
         this.hashArquivo = hashArquivo;
diff --git a/fontes/declaracoes/tente.ts b/fontes/declaracoes/tente.ts
index d0346802..64c564a8 100644
--- a/fontes/declaracoes/tente.ts
+++ b/fontes/declaracoes/tente.ts
@@ -1,19 +1,23 @@
+import { FuncaoConstruto } from '../construtos';
 import { InterpretadorInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 
+/**
+ * Declaração `tente`.
+ */
 export class Tente extends Declaracao {
-    caminhoTente: any;
-    caminhoPegue: any;
-    caminhoSenao: any;
-    caminhoFinalmente: any;
+    caminhoTente: any[];
+    caminhoPegue: FuncaoConstruto;
+    caminhoSenao: any[];
+    caminhoFinalmente: any[];
 
     constructor(
         hashArquivo: number,
         linha: number,
-        caminhoTente: any,
+        caminhoTente: any[],
         caminhoPegue: any,
-        caminhoSenao: any,
-        caminhoFinalmente: any
+        caminhoSenao: any[],
+        caminhoFinalmente: any[]
     ) {
         super(linha, hashArquivo);
         this.caminhoTente = caminhoTente;
diff --git a/fontes/delegua.ts b/fontes/delegua.ts
index 04df75b0..2a833378 100644
--- a/fontes/delegua.ts
+++ b/fontes/delegua.ts
@@ -119,7 +119,7 @@ export class Delegua implements DeleguaInterface {
                     depurador
                 );
                 this.interpretador = new Interpretador(this.importador, process.cwd(), false, console.log);
-                this.funcaoDeRetorno('Usando dialeto: birl');
+                console.log('Usando dialeto: birl');
                 break;
             default:
                 this.lexador = new Lexador(performance);
diff --git a/fontes/interpretador/dialetos/egua-classico.ts b/fontes/interpretador/dialetos/egua-classico.ts
index 994f29df..10b77fdf 100644
--- a/fontes/interpretador/dialetos/egua-classico.ts
+++ b/fontes/interpretador/dialetos/egua-classico.ts
@@ -39,6 +39,7 @@ import {
 import {
     AcessoIndiceVariavel,
     Atribuir,
+    Chamada,
     Construto,
     Literal,
     Super,
@@ -576,7 +577,8 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {
                 sucesso = false;
 
                 if (declaracao.caminhoPegue !== null) {
-                    await this.executarBloco(declaracao.caminhoPegue);
+                    const chamadaPegue = new Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, null, []);
+                    await chamadaPegue.aceitar(this);
                 } else {
                     this.erros.push(erro);
                 }
diff --git a/fontes/interpretador/interpretador.ts b/fontes/interpretador/interpretador.ts
index 7a6e624d..1cc14b49 100644
--- a/fontes/interpretador/interpretador.ts
+++ b/fontes/interpretador/interpretador.ts
@@ -44,6 +44,7 @@ import {
 import {
     AcessoIndiceVariavel,
     Atribuir,
+    Chamada,
     Construto,
     Literal,
     Super,
@@ -691,6 +692,10 @@ export class Interpretador implements InterpretadorInterface {
         }
     }
 
+    /**
+     * Interpretação de uma declaração `tente`.
+     * @param declaracao O objeto da declaração.
+     */
     async visitarExpressaoTente(declaracao: Tente): Promise<any> {
         try {
             let sucesso = true;
@@ -700,7 +705,9 @@ export class Interpretador implements InterpretadorInterface {
                 sucesso = false;
 
                 if (declaracao.caminhoPegue !== null) {
-                    await this.executarBloco(declaracao.caminhoPegue);
+                    const literalErro = new Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
+                    const chamadaPegue = new Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, null, [literalErro]);
+                    await chamadaPegue.aceitar(this);
                 } else {
                     this.erros.push(erro);
                 }
diff --git a/package.json b/package.json
index e278a107..27b6ed0c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@designliquido/delegua",
-    "version": "0.9.5",
+    "version": "0.9.4",
     "description": "Linguagem de programação simples e moderna usando português estruturado",
     "main": "index.js",
     "scripts": {
@@ -28,9 +28,7 @@
     "keywords": [
         "egua",
         "eguap",
-        "delegua",
-        "visualg",
-        "birl"
+        "delegua"
     ],
     "author": "Leonel Sanches da Silva",
     "contributors": [


Test patch:
diff --git a/testes/avaliador-sintatico.test.ts b/testes/avaliador-sintatico.test.ts
index 6d7adea7..a291de54 100644
--- a/testes/avaliador-sintatico.test.ts
+++ b/testes/avaliador-sintatico.test.ts
@@ -95,5 +95,16 @@ describe('Avaliador sintático', () => {
                 );
             });
         });
+
+        it("Declaração `tente`", () => {
+            const retornoLexador = delegua.lexador.mapear(
+                ["tente { i = i + 1 } pegue (erro) { escreva(erro) }"],
+                -1
+            );
+            const retornoAvaliadorSintatico =
+                delegua.avaliadorSintatico.analisar(retornoLexador);
+
+            expect(retornoAvaliadorSintatico).toBeTruthy();
+        });
     });
 });
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index eba7828f..0ebc6698 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -382,10 +382,25 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
-                it.skip('Tente com senão', async () => {
+                it("Tente com Pegue parametrizado", async () => {
+                    const retornoLexador = delegua.lexador.mapear(
+                        ["tente { i = i + 1 } pegue (erro) { escreva(erro) }"],
+                        -1
+                    );
+                    const retornoAvaliadorSintatico =
+                        delegua.avaliadorSintatico.analisar(retornoLexador);
+
+                    expect(retornoAvaliadorSintatico).toBeTruthy();
+
+                    const retornoInterpretador = await delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
+                it('Tente com senão', async () => {
                     const codigo = [
                         "tente {",
-                            "se 1 != 1 {",
+                            "se (1 != 1) {",
                                 "escreva('sucesso');",
                             "}",
                             "senao {",