Repository: DesignLiquido/delegua
Pull request #596 (2024-01-26 15:07:46)

Erro faca-enquanto com negação
Resolve: https://github.com/DesignLiquido/delegua/issues/595


Patch:
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
index 8b8d416e..97743f03 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.ts
@@ -33,7 +33,6 @@ import { ParametroInterface, SimboloInterface } from '../../interfaces';
 
 import tiposDeSimbolos from '../../tipos-de-simbolos/portugol-studio';
 import { RetornoDeclaracao } from '../retornos';
-import { DeleguaFuncao } from '../../estruturas';
 import { ErroAvaliadorSintatico } from '../erro-avaliador-sintatico';
 
 /**
@@ -534,7 +533,7 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
             );
 
             // Inicializações de variáveis podem ter valores definidos.
-            let valorInicializacao = 0;
+            let valorInicializacao: any = false;
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
                 if (![tiposDeSimbolos.VERDADEIRO, tiposDeSimbolos.FALSO].includes(this.simbolos[this.atual].tipo)) {
                     throw this.erro(
@@ -546,7 +545,7 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
                 valorInicializacao = Number(literalInicializacao.literal);
             }
 
-            inicializacoes.push(new Var(identificador, new Literal(this.hashArquivo, Number(simboloLogico.linha), 0)));
+            inicializacoes.push(new Var(identificador, new Literal(this.hashArquivo, Number(simboloLogico.linha), valorInicializacao)));
         } while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
 
         return inicializacoes;
diff --git a/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts b/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
index 1a422b1d..9175a962 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.ts
@@ -13,6 +13,7 @@ export const palavrasReservadas = {
     inteiro: tiposDeSimbolos.INTEIRO,
     leia: tiposDeSimbolos.LEIA,
     logico: tiposDeSimbolos.LOGICO,
+    nao: tiposDeSimbolos.NEGACAO,
     ou: tiposDeSimbolos.OU,
     para: tiposDeSimbolos.PARA,
     programa: tiposDeSimbolos.PROGRAMA,


Test patch:
diff --git a/testes/portugol-studio/interpretador.test.ts b/testes/portugol-studio/interpretador.test.ts
index 55b17a96..26ea5291 100644
--- a/testes/portugol-studio/interpretador.test.ts
+++ b/testes/portugol-studio/interpretador.test.ts
@@ -149,6 +149,32 @@ describe('Interpretador (Portugol Studio)', () => {
 
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
+
+            it('Faca', async () => {
+                const retornoLexador = lexador.mapear([
+                    'programa',
+                    '{',
+                    '   ',
+                    '    funcao inicio()',
+                    '    {',
+                    '        inteiro valor = 2',
+                    '        logico eNegativo',
+                    '        faca',
+                    '        {',
+                    '           escreva("Ok\t", valor,"\n")',
+                    '           valor--',
+                    '           eNegativo = valor < 0',
+                    '        }',
+                    '        enquanto(nao eNegativo)',
+                    '    }',
+                    '}'
+                ], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
         });
     });
 });