Repository: DesignLiquido/delegua
Pull request #533 (2023-10-27 00:04:37)

Avaliador Sintático Portugol Studio e Delégua


Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 130401cc..da2c0409 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -672,7 +672,7 @@
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                // "analisador-semantico",
+                // "interpretador",
                 "interpretador",
                 "--runInBand"
             ],
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 6dd76936..e3fd3fba 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -683,6 +683,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
         let incrementar = null;
         if (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
             incrementar = this.expressao();
+            this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR)
         }
 
         if (comParenteses) {
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
index ecca3971..06cfae97 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
@@ -1,5 +1,6 @@
 import {
     AcessoIndiceVariavel,
+    Agrupamento,
     AtribuicaoPorIndice,
     Atribuir,
     Binario,
@@ -84,7 +85,8 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
     }
 
     primario(): Construto {
-        switch (this.simbolos[this.atual].tipo) {
+        const simboloAtual = this.simbolos[this.atual];
+        switch (simboloAtual.tipo) {
             case tiposDeSimbolos.IDENTIFICADOR:
                 const simboloIdentificador: SimboloInterface = this.avancarEDevolverAnterior();
                 // Se o próximo símbolo é um incremento ou um decremento,
@@ -104,6 +106,14 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
                 }
 
                 return new Variavel(this.hashArquivo, simboloIdentificador);
+
+            case tiposDeSimbolos.PARENTESE_ESQUERDO:
+                this.avancarEDevolverAnterior();
+                const expressao = this.expressao();
+                this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
+    
+                return new Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
+
             case tiposDeSimbolos.CADEIA:
             case tiposDeSimbolos.CARACTER:
             case tiposDeSimbolos.INTEIRO:
@@ -561,6 +571,7 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
             let incrementar = null;
             if (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
                 incrementar = this.expressao();
+                this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR)
             }
 
             this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após cláusulas");


Test patch:
diff --git a/testes/portugol-studio/avaliador-sintatico.test.ts b/testes/portugol-studio/avaliador-sintatico.test.ts
index 13cac69f..fbd2a5a9 100644
--- a/testes/portugol-studio/avaliador-sintatico.test.ts
+++ b/testes/portugol-studio/avaliador-sintatico.test.ts
@@ -58,6 +58,31 @@ describe('Avaliador sintático (Portugol Studio)', () => {
                 expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
             });
 
+            it('Sucesso - Agrupamento', async () => {
+                const retornoLexador = lexador.mapear([
+                    'programa',
+                    '{',
+                    '    funcao inicio()',
+                    '    {',
+                    '        inteiro base',
+                    '        inteiro altura',
+                    '        inteiro area',
+                    '        escreva("Insira a base: ")',
+                    '        leia(base)',
+                    '        escreva("Insira a altura: ")',
+                    '        leia(altura)',
+                    '        area = (base * altura) / 2',
+                    '        escreva("\nA area do triangulo é: ", area)',
+                    '    }',
+                    '}'
+                ], -1);
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
+            });
+
             it('Sucesso - Leia', () => {
                 const retornoLexador = lexador.mapear(
                     [