Repository: DesignLiquido/delegua
Pull request #600 (2024-01-27 00:39:35)

Declaracao retorne de Portugol Studio


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
index 7128a6a5..86500d6a 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
@@ -26,6 +26,7 @@ import {
     Var,
     Bloco,
     EscrevaMesmaLinha,
+    Retorna,
 } from '../../declaracoes';
 import { RetornoLexador, RetornoAvaliadorSintatico } from '../../interfaces/retornos';
 import { AvaliadorSintaticoBase } from '../avaliador-sintatico-base';
@@ -563,6 +564,29 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
         return inicializacoes;
     }
 
+    declaracaoRetorne(): Retorna {
+        this.avancarEDevolverAnterior()
+        const simboloChave = this.simbolos[this.atual];
+        let valor = null;
+
+        if (
+            [
+                tiposDeSimbolos.CADEIA,
+                tiposDeSimbolos.CARACTER,
+                tiposDeSimbolos.FALSO,
+                tiposDeSimbolos.IDENTIFICADOR,
+                tiposDeSimbolos.INTEIRO,
+                tiposDeSimbolos.NEGACAO,
+                tiposDeSimbolos.REAL,
+                tiposDeSimbolos.VERDADEIRO,
+            ].includes(this.simbolos[this.atual].tipo)
+        ) {
+            valor = this.expressao();
+        }
+
+        return new Retorna(simboloChave, valor);
+    }
+
     declaracaoPara(): Para {
         try {
             const simboloPara: SimboloInterface = this.avancarEDevolverAnterior();
@@ -687,6 +711,8 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
                 return null;
             case tiposDeSimbolos.REAL:
                 return this.declaracaoReais();
+            case tiposDeSimbolos.RETORNE:
+                return this.declaracaoRetorne();
             case tiposDeSimbolos.SE:
                 return this.declaracaoSe();
             default:
diff --git a/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts b/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
index 9175a962..6378e5eb 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
@@ -18,6 +18,7 @@ export const palavrasReservadas = {
     para: tiposDeSimbolos.PARA,
     programa: tiposDeSimbolos.PROGRAMA,
     real: tiposDeSimbolos.REAL,
+    retorne: tiposDeSimbolos.RETORNE,
     se: tiposDeSimbolos.SE,
     senao: tiposDeSimbolos.SENAO,
     vazio: tiposDeSimbolos.VAZIO,
diff --git a/fontes/tipos-de-simbolos/portugol-studio.ts b/fontes/tipos-de-simbolos/portugol-studio.ts
index 225923ea..0b06c953 100644
--- a/fontes/tipos-de-simbolos/portugol-studio.ts
+++ b/fontes/tipos-de-simbolos/portugol-studio.ts
@@ -42,6 +42,7 @@ export default {
     PONTO: 'PONTO',
     PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
     PROGRAMA: 'PROGRAMA',
+    RETORNE: 'RETORNE',
     REAL: 'REAL',
     SUBTRACAO: 'SUBTRACAO',
     VIRGULA: 'VIRGULA',


Test patch:
diff --git a/testes/portugol-studio/interpretador.test.ts b/testes/portugol-studio/interpretador.test.ts
index 10c1e7e6..994167fb 100644
--- a/testes/portugol-studio/interpretador.test.ts
+++ b/testes/portugol-studio/interpretador.test.ts
@@ -228,6 +228,49 @@ describe('Interpretador (Portugol Studio)', () => {
 
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
+
+            it('Retorne', async () => {
+                const respostas = [1];
+                interpretador.interfaceEntradaSaida = {
+                    question: (mensagem: string, callback: Function) => {
+                        callback(respostas.pop());
+                    }
+                };
+
+                const retornoLexador = lexador.mapear([
+                    'programa',
+                    '{  ',
+                        'funcao inicio()',
+                        '{  ',
+                            'inteiro numero',
+                            'escreva("Quantos elementos da sequência de Fibonacci deseja calcular? ")',
+                            'leia(numero)',
+                            'para (inteiro i = 1; i <= numero ; i++)',
+                            '{',
+                            '   escreva(fibonacci(i), " ")',
+                            '}',
+                            'escreva("\n")',
+                        '}',
+                        'funcao inteiro fibonacci(inteiro posicao)',
+                        '{	',
+                            'se (posicao == 1)',
+                            '{',
+                                'retorne 0',
+                            '}',
+                            'senao se (posicao == 2)',
+                            '{',
+                                'retorne 1',
+                            '}',                    
+                            'retorne fibonacci(posicao - 1) + fibonacci(posicao - 2)',
+                        '}',
+                    '}',
+                ], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
         });
     });
 });