From 07bab236b76e14f93922dceb0f3e382346ed46da Mon Sep 17 00:00:00 2001 From: Samuel Vaz Date: Fri, 26 Jan 2024 21:36:38 -0300 Subject: [PATCH] Declaracao retorne de Portugol Studio --- .../avaliador-sintatico-portugol-studio.ts | 26 +++++++++++ .../palavras-reservadas/portugol-studio.ts | 1 + fontes/tipos-de-simbolos/portugol-studio.ts | 1 + testes/portugol-studio/interpretador.test.ts | 43 +++++++++++++++++++ 4 files changed, 71 insertions(+) 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', 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); + }); }); }); });