Repository: DesignLiquido/delegua (ts)

Issue:
`a = [ 3, 4]` deve inicializar uma lista na variável a
```potigol
a = [ 3, 4]
escreva(a)
escreva(a.qual_tipo)
```


![Image](https://github.com/DesignLiquido/delegua/assets/3980593/6601e5b0-192b-4049-a4ac-f8b1e65f8ad3)



Pull request description:
#524 inicializando e escrevendo vetores
resolve #524 

Patch:
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..30fbf723
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+    "recommendations": [
+        "firsttris.vscode-jest-runner"
+    ]
+}
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 5f8d2660..130401cc 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -724,7 +724,7 @@
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                "potigol/avaliador-sintatico.test",
+                "potigol/interpretador.test.ts",
                 "--runInBand"
             ],
             "skipFiles": [
diff --git a/fontes/analisador-semantico/README.md b/fontes/analisador-semantico/README.md
index 525146a4..222764c6 100644
--- a/fontes/analisador-semantico/README.md
+++ b/fontes/analisador-semantico/README.md
@@ -1,3 +1,3 @@
 # Analisador Semântico
 
-Analisadores Semânticos não exatamente executam código. A ideia é visitar as declarações geradas pelo Avaliador Sintático elemento a elemento, anotndo sequencialmente algumas informações, e conferindo outras. Se em algum momento algo não faz sentido, o Analisador Semântico anota uma observação no retorno.
\ No newline at end of file
+Analisadores Semânticos não exatamente executam código. A ideia é visitar as declarações geradas pelo Avaliador Sintático elemento a elemento, anotando sequencialmente algumas informações, e conferindo outras. Se em algum momento algo não faz sentido, o Analisador Semântico anota uma observação no retorno.
\ No newline at end of file
diff --git a/fontes/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.ts b/fontes/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.ts
index d9f378e9..5ee80c6f 100644
--- a/fontes/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.ts
+++ b/fontes/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.ts
@@ -15,6 +15,7 @@ import {
     Literal,
     Unario,
     Variavel,
+    Vetor,
 } from '../../../construtos';
 import {
     Escreva,
@@ -325,7 +326,23 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
                         this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
                         return new Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
                 }
+            case tiposDeSimbolos.COLCHETE_ESQUERDO:
+                this.avancarEDevolverAnterior();
+                let valores = [];
+
+                if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_DIREITO)) {
+                    return new Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
+                }
+
+                while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_DIREITO)) {
+                    const valor = this.atribuir();
+                    valores.push(valor);
+                    if (this.simbolos[this.atual].tipo !== tiposDeSimbolos.COLCHETE_DIREITO) {
+                        this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
+                    }
+                }
 
+                return new Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
             case tiposDeSimbolos.CARACTERE:
             case tiposDeSimbolos.INTEIRO:
             case tiposDeSimbolos.LOGICO:
@@ -365,7 +382,7 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
                     tiposDeSimbolos.PARENTESE_DIREITO,
                     `Esperado parêntese direito após número de parâmetros em chamada de ${simboloLeiaDefinido.lexema}.`
                 );
-                const leiaDefinido = new Leia(simboloLeiaDefinido, []);
+                const leiaDefinido = new LeiaMultiplo(simboloLeiaDefinido, []);
                 leiaDefinido.numeroArgumentosEsperados = parseInt(numeroArgumentosLeia.literal);
                 return leiaDefinido;
             default:
@@ -801,8 +818,10 @@ export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
 
             let tipoConversao: TiposDadosInterface;
             switch (inicializadorLeia.simbolo.tipo) {
-                case tiposDeSimbolos.LEIA_INTEIRO:
                 case tiposDeSimbolos.LEIA_INTEIROS:
+                    tipoConversao = 'inteiro[]';
+                    break;
+                case tiposDeSimbolos.LEIA_INTEIRO:
                     tipoConversao = 'inteiro';
                     break;
                 case tiposDeSimbolos.LEIA_REAL:
diff --git a/fontes/bibliotecas/dialetos/potigol/primitivas-vetor.ts b/fontes/bibliotecas/dialetos/potigol/primitivas-vetor.ts
index b790d578..86f654cd 100644
--- a/fontes/bibliotecas/dialetos/potigol/primitivas-vetor.ts
+++ b/fontes/bibliotecas/dialetos/potigol/primitivas-vetor.ts
@@ -45,6 +45,7 @@ export default {
     pegue_enquanto: (interpretador: VisitanteComumInterface, vetor: Array<any>): Promise<any> => Promise.resolve(),
     posição: (interpretador: VisitanteComumInterface, vetor: Array<any>, elemento: any): Promise<any> =>
         Promise.resolve(vetor.indexOf(elemento) + 1),
+    qual_tipo: (interpretador: VisitanteComumInterface, vetor: Array<any>): Promise<string> => Promise.resolve('Lista'),
     remova: (interpretador: VisitanteComumInterface, vetor: Array<any>, posicao: number): Promise<any> => {
         let copia = [...vetor];
         copia.splice(posicao - 1, 1);
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index d32b7fa8..7d382410 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -946,13 +946,12 @@ export class InterpretadorBase implements InterpretadorInterface {
         return Promise.reject('Importação de arquivos não suportada por Interpretador Base.');
     }
 
-    protected async avaliarArgumentosEscreva(argumentos: Construto[]): Promise<string> {
+    protected async avaliarArgumentosEscreva(argumentos: Construto[]): Promise<any> {
         let formatoTexto: string = '';
 
         for (const argumento of argumentos) {
             const resultadoAvaliacao = await this.avaliar(argumento);
             let valor = resultadoAvaliacao?.hasOwnProperty('valor') ? resultadoAvaliacao.valor : resultadoAvaliacao;
-
             formatoTexto += `${this.paraTexto(valor)} `;
         }
 
@@ -1460,7 +1459,7 @@ export class InterpretadorBase implements InterpretadorInterface {
             return formato.format(objeto);
         }
 
-        if (Array.isArray(objeto)) return objeto;
+        if (Array.isArray(objeto)) return `[${objeto.join(', ')}]`;;
         if (objeto.valor instanceof ObjetoPadrao) return objeto.valor.paraTexto();
         if (typeof objeto === 'object') return JSON.stringify(objeto);
 


Test patch:
diff --git a/testes/potigol/interpretador.test.ts b/testes/potigol/interpretador.test.ts
index daedea26..5b24f12b 100644
--- a/testes/potigol/interpretador.test.ts
+++ b/testes/potigol/interpretador.test.ts
@@ -44,5 +44,39 @@ describe('Interpretador', () => {
                 expect(retornoInterpretador.erros).toHaveLength(0);
             });
         });
+
+        describe('Declaração de lista', () => {
+            it('Dado em vetor, escreva deve imprirmir o vetor', async () => {
+                const retornoLexador = lexador.mapear([
+                    'a = [3, 4]',
+                    'escreva (a)'
+                ], -1);
+
+                // Substitua a função de saída
+                interpretador.funcaoDeRetorno = (saida: any) => {
+                    expect(saida).toEqual('[3, 4]');
+                };
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
+       
+            it.skip('WIP: Dado em vetor, escreva qual_tipo deve imprirmir Lista', async () => {
+                const retornoLexador = lexador.mapear([
+                    'a = [3, 4]',
+                    'escreva (a.qual_tipo)'
+                ], -1);
+
+                // Substitua a função de saída
+                interpretador.funcaoDeRetorno = (saida: any) => {
+                    expect(saida).toEqual("Lista");
+                };
+
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+                expect(retornoInterpretador.erros).toHaveLength(0);
+            });
+        })
     });
 });