@designliquido/delegua 1.7.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +10 -1
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +89 -0
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/analisador-semantico/analisador-semantico.d.ts +3 -9
  6. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  7. package/analisador-semantico/analisador-semantico.js +15 -59
  8. package/analisador-semantico/analisador-semantico.js.map +1 -1
  9. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +5 -6
  10. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  11. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +33 -43
  12. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  13. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +2 -1
  14. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  15. package/avaliador-sintatico/avaliador-sintatico-base.js +4 -0
  16. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  17. package/avaliador-sintatico/avaliador-sintatico.d.ts +8 -1
  18. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  19. package/avaliador-sintatico/avaliador-sintatico.js +57 -24
  20. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +2 -3
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  25. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +1 -2
  26. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  27. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  28. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +1 -2
  29. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  30. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
  31. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +1 -2
  32. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
  33. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  34. package/avaliador-sintatico/micro-avaliador-sintatico.js +10 -17
  35. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  36. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  37. package/bibliotecas/biblioteca-global.js +8 -42
  38. package/bibliotecas/biblioteca-global.js.map +1 -1
  39. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  40. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +4 -40
  41. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  42. package/bin/package.json +1 -1
  43. package/construtos/atribuir.d.ts.map +1 -1
  44. package/construtos/atribuir.js +9 -4
  45. package/construtos/atribuir.js.map +1 -1
  46. package/construtos/literal.d.ts +3 -3
  47. package/construtos/literal.d.ts.map +1 -1
  48. package/construtos/literal.js.map +1 -1
  49. package/declaracoes/const-multiplo.d.ts +3 -3
  50. package/declaracoes/const-multiplo.d.ts.map +1 -1
  51. package/declaracoes/const-multiplo.js.map +1 -1
  52. package/declaracoes/se.d.ts +6 -2
  53. package/declaracoes/se.d.ts.map +1 -1
  54. package/declaracoes/se.js.map +1 -1
  55. package/declaracoes/var-multiplo.d.ts +3 -3
  56. package/declaracoes/var-multiplo.d.ts.map +1 -1
  57. package/declaracoes/var-multiplo.js.map +1 -1
  58. package/inferenciador.d.ts +1 -3
  59. package/inferenciador.d.ts.map +1 -1
  60. package/inferenciador.js +0 -8
  61. package/inferenciador.js.map +1 -1
  62. package/interfaces/variavel-hipotetica-interface.d.ts +2 -2
  63. package/interfaces/variavel-hipotetica-interface.d.ts.map +1 -1
  64. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  65. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -10
  66. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  67. package/interpretador/interpretador-base.d.ts.map +1 -1
  68. package/interpretador/interpretador-base.js +0 -1
  69. package/interpretador/interpretador-base.js.map +1 -1
  70. package/package.json +1 -1
  71. package/tipos-de-simbolos/comum.d.ts +1 -0
  72. package/tipos-de-simbolos/comum.d.ts.map +1 -1
  73. package/tipos-de-simbolos/comum.js +1 -0
  74. package/tipos-de-simbolos/comum.js.map +1 -1
  75. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  76. package/tradutores/tradutor-javascript.js +57 -23
  77. package/tradutores/tradutor-javascript.js.map +1 -1
  78. package/umd/delegua.js +256 -188
  79. package/tipo-dados-elementar.d.ts +0 -2
  80. package/tipo-dados-elementar.d.ts.map +0 -1
  81. package/tipo-dados-elementar.js +0 -3
  82. package/tipo-dados-elementar.js.map +0 -1
package/umd/delegua.js CHANGED
@@ -56,6 +56,95 @@ class AnalisadorSemanticoBase {
56
56
  correcoes: correcoes,
57
57
  });
58
58
  }
59
+ comparacaoArgumentosContraParametrosFuncao(simboloFuncao, parametros, argumentos) {
60
+ if (parametros.length !== argumentos.length) {
61
+ this.erro(simboloFuncao, `Função '${simboloFuncao.lexema}' espera ${parametros.length} parâmetros. Atual: ${argumentos.length}.`);
62
+ }
63
+ for (let [indice, parametro] of parametros.entries()) {
64
+ const argumento = argumentos[indice];
65
+ if (argumento) {
66
+ // Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
67
+ // independentemente de ser um `Literal` (tipo já resolvido), `Variavel` (tipo inferido do
68
+ // escopo), `Binario`, `Agrupamento`, ou qualquer outro construto (retorna `null` quando
69
+ // o tipo não pode ser determinado em tempo de compilação).
70
+ const tipoArgumento = this.obterTipoExpressao(argumento);
71
+ // Validar apenas quando ambos os lados têm um tipo específico e determinável.
72
+ // Ignorar quando `tipoArgumento` é nulo (por exemplo, resultado de `Chamada`) ou `qualquer`,
73
+ // evitando falsos positivos para expressões cujo tipo é desconhecido em tempo de compilação.
74
+ if (tipoArgumento && tipoArgumento !== 'qualquer' && parametro.tipoDado) {
75
+ if (parametro.tipoDado === 'texto' && tipoArgumento !== 'texto') {
76
+ this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
77
+ }
78
+ else if (['inteiro', 'número', 'real'].includes(parametro.tipoDado)) {
79
+ // Delegua suporta conversões implícitas entre tipos numéricos, mas não
80
+ // entre texto e número.
81
+ if (!['inteiro', 'número', 'real'].includes(tipoArgumento)) {
82
+ this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
91
+ */
92
+ obterTipoExpressao(expressao) {
93
+ if (expressao instanceof construtos_1.Literal) {
94
+ return expressao.tipo;
95
+ }
96
+ if (expressao instanceof construtos_1.Variavel) {
97
+ const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
98
+ return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
99
+ }
100
+ if (expressao instanceof construtos_1.Binario) {
101
+ // Para binários, tentamos inferir o tipo baseado nos operandos
102
+ return this.inferirTipoBinario(expressao);
103
+ }
104
+ if (expressao instanceof construtos_1.Logico) {
105
+ // Operadores lógicos sempre retornam tipo lógico
106
+ return 'lógico';
107
+ }
108
+ if (expressao instanceof construtos_1.Agrupamento) {
109
+ return this.obterTipoExpressao(expressao.expressao);
110
+ }
111
+ if (expressao instanceof construtos_1.Leia) {
112
+ // leia() sempre retorna texto
113
+ return 'texto';
114
+ }
115
+ return null;
116
+ }
117
+ /**
118
+ * Infere o tipo de resultado de uma operação binária
119
+ */
120
+ inferirTipoBinario(binario) {
121
+ const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
122
+ const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
123
+ // Operadores de comparação sempre retornam lógico
124
+ if (operadoresComparacao.includes(binario.operador.tipo)) {
125
+ return 'lógico';
126
+ }
127
+ const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
128
+ const tipoDireita = this.obterTipoExpressao(binario.direita);
129
+ if (!tipoEsquerda || !tipoDireita) {
130
+ return null;
131
+ }
132
+ if (operadoresMatematicos.includes(binario.operador.tipo)) {
133
+ const tiposNumericos = ['inteiro', 'número', 'real'];
134
+ if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
135
+ // Se um dos lados é 'real', o resultado é 'real'
136
+ if (tipoEsquerda === 'real' || tipoDireita === 'real') {
137
+ return 'real';
138
+ }
139
+ return 'número';
140
+ }
141
+ // Concatenação de textos
142
+ if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
143
+ return 'texto';
144
+ }
145
+ }
146
+ return 'qualquer';
147
+ }
59
148
  /**
60
149
  * Marca as variáveis usadas em uma expressão.
61
150
  */
@@ -375,6 +464,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
375
464
  this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
376
465
  this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
377
466
  this.funcoes = {};
467
+ this.classesDeclararadas = new Set();
378
468
  this.atual = 0;
379
469
  this.diagnosticos = [];
380
470
  }
@@ -879,65 +969,6 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
879
969
  return null;
880
970
  }
881
971
  }
882
- /**
883
- * Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
884
- */
885
- obterTipoExpressao(expressao) {
886
- if (expressao instanceof construtos_1.Literal) {
887
- return expressao.tipo;
888
- }
889
- if (expressao instanceof construtos_1.Variavel) {
890
- const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
891
- return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
892
- }
893
- if (expressao instanceof construtos_1.Binario) {
894
- // Para binários, tentamos inferir o tipo baseado nos operandos
895
- return this.inferirTipoBinario(expressao);
896
- }
897
- if (expressao instanceof construtos_1.Logico) {
898
- // Operadores lógicos sempre retornam tipo lógico
899
- return 'lógico';
900
- }
901
- if (expressao instanceof construtos_1.Agrupamento) {
902
- return this.obterTipoExpressao(expressao.expressao);
903
- }
904
- if (expressao instanceof construtos_1.Leia) {
905
- // leia() sempre retorna texto
906
- return 'texto';
907
- }
908
- return null;
909
- }
910
- /**
911
- * Infere o tipo de resultado de uma operação binária
912
- */
913
- inferirTipoBinario(binario) {
914
- const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
915
- const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
916
- // Operadores de comparação sempre retornam lógico
917
- if (operadoresComparacao.includes(binario.operador.tipo)) {
918
- return 'lógico';
919
- }
920
- const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
921
- const tipoDireita = this.obterTipoExpressao(binario.direita);
922
- if (!tipoEsquerda || !tipoDireita) {
923
- return null;
924
- }
925
- if (operadoresMatematicos.includes(binario.operador.tipo)) {
926
- const tiposNumericos = ['inteiro', 'número', 'real'];
927
- if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
928
- // Se um dos lados é 'real', o resultado é 'real'
929
- if (tipoEsquerda === 'real' || tipoDireita === 'real') {
930
- return 'real';
931
- }
932
- return 'número';
933
- }
934
- // Concatenação de textos
935
- if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
936
- return 'texto';
937
- }
938
- }
939
- return 'qualquer';
940
- }
941
972
  verificarExistenciaConstruto(construto) {
942
973
  if (construto instanceof construtos_1.Variavel) {
943
974
  if (!this.gerenciadorEscopos.buscar(construto.simbolo.lexema)) {
@@ -1197,6 +1228,19 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1197
1228
  }
1198
1229
  return Promise.resolve();
1199
1230
  }
1231
+ visitarDeclaracaoClasse(declaracao) {
1232
+ if (declaracao.superClasse) {
1233
+ const nomeSuperclasse = declaracao.superClasse.simbolo.lexema;
1234
+ if (nomeSuperclasse === declaracao.simbolo.lexema) {
1235
+ this.erro(declaracao.superClasse.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1236
+ }
1237
+ else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
1238
+ this.erro(declaracao.superClasse.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1239
+ }
1240
+ }
1241
+ this.classesDeclararadas.add(declaracao.simbolo.lexema);
1242
+ return Promise.resolve();
1243
+ }
1200
1244
  visitarDeclaracaoDefinicaoFuncao(declaracao) {
1201
1245
  var _a;
1202
1246
  if (declaracao.funcao.tipo === undefined) {
@@ -1271,6 +1315,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1271
1315
  }
1272
1316
  async analisar(declaracoes) {
1273
1317
  this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
1318
+ this.classesDeclararadas = new Set();
1274
1319
  this.atual = 0;
1275
1320
  this.diagnosticos = [];
1276
1321
  try {
@@ -1501,6 +1546,10 @@ class AvaliadorSintaticoBase {
1501
1546
  }
1502
1547
  return false;
1503
1548
  }
1549
+ async declaracaoBloco() {
1550
+ const simboloInicioBloco = this.consumir(comum_1.default.CHAVE_ESQUERDA, "Esperado '{' para abertura de bloco.");
1551
+ return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
1552
+ }
1504
1553
  async finalizarChamada(entidadeChamada) {
1505
1554
  const argumentos = [];
1506
1555
  if (!this.verificarTipoSimboloAtual(comum_1.default.PARENTESE_DIREITO)) {
@@ -1931,7 +1980,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1931
1980
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
1932
1981
  */
1933
1982
  async resolverCompreensaoDeLista(retornoExpressao) {
1934
- this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificado.");
1983
+ this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificador.");
1935
1984
  this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
1936
1985
  const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
1937
1986
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
@@ -2098,8 +2147,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2098
2147
  case delegua_2.default.TEXTO:
2099
2148
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
2100
2149
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
2101
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
2102
- return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
2150
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
2103
2151
  case delegua_2.default.PARA:
2104
2152
  const simboloPara = this.avancarEDevolverAnterior();
2105
2153
  return await this.paraComoConstruto(simboloPara);
@@ -2227,6 +2275,50 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2227
2275
  }
2228
2276
  return tipoAcesso;
2229
2277
  }
2278
+ /**
2279
+ * Resolve um construto do tipo `Variavel`, `AcessoMetodoOuPropriedade` ou `AcessoIndiceVariavel`
2280
+ * para um `ElementoMontaoTipos` correspondente, caso exista.
2281
+ * @param construto O construto.
2282
+ * @returns O `ElementoMontaoTipos` correspondente ou `null` se não existir.
2283
+ */
2284
+ resolverElementoMontao(construto) {
2285
+ switch (construto.constructor) {
2286
+ case construtos_1.Variavel:
2287
+ try {
2288
+ const nomeVariavel = construto.simbolo.lexema;
2289
+ const elementoMontao = this.pilhaEscopos.obterElementoMontaoTipos(nomeVariavel);
2290
+ if (elementoMontao.endereco) {
2291
+ const referenciaMontaoTipos = this.montaoTipos.obterReferencia(construto.hashArquivo, construto.linha, elementoMontao.endereco);
2292
+ if (referenciaMontaoTipos instanceof elemento_montao_tipos_1.ElementoMontaoTipos) {
2293
+ return referenciaMontaoTipos;
2294
+ }
2295
+ return null;
2296
+ }
2297
+ return elementoMontao;
2298
+ }
2299
+ catch (_a) {
2300
+ return null;
2301
+ }
2302
+ case construtos_1.AcessoMetodoOuPropriedade: {
2303
+ const acesso = construto;
2304
+ const elementoObjeto = this.resolverElementoMontao(acesso.objeto);
2305
+ if (!elementoObjeto) {
2306
+ return null;
2307
+ }
2308
+ return elementoObjeto.subElementos[acesso.simbolo.lexema] || null;
2309
+ }
2310
+ case construtos_1.AcessoIndiceVariavel: {
2311
+ const acessoIndice = construto;
2312
+ const elementoObjeto = this.resolverElementoMontao(acessoIndice.entidadeChamada);
2313
+ if (!elementoObjeto || !(acessoIndice.indice instanceof construtos_1.Literal)) {
2314
+ return null;
2315
+ }
2316
+ return elementoObjeto.subElementos[String(acessoIndice.indice.valor)] || null;
2317
+ }
2318
+ default:
2319
+ return null;
2320
+ }
2321
+ }
2230
2322
  async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
2231
2323
  if (!this.simbolos[this.atual]) {
2232
2324
  return expressaoAnterior;
@@ -2244,12 +2336,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2244
2336
  // Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
2245
2337
  if (expressaoAnterior.tipo === 'dicionário' &&
2246
2338
  expressaoAnterior.constructor !== construtos_1.Dicionario) {
2247
- // TODO: Achar algum caso em que aqui não seja variável.
2248
- const nomeDicionario = expressaoAnterior.simbolo.lexema;
2249
- const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
2250
- const referenciaMontaoTipos = this.montaoTipos.obterReferencia(expressaoAnterior.hashArquivo, expressaoAnterior.linha, elementoDicionarioPilha.endereco);
2251
- if (nome.lexema in referenciaMontaoTipos.subElementos) {
2252
- tipoInferido = referenciaMontaoTipos.subElementos[nome.lexema].tipo;
2339
+ const elementoMontaoTipos = this.resolverElementoMontao(expressaoAnterior);
2340
+ if (elementoMontaoTipos &&
2341
+ nome.lexema in elementoMontaoTipos.subElementos) {
2342
+ tipoInferido = elementoMontaoTipos.subElementos[nome.lexema].tipo;
2253
2343
  }
2254
2344
  }
2255
2345
  const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
@@ -2746,8 +2836,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2746
2836
  }
2747
2837
  async logicaComumEnquanto() {
2748
2838
  const condicao = await this.expressao();
2749
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2750
- const corpo = await this.resolverDeclaracao();
2839
+ const corpo = await this.declaracaoBloco();
2751
2840
  return {
2752
2841
  condicao,
2753
2842
  corpo,
@@ -2851,7 +2940,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2851
2940
  return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
2852
2941
  }
2853
2942
  async logicaComumFazer() {
2854
- const caminhoFazer = await this.resolverDeclaracao();
2943
+ const caminhoFazer = await this.declaracaoBloco();
2855
2944
  this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
2856
2945
  const condicaoEnquanto = await this.expressao();
2857
2946
  return {
@@ -2863,8 +2952,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2863
2952
  try {
2864
2953
  this.blocos += 1;
2865
2954
  const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
2866
- return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, // TODO: Aqui pode ser um `Bloco`?
2867
- condicaoEnquanto);
2955
+ return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
2868
2956
  }
2869
2957
  finally {
2870
2958
  this.blocos -= 1;
@@ -2948,8 +3036,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2948
3036
  }
2949
3037
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
2950
3038
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
2951
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2952
- const corpo = await this.resolverDeclaracao();
3039
+ const corpo = await this.declaracaoBloco();
2953
3040
  return {
2954
3041
  nomeVariavelChave,
2955
3042
  nomeVariavelValor,
@@ -2987,8 +3074,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2987
3074
  tipoVariavelIteracao = tipoVetor.slice(0, -2);
2988
3075
  }
2989
3076
  this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
2990
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
2991
- const corpo = await this.resolverDeclaracao();
3077
+ const corpo = await this.declaracaoBloco();
2992
3078
  return {
2993
3079
  variavelIteracao,
2994
3080
  vetor: vetorOuDicionario,
@@ -3037,8 +3123,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3037
3123
  if (comParenteses) {
3038
3124
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
3039
3125
  }
3040
- // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
3041
- const corpo = await this.resolverDeclaracao();
3126
+ const corpo = await this.declaracaoBloco();
3042
3127
  return {
3043
3128
  inicializador,
3044
3129
  condicao,
@@ -3569,9 +3654,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3569
3654
  let superClasse = null;
3570
3655
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
3571
3656
  const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3572
- // TODO: Validar classes existentes?
3573
3657
  this.superclasseAtual = simboloSuperclasse.lexema;
3574
- // TODO: Colocar tipo aqui?
3575
3658
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
3576
3659
  }
3577
3660
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
@@ -3682,8 +3765,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3682
3765
  case delegua_2.default.AJUDA:
3683
3766
  return await this.declaracaoAjuda();
3684
3767
  case delegua_2.default.CHAVE_ESQUERDA:
3685
- const simboloInicioBloco = this.avancarEDevolverAnterior();
3686
- return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
3768
+ return await this.declaracaoBloco();
3687
3769
  case delegua_2.default.COMENTARIO:
3688
3770
  return this.declaracaoComentarioUmaLinha();
3689
3771
  case delegua_2.default.CONSTANTE:
@@ -5157,8 +5239,7 @@ class AvaliadorSintaticoPitugues {
5157
5239
  case pitugues_2.default.TEXTO:
5158
5240
  const simboloLiteral = this.avancarEDevolverAnterior();
5159
5241
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
5160
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
5161
- return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
5242
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
5162
5243
  case pitugues_2.default.TIPO:
5163
5244
  const simboloTipo = this.avancarEDevolverAnterior();
5164
5245
  this.consumir(pitugues_2.default.PARENTESE_ESQUERDO, "Esperado '(' após 'tipo'.");
@@ -5840,7 +5921,7 @@ class AvaliadorSintaticoPitugues {
5840
5921
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
5841
5922
  */
5842
5923
  async resolverCompreensaoDeLista(retornoExpressao) {
5843
- this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificado.");
5924
+ this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificador.");
5844
5925
  this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
5845
5926
  const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
5846
5927
  // TODO: Manter essa validação aqui? Se sim, como resolver a expressão?
@@ -6588,8 +6669,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
6588
6669
  case prisma_1.default.TEXTO:
6589
6670
  const simboloLiteral = this.avancarEDevolverAnterior();
6590
6671
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
6591
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
6592
- return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
6672
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
6593
6673
  case prisma_1.default.IDENTIFICADOR:
6594
6674
  const simboloIdentificador = this.avancarEDevolverAnterior();
6595
6675
  let tipoOperando;
@@ -7414,8 +7494,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
7414
7494
  case tenda_1.default.TEXTO:
7415
7495
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
7416
7496
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
7417
- const tipoDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
7418
- return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
7497
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
7419
7498
  case tenda_1.default.PARENTESE_ESQUERDO:
7420
7499
  this.avancarEDevolverAnterior();
7421
7500
  const expressao = await this.expressao();
@@ -8261,8 +8340,7 @@ class MicroAvaliadorSintaticoPitugues extends micro_avaliador_sintatico_base_1.M
8261
8340
  case pitugues_1.default.TEXTO:
8262
8341
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
8263
8342
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
8264
- const tiposDadosElementar = (0, inferenciador_1.tipoInferenciaParaTipoDadosElementar)(tipoInferido);
8265
- return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tiposDadosElementar);
8343
+ return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tipoInferido);
8266
8344
  case pitugues_1.default.IDENTIFICADOR:
8267
8345
  const simboloIdentificador = this.avancarEDevolverAnterior();
8268
8346
  return new construtos_1.Variavel(-1, simboloIdentificador);
@@ -8633,31 +8711,24 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
8633
8711
  const simboloAtual = this.simbolos[this.atual];
8634
8712
  let valores = [];
8635
8713
  switch (simboloAtual.tipo) {
8636
- // TODO: Verificar se vamos usar isso.
8637
- /* case tiposDeSimbolos.CHAVE_ESQUERDA:
8714
+ case delegua_1.default.CHAVE_ESQUERDA:
8638
8715
  this.avancarEDevolverAnterior();
8639
8716
  const chaves = [];
8640
8717
  valores = [];
8641
-
8642
- if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
8643
- return new Dicionario(-1, Number(this.linha), [], []);
8718
+ if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
8719
+ return new construtos_1.Dicionario(-1, Number(this.linha), [], []);
8644
8720
  }
8645
-
8646
- while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
8647
- const chave = this.atribuir();
8648
- this.consumir(tiposDeSimbolos.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
8649
- const valor = this.atribuir();
8650
-
8721
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
8722
+ const chave = this.declaracao();
8723
+ this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
8724
+ const valor = this.declaracao();
8651
8725
  chaves.push(chave);
8652
8726
  valores.push(valor);
8653
-
8654
- if (this.simbolos[this.atual].tipo !== tiposDeSimbolos.CHAVE_DIREITA) {
8655
- this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
8727
+ if (this.simbolos[this.atual].tipo !== delegua_1.default.CHAVE_DIREITA) {
8728
+ this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
8656
8729
  }
8657
8730
  }
8658
-
8659
- return new Dicionario(-1, Number(this.linha), chaves, valores); */
8660
- // TODO: Verificar se vamos usar isso.
8731
+ return new construtos_1.Dicionario(-1, Number(this.linha), chaves, valores);
8661
8732
  case delegua_1.default.COLCHETE_ESQUERDO:
8662
8733
  this.avancarEDevolverAnterior();
8663
8734
  valores = [];
@@ -9610,20 +9681,6 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
9610
9681
  }, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
9611
9682
  const valorVetor = interpretador.resolverValor(vetor);
9612
9683
  const valorFuncaoMapeamento = interpretador.resolverValor(funcaoMapeamento);
9613
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
9614
- // na avaliação sintática. Estudar remoção.
9615
- if (!Array.isArray(valorVetor)) {
9616
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9617
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9618
- linha: interpretador.linhaDeclaracaoAtual,
9619
- }, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
9620
- }
9621
- if (valorFuncaoMapeamento.constructor !== estruturas_1.DeleguaFuncao) {
9622
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9623
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9624
- linha: interpretador.linhaDeclaracaoAtual,
9625
- }, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
9626
- }
9627
9684
  const resultados = [];
9628
9685
  for (let indice = 0; indice < valorVetor.length; ++indice) {
9629
9686
  const informacoesRetorno = await valorFuncaoMapeamento.chamar(interpretador, [
@@ -9790,20 +9847,6 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
9790
9847
  const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
9791
9848
  ? funcaoFiltragem.valor
9792
9849
  : funcaoFiltragem;
9793
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
9794
- // na avaliação sintática. Estudar remoção.
9795
- if (!Array.isArray(valorVetor)) {
9796
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9797
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9798
- linha: interpretador.linhaDeclaracaoAtual,
9799
- }, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
9800
- }
9801
- if (valorFuncaoFiltragem.constructor !== estruturas_1.DeleguaFuncao) {
9802
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
9803
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
9804
- linha: interpretador.linhaDeclaracaoAtual,
9805
- }, 'Parâmetro inválido. O segundo parâmetro da função paraCada() deve ser uma função.'));
9806
- }
9807
9850
  for (let indice = 0; indice < valorVetor.length; ++indice) {
9808
9851
  await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
9809
9852
  }
@@ -10069,21 +10112,11 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
10069
10112
  */
10070
10113
  async function tupla(interpretador, vetor) {
10071
10114
  const valorVetor = interpretador.resolverValor(vetor);
10072
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
10073
- // na avaliação sintática. Estudar remoção.
10074
- if (!Array.isArray(valorVetor)) {
10075
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10076
- hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
10077
- linha: interpretador.linhaDeclaracaoAtual,
10078
- }, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
10079
- }
10080
10115
  const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
10081
10116
  return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
10082
10117
  }
10083
10118
  async function vetor(interpretador, tupla) {
10084
10119
  const objetoTupla = interpretador.resolverValor(tupla);
10085
- // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
10086
- // na avaliação sintática. Estudar remoção.
10087
10120
  if (!(objetoTupla instanceof construtos_1.Tupla || objetoTupla instanceof construtos_1.TuplaN)) {
10088
10121
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
10089
10122
  hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
@@ -10096,16 +10129,20 @@ async function vetor(interpretador, tupla) {
10096
10129
  }
10097
10130
  else {
10098
10131
  const nomeClasse = objetoTupla.constructor.name;
10099
- if (mapaPropriedadesTuplas.hasOwnProperty(nomeClasse)) {
10100
- const props = mapaPropriedadesTuplas[nomeClasse];
10132
+ const props = mapaPropriedadesTuplas[nomeClasse];
10133
+ if (props) {
10101
10134
  resultado = props.map(prop => objetoTupla[prop]);
10102
10135
  }
10103
10136
  else if (objetoTupla.elementos && Array.isArray(objetoTupla.elementos)) {
10104
10137
  resultado = objetoTupla.elementos;
10105
10138
  }
10106
10139
  }
10107
- const resultadoFinal = resultado.map(item => (item && item.hasOwnProperty('valor')) ? item.valor : item);
10108
- return Promise.resolve(resultadoFinal);
10140
+ const resultadoFinal = new Array(resultado.length);
10141
+ for (let i = 0; i < resultado.length; i++) {
10142
+ const item = resultado[i];
10143
+ resultadoFinal[i] = item && typeof item === 'object' && 'valor' in item ? item.valor : item;
10144
+ }
10145
+ return resultadoFinal;
10109
10146
  }
10110
10147
 
10111
10148
  },{"../construtos":62,"../excecoes":129,"../interpretador/estruturas":176,"../interpretador/estruturas/descritor-tipo-classe":174,"../interpretador/estruturas/funcao-padrao":175,"../interpretador/estruturas/objeto-delegua-classe":180,"../quebras":212}],28:[function(require,module,exports){
@@ -11350,19 +11387,24 @@ exports.AtribuicaoPorIndicesMatriz = AtribuicaoPorIndicesMatriz;
11350
11387
  "use strict";
11351
11388
  Object.defineProperty(exports, "__esModule", { value: true });
11352
11389
  exports.Atribuir = void 0;
11390
+ const variavel_1 = require("./variavel");
11353
11391
  /**
11354
11392
  * Construto de atribuição de um valor a um símbolo.
11355
11393
  */
11356
11394
  class Atribuir {
11357
- constructor(hashArquivo, alvo, valor,
11358
- // indice so é usado para variaveis de vetores
11359
- // TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
11360
- indice, simboloOperador) {
11395
+ constructor(hashArquivo, alvo, valor, indice, simboloOperador) {
11361
11396
  this.linha = Number(alvo.linha);
11362
11397
  this.hashArquivo = hashArquivo;
11363
11398
  this.alvo = alvo;
11364
11399
  this.valor = valor;
11365
11400
  if (indice !== undefined) {
11401
+ const alvoComoVariavel = alvo;
11402
+ const tipoAlvo = alvoComoVariavel === null || alvoComoVariavel === void 0 ? void 0 : alvoComoVariavel.tipo;
11403
+ const alvoSuportaIndice = alvo instanceof variavel_1.Variavel &&
11404
+ (tipoAlvo === 'vetor' || tipoAlvo === 'dicionário' || tipoAlvo === 'qualquer' || (tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
11405
+ if (!alvoSuportaIndice) {
11406
+ throw new Error("`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.");
11407
+ }
11366
11408
  this.indice = indice;
11367
11409
  }
11368
11410
  if (simboloOperador !== undefined) {
@@ -11385,7 +11427,7 @@ class Atribuir {
11385
11427
  }
11386
11428
  exports.Atribuir = Atribuir;
11387
11429
 
11388
- },{}],45:[function(require,module,exports){
11430
+ },{"./variavel":89}],45:[function(require,module,exports){
11389
11431
  "use strict";
11390
11432
  Object.defineProperty(exports, "__esModule", { value: true });
11391
11433
  exports.Binario = void 0;
@@ -15435,7 +15477,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15435
15477
  Object.defineProperty(exports, "__esModule", { value: true });
15436
15478
  exports.TipoNativoSimbolo = void 0;
15437
15479
  exports.inferirTipoVariavel = inferirTipoVariavel;
15438
- exports.tipoInferenciaParaTipoDadosElementar = tipoInferenciaParaTipoDadosElementar;
15439
15480
  const primitivos_1 = __importDefault(require("./tipos-de-dados/primitivos"));
15440
15481
  const delegua_1 = __importDefault(require("./tipos-de-dados/delegua"));
15441
15482
  const delegua_2 = __importDefault(require("./tipos-de-simbolos/delegua"));
@@ -15549,13 +15590,6 @@ function inferirTipoVariavel(variavel) {
15549
15590
  return 'símbolo';
15550
15591
  }
15551
15592
  }
15552
- function tipoInferenciaParaTipoDadosElementar(tipoInferencia) {
15553
- switch (tipoInferencia) {
15554
- // TODO: Colocar exceções aqui.
15555
- default:
15556
- return tipoInferencia;
15557
- }
15558
- }
15559
15593
 
15560
15594
  },{"./tipos-de-dados/delegua":213,"./tipos-de-dados/primitivos":215,"./tipos-de-simbolos/delegua":218}],136:[function(require,module,exports){
15561
15595
  "use strict";
@@ -18124,7 +18158,6 @@ class InterpretadorBase {
18124
18158
  return await this.executar(declaracao.caminhoEntao);
18125
18159
  }
18126
18160
  for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
18127
- // TODO: Qual o tipo de `atual`?
18128
18161
  const atual = declaracao.caminhosSeSenao[i];
18129
18162
  if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
18130
18163
  return await this.executar(atual.caminho);
@@ -24742,6 +24775,7 @@ exports.default = {
24742
24775
  Object.defineProperty(exports, "__esModule", { value: true });
24743
24776
  exports.default = {
24744
24777
  ADICAO: 'ADICAO',
24778
+ CHAVE_ESQUERDA: 'CHAVE_ESQUERDA',
24745
24779
  DIFERENTE: 'DIFERENTE',
24746
24780
  DIVISAO: 'DIVISAO',
24747
24781
  DIVISAO_INTEIRA: 'DIVISAO_INTEIRA',
@@ -41595,14 +41629,22 @@ class TradutorJavaScript {
41595
41629
  case 'adicionar':
41596
41630
  case 'empilhar':
41597
41631
  return `${objetoResolvido}.push(${textoArgumentos})`;
41632
+ case 'concatenar':
41633
+ return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
41634
+ case 'encaixar':
41635
+ return `${objetoResolvido}.splice(${textoArgumentos})`;
41598
41636
  case 'fatiar':
41599
- return `${objetoResolvido}.slice(${argumentos[0]}, ${argumentos[1]})`;
41637
+ return `${objetoResolvido}.slice(${textoArgumentos})`;
41638
+ case 'filtrarPor':
41639
+ return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
41600
41640
  case 'inclui':
41601
41641
  return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
41602
41642
  case 'inverter':
41603
41643
  return `${objetoResolvido}.toReversed()`;
41604
41644
  case 'juntar':
41605
- return `${argumentosResolvidos[0]}.join(${objetoResolvido})`;
41645
+ return argumentosResolvidos.length > 0
41646
+ ? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
41647
+ : `${objetoResolvido}.join()`;
41606
41648
  case 'maiusculo':
41607
41649
  return `${objetoResolvido}.toUpperCase()`;
41608
41650
  case 'mapear':
@@ -41610,9 +41652,11 @@ class TradutorJavaScript {
41610
41652
  case 'minusculo':
41611
41653
  return `${objetoResolvido}.toLowerCase()`;
41612
41654
  case 'ordenar':
41613
- return `${objetoResolvido}.sort()`;
41655
+ return argumentosResolvidos.length > 0
41656
+ ? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
41657
+ : `${objetoResolvido}.sort()`;
41614
41658
  case 'remover':
41615
- return `delete ${objetoResolvido}[${argumentosResolvidos[0]}]`;
41659
+ return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
41616
41660
  case 'removerPrimeiro':
41617
41661
  return `${objetoResolvido}.shift()`;
41618
41662
  case 'removerUltimo':
@@ -42030,9 +42074,26 @@ class TradutorJavaScript {
42030
42074
  }
42031
42075
  return resultado;
42032
42076
  }
42033
- // TODO: Talvez terminar (ou remover, sei lá).
42034
42077
  traduzirFuncaoAnonimaParaLambda(argumento) {
42035
- return '';
42078
+ var _a, _b, _c;
42079
+ if (argumento instanceof construtos_1.FuncaoConstruto) {
42080
+ const params = argumento.parametros.map((p) => p.nome.lexema).join(', ');
42081
+ // Retorno de um valor → retorno conciso
42082
+ if (argumento.corpo.length === 1 && argumento.corpo[0] instanceof declaracoes_1.Retorna) {
42083
+ const retorna = argumento.corpo[0];
42084
+ const expr = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
42085
+ return `(${params}) => ${expr}`;
42086
+ }
42087
+ // O JavaScript não tem suporte nativo para blocos de função anônimos, então usamos uma função de seta com corpo de bloco.
42088
+ return `(${params}) => ${this.logicaComumBlocoEscopo(argumento.corpo)}`;
42089
+ }
42090
+ if (argumento instanceof construtos_1.Variavel) {
42091
+ return argumento.simbolo.lexema;
42092
+ }
42093
+ if (argumento instanceof construtos_1.ReferenciaFuncao || argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
42094
+ return argumento.simboloFuncao.lexema;
42095
+ }
42096
+ return (_c = (_b = (_a = this.dicionarioConstrutos)[argumento.constructor.name]) === null || _b === void 0 ? void 0 : _b.call(_a, argumento)) !== null && _c !== void 0 ? _c : '';
42036
42097
  }
42037
42098
  traduzirExpressaoAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
42038
42099
  const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
@@ -42041,34 +42102,43 @@ class TradutorJavaScript {
42041
42102
  const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
42042
42103
  argumentosResolvidos.push(argumentoResolvido);
42043
42104
  }
42105
+ const textoArgumentos = argumentosResolvidos.join(', ');
42044
42106
  switch (nomeMetodo) {
42045
42107
  case 'adicionar':
42046
42108
  case 'empilhar':
42047
- let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
42048
- textoArgumentos = textoArgumentos.slice(0, -2);
42049
42109
  return `${objetoResolvido}.push(${textoArgumentos})`;
42110
+ case 'concatenar':
42111
+ return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
42112
+ case 'encaixar':
42113
+ return `${objetoResolvido}.splice(${textoArgumentos})`;
42050
42114
  case 'fatiar':
42051
- return `${objetoResolvido}[${argumentos[0]}:${argumentos[1]}]`;
42115
+ return `${objetoResolvido}.slice(${textoArgumentos})`;
42116
+ case 'filtrarPor':
42117
+ return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
42052
42118
  case 'inclui':
42053
- return `${argumentos[0]} in ${objetoResolvido}`;
42119
+ return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
42054
42120
  case 'inverter':
42055
- return `reversed(${objetoResolvido})`;
42121
+ return `${objetoResolvido}.toReversed()`;
42056
42122
  case 'juntar':
42057
- return `${argumentos[0]}.join(${objetoResolvido})`;
42123
+ return argumentosResolvidos.length > 0
42124
+ ? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
42125
+ : `${objetoResolvido}.join()`;
42058
42126
  case 'mapear':
42059
- return `list(map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])}), ${objetoResolvido})`;
42127
+ return `${objetoResolvido}.map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
42060
42128
  case 'ordenar':
42061
- return `${objetoResolvido}.sort()`;
42129
+ return argumentosResolvidos.length > 0
42130
+ ? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
42131
+ : `${objetoResolvido}.sort()`;
42062
42132
  case 'remover':
42063
- return `del ${objetoResolvido}[${argumentos[0]}]`;
42133
+ return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
42064
42134
  case 'removerPrimeiro':
42065
- return `del ${objetoResolvido}[0]`;
42135
+ return `${objetoResolvido}.shift()`;
42066
42136
  case 'removerUltimo':
42067
- return `del ${objetoResolvido}[-1]`;
42137
+ return `${objetoResolvido}.pop()`;
42068
42138
  case 'somar':
42069
- return `sum(${objetoResolvido})`;
42139
+ return `${objetoResolvido}.reduce((acumulador, valorAtual) => acumulador + valorAtual, 0)`;
42070
42140
  case 'tamanho':
42071
- return `len(${objetoResolvido})`;
42141
+ return `${objetoResolvido}.length`;
42072
42142
  }
42073
42143
  }
42074
42144
  traduzirExpressaoAcessoMetodo(acessoMetodo, argumentos) {
@@ -42117,16 +42187,14 @@ class TradutorJavaScript {
42117
42187
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
42118
42188
  return `${direita} ${operador} ${esquerda}`;
42119
42189
  }
42120
- // TODO: Eliminar o soft cast para `any`.
42121
42190
  traduzirExpressaoAtribuicaoPorIndice(AtribuicaoPorIndice) {
42122
- var _a, _b;
42123
42191
  let resultado = '';
42124
42192
  resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
42125
42193
  resultado +=
42126
42194
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
42127
42195
  resultado += ' = ';
42128
- if ((_b = (_a = AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor) === null || _a === void 0 ? void 0 : _a.simbolo) === null || _b === void 0 ? void 0 : _b.lexema) {
42129
- resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
42196
+ if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
42197
+ resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
42130
42198
  }
42131
42199
  else {
42132
42200
  resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);