Repository: DesignLiquido/delegua
Pull request #499 (2023-09-21 15:16:28)

Função também faz parte do segmento VAR - VisuAlg


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
index 05ed4d76..411844eb 100644
--- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts
@@ -165,6 +165,11 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
 
             const simboloAtual = this.simbolos[this.atual];
             switch (simboloAtual.tipo) {
+                case tiposDeSimbolos.FUNCAO:
+                case tiposDeSimbolos.FUNÇÃO:
+                    const dadosFuncao = this.funcao('funcao');
+                    inicializacoes.push(dadosFuncao);
+                    break;
                 case tiposDeSimbolos.PROCEDIMENTO:
                     const dadosProcedimento = this.declaracaoProcedimento();
                     inicializacoes.push(dadosProcedimento);
@@ -376,6 +381,7 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
 
         while (![
                 tiposDeSimbolos.FIM_FUNCAO,
+                tiposDeSimbolos.FIM_FUNÇÃO,
                 tiposDeSimbolos.FIM_PROCEDIMENTO
             ].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal())
         {
diff --git a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
index b8397fe3..d3991298 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/visualg.ts
@@ -28,11 +28,13 @@ export const palavrasReservadas = {
     fimenquanto: tiposDeSimbolos.FIM_ENQUANTO,
     fimescolha: tiposDeSimbolos.FIM_ESCOLHA,
     fimfuncao: tiposDeSimbolos.FIM_FUNCAO,
+    fimfunção: tiposDeSimbolos.FIM_FUNÇÃO,
     fimpara: tiposDeSimbolos.FIM_PARA,
     fimprocedimento: tiposDeSimbolos.FIM_PROCEDIMENTO,
     fimrepita: tiposDeSimbolos.FIM_REPITA,
     fimse: tiposDeSimbolos.FIM_SE,
     funcao: tiposDeSimbolos.FUNCAO,
+    função: tiposDeSimbolos.FUNÇÃO,
     grauprad: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
     inicio: tiposDeSimbolos.INICIO,
     int: tiposDeSimbolos.METODO_BIBLIOTECA_GLOBAL,
diff --git a/fontes/tipos-de-simbolos/visualg.ts b/fontes/tipos-de-simbolos/visualg.ts
index 77ac8f3d..f0d39cf1 100644
--- a/fontes/tipos-de-simbolos/visualg.ts
+++ b/fontes/tipos-de-simbolos/visualg.ts
@@ -27,11 +27,13 @@ export default {
     FIM_ENQUANTO: 'FIM_ENQUANTO',
     FIM_ESCOLHA: 'FIM_ESCOLHA',
     FIM_FUNCAO: 'FIM_FUNCAO',
+    FIM_FUNÇÃO: 'FIM_FUNÇÃO',
     FIM_PARA: 'FIM_PARA',
     FIM_PROCEDIMENTO: 'FIM_PROCEDIMENTO',
     FIM_REPITA: 'FIM_REPITA',
     FIM_SE: 'FIM_SE',
     FUNCAO: 'FUNCAO',
+    FUNÇÃO: 'FUNÇÃO',
     IDENTIFICADOR: 'IDENTIFICADOR',
     IGUAL: 'IGUAL',
     INICIO: 'INICIO',


Test patch:
diff --git a/testes/visualg/interpretador.test.ts b/testes/visualg/interpretador.test.ts
index f0aa3a10..22b4c73d 100644
--- a/testes/visualg/interpretador.test.ts
+++ b/testes/visualg/interpretador.test.ts
@@ -115,6 +115,54 @@ describe('Interpretador', () => {
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
 
+            it('Sucesso - Equação Segundo Grau', async () => {
+                const respostas = [10, 21, 14];
+                interpretador.interfaceEntradaSaida = {
+                    question: (mensagem: string, callback: Function) => {
+                        callback(respostas.shift());
+                    }
+                };
+                const retornoLexador = lexador.mapear([
+                    'algoritmo "EquaçãoDoSegundoGrau"',
+                    'var',
+                       'a, b, c, delta, x1, x2: REAL',
+                    'função calcula_delta(): REAL',
+                    'var',
+                       'delta : REAL',
+                    'inicio',
+                        'delta := b*b - 4*a*c',
+                        'RETORNE delta',
+                    'fimfunção',
+                    'inicio',
+                        'ESCREVA ("Informe o valor de A: ")',
+                        'LEIA (a)',
+                        'ESCREVA ("Informe o valor de B: ")',
+                        'LEIA (b)',
+                        'ESCREVA ("Informe o valor de C: ")',
+                        'LEIA (c)',
+                        'delta := calcula_delta()',
+                        'SE ( delta < 0 ) ENTAO',
+                           'ESCREVA ("Esta equação não possui raízes reais.")',
+                        'SENAO',
+                            'SE (delta = 0) ENTAO',
+                               'x1 := (-b + RAIZQ(delta)) / (2*a)',
+                               'ESCREVA ("Esta equação possui apenas uma raiz: ", x1)',
+                            'SENAO',
+                                'x1 := (-b + RAIZQ(delta)) / (2*a)',
+                                'x2 := (-b - RAIZQ(delta)) / (2*a)',
+                                'ESCREVA ("Esta equação possui duas raízes: ", x1, " e ", x2)',
+                            'FIMSE',
+                        'FIMSE',
+                    'fimalgoritmo',
+                ], -1);
+    
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+    
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
+
             it('Sucesso - IMC', async () => {
                 // Aqui vamos simular a resposta para duas variáveis de `leia()`.
                 const respostas = [78, 1.78];