@designliquido/delegua 0.57.2 → 0.59.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 (113) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts +7 -1
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js +74 -14
  4. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +3 -3
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +26 -10
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  9. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts +23 -0
  10. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -0
  11. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +199 -0
  12. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -0
  13. package/avaliador-sintatico/elemento-montao-tipos.d.ts.map +1 -1
  14. package/avaliador-sintatico/elemento-montao-tipos.js.map +1 -1
  15. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  16. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  17. package/avaliador-sintatico/montao-tipos.d.ts +1 -1
  18. package/avaliador-sintatico/montao-tipos.d.ts.map +1 -1
  19. package/avaliador-sintatico/montao-tipos.js.map +1 -1
  20. package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
  21. package/avaliador-sintatico/pilha-escopos.js.map +1 -1
  22. package/bibliotecas/biblioteca-global.d.ts +7 -0
  23. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  24. package/bibliotecas/biblioteca-global.js +206 -0
  25. package/bibliotecas/biblioteca-global.js.map +1 -1
  26. package/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts.map +1 -1
  27. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js +8 -2
  28. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js.map +1 -1
  29. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +169 -0
  30. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -0
  31. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +686 -0
  32. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -0
  33. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts +6 -0
  34. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts.map +1 -0
  35. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +56 -0
  36. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -0
  37. package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts +6 -0
  38. package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts.map +1 -0
  39. package/bibliotecas/dialetos/pitugues/primitivas-numero.js +84 -0
  40. package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -0
  41. package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts +6 -0
  42. package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -0
  43. package/bibliotecas/dialetos/pitugues/primitivas-texto.js +254 -0
  44. package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -0
  45. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts +6 -0
  46. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -0
  47. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +373 -0
  48. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -0
  49. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  50. package/bibliotecas/primitivas-vetor.js +6 -5
  51. package/bibliotecas/primitivas-vetor.js.map +1 -1
  52. package/bin/package.json +1 -1
  53. package/construtos/elvis.d.ts +2 -2
  54. package/construtos/elvis.d.ts.map +1 -1
  55. package/construtos/elvis.js.map +1 -1
  56. package/construtos/enquanto-como-construto.d.ts +4 -4
  57. package/construtos/fazer-como-construto.d.ts +4 -4
  58. package/construtos/importar-como-construto.d.ts +3 -3
  59. package/construtos/importar-como-construto.d.ts.map +1 -1
  60. package/construtos/importar-como-construto.js.map +1 -1
  61. package/construtos/para-cada-como-construto.d.ts +6 -6
  62. package/construtos/para-como-construto.d.ts +4 -4
  63. package/construtos/se-ternario.d.ts +2 -2
  64. package/formatadores/formatador-pitugues.d.ts.map +1 -1
  65. package/formatadores/formatador-pitugues.js.map +1 -1
  66. package/geracao-identificadores/index.d.ts.map +1 -1
  67. package/geracao-identificadores/index.js.map +1 -1
  68. package/informacao-elemento-sintatico.d.ts +1 -1
  69. package/interfaces/delegua/enquanto-interface.d.ts +2 -2
  70. package/interfaces/delegua/fazer-interface.d.ts +2 -2
  71. package/interfaces/delegua/para-cada-interface.d.ts +2 -2
  72. package/interfaces/delegua/para-interface.d.ts +2 -2
  73. package/interfaces/visitante-comum-interface.d.ts.map +1 -1
  74. package/interfaces/visitante-delegua-interface.d.ts +3 -3
  75. package/interfaces/visitante-delegua-interface.d.ts.map +1 -1
  76. package/interpretador/comum.d.ts.map +1 -1
  77. package/interpretador/comum.js +1 -0
  78. package/interpretador/comum.js.map +1 -1
  79. package/interpretador/depuracao/comum.d.ts.map +1 -1
  80. package/interpretador/depuracao/comum.js +6 -3
  81. package/interpretador/depuracao/comum.js.map +1 -1
  82. package/interpretador/dialetos/pitugues/index.d.ts +2 -0
  83. package/interpretador/dialetos/pitugues/index.d.ts.map +1 -0
  84. package/interpretador/dialetos/pitugues/index.js +18 -0
  85. package/interpretador/dialetos/pitugues/index.js.map +1 -0
  86. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +17 -0
  87. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -0
  88. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +248 -0
  89. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -0
  90. package/interpretador/estruturas/classe-de-modulo.d.ts +1 -1
  91. package/interpretador/estruturas/classe-de-modulo.d.ts.map +1 -1
  92. package/interpretador/estruturas/classe-de-modulo.js.map +1 -1
  93. package/interpretador/interpretador-base.d.ts.map +1 -1
  94. package/interpretador/interpretador-base.js +6 -5
  95. package/interpretador/interpretador-base.js.map +1 -1
  96. package/interpretador/interpretador.d.ts +5 -0
  97. package/interpretador/interpretador.d.ts.map +1 -1
  98. package/interpretador/interpretador.js +39 -22
  99. package/interpretador/interpretador.js.map +1 -1
  100. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  101. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +1 -0
  102. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
  103. package/lexador/dialetos/palavras-reservadas/pitugues.js +2 -1
  104. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -1
  105. package/package.json +1 -1
  106. package/quebras/index.d.ts.map +1 -1
  107. package/quebras/index.js.map +1 -1
  108. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  109. package/tipos-de-simbolos/pitugues.js.map +1 -1
  110. package/tradutores/tradutor-javascript.js.map +1 -1
  111. package/tradutores/tradutor-python.d.ts.map +1 -1
  112. package/tradutores/tradutor-python.js.map +1 -1
  113. package/umd/delegua.js +363 -60
package/umd/delegua.js CHANGED
@@ -293,6 +293,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
293
293
  this.primitivasConhecidas = {};
294
294
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
295
295
  this.montaoTipos = new montao_tipos_1.MontaoTipos();
296
+ this.intuirTipoQualquerParaIdentificadores = false;
296
297
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'dicionário', primitivas_dicionario_1.default);
297
298
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'número', primitivas_numero_1.default);
298
299
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'texto', primitivas_texto_1.default);
@@ -443,6 +444,39 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
443
444
  this.blocos -= 1;
444
445
  }
445
446
  }
447
+ /**
448
+ * Resolve uma lista de compreensão.
449
+ * @returns {ListaCompreensao} A lista de compreensão resolvida.
450
+ */
451
+ resolverCompreensaoDeLista(retornoExpressao) {
452
+ this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificado.");
453
+ this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
454
+ const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
455
+ if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
456
+ throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução em lista de compreensão.");
457
+ }
458
+ const localizacaoVetor = this.simboloAnterior();
459
+ const vetor = this.ou();
460
+ let condicao = null;
461
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SE)) {
462
+ condicao = this.expressao();
463
+ }
464
+ else {
465
+ condicao = new declaracoes_1.Expressao(new construtos_1.Literal(this.hashArquivo, Number(localizacaoVetor.linha), true));
466
+ }
467
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, 'Espero fechamento de colchetes após condição.');
468
+ const tipoVetor = vetor.tipo;
469
+ if (!tipoVetor.endsWith('[]') && !['qualquer', 'vetor'].includes(tipoVetor)) {
470
+ throw this.erro(localizacaoVetor, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
471
+ }
472
+ const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao);
473
+ return new construtos_1.ListaCompreensao(Number(this.simbolos[this.atual]), this.hashArquivo, retornoExpressao, vetor, new construtos_1.ParaCadaComoConstruto(retornoExpressao.hashArquivo, retornoExpressao.linha, variavelIteracao, vetor, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
474
+ new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
475
+ new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao),
476
+ ]), [], null),
477
+ ])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
478
+ );
479
+ }
446
480
  primario() {
447
481
  const simboloAtual = this.simbolos[this.atual];
448
482
  let valores = [];
@@ -458,6 +492,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
458
492
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
459
493
  return this.construtoTupla();
460
494
  }
495
+ // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
496
+ // de lista serão tratados como 'qualquer', para evitar erros de tipo.
497
+ this.intuirTipoQualquerParaIdentificadores = true;
498
+ const retornoExpressaoOuPrimeiroValor = this.seTernario();
499
+ this.intuirTipoQualquerParaIdentificadores = false;
500
+ if (this.simbolos[this.atual].tipo === delegua_2.default.PARA) {
501
+ return this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
502
+ }
503
+ // Aqui já sabemos que não é uma compreensão de lista.
504
+ valores.push(retornoExpressaoOuPrimeiroValor);
461
505
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
462
506
  switch (this.simbolos[this.atual].tipo) {
463
507
  case delegua_2.default.VIRGULA:
@@ -469,7 +513,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
469
513
  valores.push(new construtos_1.ComentarioComoConstruto(simboloComentario));
470
514
  break;
471
515
  default:
472
- const valor = this.atribuir();
516
+ const valor = this.seTernario();
473
517
  valores.push(valor);
474
518
  break;
475
519
  }
@@ -527,7 +571,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
527
571
  case delegua_2.default.IDENTIFICADOR:
528
572
  const simboloIdentificador = this.avancarEDevolverAnterior();
529
573
  let tipoOperando;
530
- if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
574
+ if (this.intuirTipoQualquerParaIdentificadores) {
575
+ // Esta indicação é utilizada para compreensões de lista, onde o
576
+ // tipo do identificador de iteração é 'qualquer' por definição.
577
+ tipoOperando = 'qualquer';
578
+ this.pilhaEscopos.definirInformacoesVariavel(simboloIdentificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloIdentificador.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
579
+ );
580
+ }
581
+ else if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
531
582
  tipoOperando = simboloIdentificador.lexema;
532
583
  }
533
584
  else {
@@ -663,7 +714,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
663
714
  const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
664
715
  let tipoInferido = expressaoAnterior.tipo;
665
716
  // Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
666
- if (expressaoAnterior.tipo === 'dicionário' && expressaoAnterior.constructor !== construtos_1.Dicionario) {
717
+ if (expressaoAnterior.tipo === 'dicionário' &&
718
+ expressaoAnterior.constructor !== construtos_1.Dicionario) {
667
719
  // TODO: Achar algum caso em que aqui não seja variável.
668
720
  const nomeDicionario = expressaoAnterior.simbolo.lexema;
669
721
  const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
@@ -1082,7 +1134,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1082
1134
  const corpo = this.resolverDeclaracao();
1083
1135
  return {
1084
1136
  condicao,
1085
- corpo
1137
+ corpo,
1086
1138
  };
1087
1139
  }
1088
1140
  declaracaoEnquanto() {
@@ -1187,7 +1239,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1187
1239
  const condicaoEnquanto = this.expressao();
1188
1240
  return {
1189
1241
  caminhoFazer,
1190
- condicaoEnquanto
1242
+ condicaoEnquanto,
1191
1243
  };
1192
1244
  }
1193
1245
  declaracaoFazer(simboloFazer) {
@@ -1218,7 +1270,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1218
1270
  case delegua_2.default.CHAVE_ESQUERDA:
1219
1271
  this.avancarEDevolverAnterior();
1220
1272
  do {
1221
- const identificadorImportacao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de elemento a ser importado.");
1273
+ const identificadorImportacao = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador de elemento a ser importado.');
1222
1274
  elementosImportacao.push(identificadorImportacao);
1223
1275
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1224
1276
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após lista de elementos a serem importados.");
@@ -1285,7 +1337,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1285
1337
  nomeVariavelChave,
1286
1338
  nomeVariavelValor,
1287
1339
  dicionario,
1288
- corpo
1340
+ corpo,
1289
1341
  };
1290
1342
  }
1291
1343
  declaracaoParaCadaDicionario(simboloPara) {
@@ -1309,7 +1361,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1309
1361
  }
1310
1362
  }
1311
1363
  const tipoVetor = vetor.tipo;
1312
- if (!tipoVetor.endsWith('[]') && !['dicionário', 'qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
1364
+ if (!tipoVetor.endsWith('[]') &&
1365
+ !['dicionário', 'qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
1313
1366
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
1314
1367
  }
1315
1368
  let tipoVariavelIteracao = 'qualquer';
@@ -1322,7 +1375,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1322
1375
  return {
1323
1376
  variavelIteracao,
1324
1377
  vetor,
1325
- corpo
1378
+ corpo,
1326
1379
  };
1327
1380
  }
1328
1381
  declaracaoParaCadaVetor(simboloPara) {
@@ -1373,7 +1426,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1373
1426
  inicializador,
1374
1427
  condicao,
1375
1428
  incrementar,
1376
- corpo
1429
+ corpo,
1377
1430
  };
1378
1431
  }
1379
1432
  declaracaoParaTradicional(simboloPara) {
@@ -1642,11 +1695,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1642
1695
  if (!tipoCorrespondente) {
1643
1696
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Tipo '${entidadeChamadaAcessoMetodoOuPropriedade.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
1644
1697
  }
1645
- if (!(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.metodos) &&
1646
- !(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.propriedades)) {
1698
+ if (!(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1699
+ tipoCorrespondente.metodos) &&
1700
+ !(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1701
+ tipoCorrespondente.propriedades)) {
1647
1702
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Membro '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe no tipo '${entidadeChamadaAcessoMetodoOuPropriedade.objeto.tipo}'.`);
1648
1703
  }
1649
- if (entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.metodos) {
1704
+ if (entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1705
+ tipoCorrespondente.metodos) {
1650
1706
  return tipoCorrespondente.metodos[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
1651
1707
  }
1652
1708
  return tipoCorrespondente.propriedades[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
@@ -1713,7 +1769,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1713
1769
  for (var i = 0; i < construto.valores.length; i++) {
1714
1770
  const chaveCorrespondente = this.resolverValorConstruto(construto.chaves[i]);
1715
1771
  const valorCorrespondente = construto.valores[i];
1716
- subElementos[chaveCorrespondente] = this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
1772
+ subElementos[chaveCorrespondente] =
1773
+ this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
1717
1774
  }
1718
1775
  retorno.subElementos = subElementos;
1719
1776
  const endereco = this.montaoTipos.adicionarReferencia(retorno);
@@ -2066,6 +2123,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2066
2123
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
2067
2124
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
2068
2125
  ]));
2126
+ this.pilhaEscopos.definirInformacoesVariavel('clonar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('clonar', 'qualquer', true, [
2127
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
2128
+ ]));
2069
2129
  this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar', 'qualquer', true, [
2070
2130
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
2071
2131
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
@@ -3182,7 +3242,6 @@ const primitivas_dicionario_1 = __importDefault(require("../../bibliotecas/primi
3182
3242
  const primitivas_numero_1 = __importDefault(require("../../bibliotecas/primitivas-numero"));
3183
3243
  const primitivas_texto_1 = __importDefault(require("../../bibliotecas/primitivas-texto"));
3184
3244
  const primitivas_vetor_1 = __importDefault(require("../../bibliotecas/primitivas-vetor"));
3185
- const lista_compreensao_1 = require("../../construtos/lista-compreensao");
3186
3245
  /**
3187
3246
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
3188
3247
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -3409,8 +3468,9 @@ class AvaliadorSintaticoPitugues {
3409
3468
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
3410
3469
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 0, 'qualquer[]');
3411
3470
  }
3412
- if (this.simbolos[this.atual].tipo == 'IDENTIFICADOR' && !this.verificarTipoProximoSimbolo(pitugues_2.default.VIRGULA)) {
3413
- return this.resolverListaDeCompreensao();
3471
+ if (this.simbolos[this.atual].tipo == 'IDENTIFICADOR' &&
3472
+ !this.verificarTipoProximoSimbolo(pitugues_2.default.VIRGULA)) {
3473
+ return this.resolverCompreensaoDeLista();
3414
3474
  }
3415
3475
  while (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
3416
3476
  const valor = this.atribuir();
@@ -3617,8 +3677,22 @@ class AvaliadorSintaticoPitugues {
3617
3677
  }
3618
3678
  return expressao;
3619
3679
  }
3680
+ seTernario() {
3681
+ let expressaoEntao = this.ou();
3682
+ if (this.simbolos[this.atual] && this.simbolos[this.atual].tipo === pitugues_2.default.SE && expressaoEntao.linha === this.simbolos[this.atual].linha) {
3683
+ while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
3684
+ const operador = this.simbolos[this.atual - 1];
3685
+ const expressaoOuCondicao = this.seTernario();
3686
+ this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
3687
+ ${this.simbolos[this.atual].lexema}.`);
3688
+ const expressaoSenao = this.seTernario();
3689
+ expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
3690
+ }
3691
+ }
3692
+ return expressaoEntao;
3693
+ }
3620
3694
  atribuir() {
3621
- const expressao = this.ou();
3695
+ const expressao = this.seTernario();
3622
3696
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.IGUAL) ||
3623
3697
  this.verificarSeSimboloAtualEIgualA(pitugues_2.default.MAIS_IGUAL)) {
3624
3698
  const igual = this.simboloAnterior();
@@ -3981,7 +4055,7 @@ class AvaliadorSintaticoPitugues {
3981
4055
  * Resolve uma lista de compreensão.
3982
4056
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
3983
4057
  */
3984
- resolverListaDeCompreensao() {
4058
+ resolverCompreensaoDeLista() {
3985
4059
  // TODO: Se expressão não começar com um identificador, por exemplo `3 * x`, como faríamos para
3986
4060
  // aceitar o `x` na avaliação da expressão?
3987
4061
  if (this.simbolos[this.atual].tipo === pitugues_2.default.IDENTIFICADOR) {
@@ -3990,7 +4064,8 @@ class AvaliadorSintaticoPitugues {
3990
4064
  this.pilhaEscopos.definirInformacoesVariavel(simboloVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloVariavelIteracao.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
3991
4065
  );
3992
4066
  }
3993
- const retornoExpressao = this.expressao();
4067
+ // TODO: Reavaliar a precedência do se ternário.
4068
+ const retornoExpressao = this.ou();
3994
4069
  this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificado.");
3995
4070
  this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
3996
4071
  const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
@@ -4005,7 +4080,8 @@ class AvaliadorSintaticoPitugues {
4005
4080
  throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução em lista de compreensão.");
4006
4081
  }
4007
4082
  const localizacaoVetor = this.simboloAnterior();
4008
- const vetor = this.expressao();
4083
+ // TODO: Reavaliar a precedência do se ternário.
4084
+ const vetor = this.ou();
4009
4085
  this.consumir(pitugues_2.default.SE, "Esperado condição 'se' após vetor.");
4010
4086
  const condicao = this.expressao();
4011
4087
  this.consumir(pitugues_2.default.COLCHETE_DIREITO, 'Espero fechamento de colchetes após condição.');
@@ -4014,10 +4090,10 @@ class AvaliadorSintaticoPitugues {
4014
4090
  throw this.erro(localizacaoVetor, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
4015
4091
  }
4016
4092
  const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao);
4017
- return new lista_compreensao_1.ListaCompreensao(Number(this.simbolos[this.atual]), this.hashArquivo, retornoExpressao, vetor, new construtos_1.ParaCadaComoConstruto(retornoExpressao.hashArquivo, retornoExpressao.linha, variavelIteracao, vetor, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
4093
+ return new construtos_1.ListaCompreensao(Number(this.simbolos[this.atual]), this.hashArquivo, retornoExpressao, vetor, new construtos_1.ParaCadaComoConstruto(retornoExpressao.hashArquivo, retornoExpressao.linha, variavelIteracao, vetor, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
4018
4094
  new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
4019
- new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao)
4020
- ]), [], null)
4095
+ new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao),
4096
+ ]), [], null),
4021
4097
  ])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
4022
4098
  );
4023
4099
  }
@@ -4241,7 +4317,7 @@ class AvaliadorSintaticoPitugues {
4241
4317
  }
4242
4318
  exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
4243
4319
 
4244
- },{"../../bibliotecas/primitivas-dicionario":21,"../../bibliotecas/primitivas-numero":22,"../../bibliotecas/primitivas-texto":23,"../../bibliotecas/primitivas-vetor":24,"../../construtos":52,"../../construtos/lista-compreensao":55,"../../declaracoes":97,"../../inferenciador":116,"../../informacao-elemento-sintatico":117,"../../lexador":174,"../../tipos-de-dados/dialetos/pitugues":183,"../../tipos-de-simbolos/pitugues":191,"../comum":3,"../erro-avaliador-sintatico":11,"../informacao-escopo":13,"../pilha-escopos":17,"browser-process-hrtime":367}],7:[function(require,module,exports){
4320
+ },{"../../bibliotecas/primitivas-dicionario":21,"../../bibliotecas/primitivas-numero":22,"../../bibliotecas/primitivas-texto":23,"../../bibliotecas/primitivas-vetor":24,"../../construtos":52,"../../declaracoes":97,"../../inferenciador":116,"../../informacao-elemento-sintatico":117,"../../lexador":174,"../../tipos-de-dados/dialetos/pitugues":183,"../../tipos-de-simbolos/pitugues":191,"../comum":3,"../erro-avaliador-sintatico":11,"../informacao-escopo":13,"../pilha-escopos":17,"browser-process-hrtime":367}],7:[function(require,module,exports){
4245
4321
  "use strict";
4246
4322
  var __importDefault = (this && this.__importDefault) || function (mod) {
4247
4323
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -5977,6 +6053,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
5977
6053
  exports.aleatorio = aleatorio;
5978
6054
  exports.aleatorioEntre = aleatorioEntre;
5979
6055
  exports.algum = algum;
6056
+ exports.clonar = clonar;
5980
6057
  exports.encontrar = encontrar;
5981
6058
  exports.encontrarIndice = encontrarIndice;
5982
6059
  exports.encontrarUltimo = encontrarUltimo;
@@ -6083,6 +6160,211 @@ async function algum(interpretador, vetor, funcaoPesquisa) {
6083
6160
  }
6084
6161
  return false;
6085
6162
  }
6163
+ /**
6164
+ * Clona profundamente uma variável ou constante em Delégua.
6165
+ * @param {InterpretadorInterface} interpretador A instância do interpretador.
6166
+ * @param {VariavelInterface | any} valor O valor a ser clonado.
6167
+ * @returns {Promise<any>} Uma cópia profunda do valor fornecido.
6168
+ */
6169
+ async function clonar(interpretador, valor) {
6170
+ // Resolver o valor caso seja uma VariavelInterface
6171
+ // Verificar se é null/undefined antes de usar hasOwnProperty
6172
+ let valorResolvido;
6173
+ if (valor === null || valor === undefined) {
6174
+ valorResolvido = valor;
6175
+ }
6176
+ else if (typeof valor === 'object' && valor.hasOwnProperty('valor')) {
6177
+ valorResolvido = valor.valor;
6178
+ }
6179
+ else {
6180
+ valorResolvido = valor;
6181
+ }
6182
+ // Map para evitar referências circulares
6183
+ const visitados = new WeakMap();
6184
+ function clonarProfundo(valorAtual) {
6185
+ var _a;
6186
+ // Valores primitivos (null, undefined, number, string, boolean)
6187
+ if (valorAtual === null || valorAtual === undefined) {
6188
+ return valorAtual;
6189
+ }
6190
+ if (typeof valorAtual !== 'object') {
6191
+ return valorAtual;
6192
+ }
6193
+ // Verificar se já visitamos este objeto (evitar referências circulares)
6194
+ if (visitados.has(valorAtual)) {
6195
+ return visitados.get(valorAtual);
6196
+ }
6197
+ // Arrays
6198
+ if (Array.isArray(valorAtual)) {
6199
+ const arrayClonado = [];
6200
+ visitados.set(valorAtual, arrayClonado);
6201
+ for (let i = 0; i < valorAtual.length; i++) {
6202
+ arrayClonado[i] = clonarProfundo(valorAtual[i]);
6203
+ }
6204
+ return arrayClonado;
6205
+ }
6206
+ // Objetos de Delégua - ObjetoDeleguaClasse
6207
+ if (valorAtual instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse) {
6208
+ // Clonar propriedades do objeto
6209
+ const propriedadesClonadas = {};
6210
+ visitados.set(valorAtual, propriedadesClonadas);
6211
+ for (const chave in valorAtual.propriedades) {
6212
+ if (valorAtual.propriedades.hasOwnProperty(chave)) {
6213
+ propriedadesClonadas[chave] = clonarProfundo(valorAtual.propriedades[chave]);
6214
+ }
6215
+ }
6216
+ // Criar novo objeto com as propriedades clonadas
6217
+ // Nota: A classe em si não é clonada, apenas suas propriedades
6218
+ const objetoClonado = new objeto_delegua_classe_1.ObjetoDeleguaClasse(valorAtual.classe);
6219
+ objetoClonado.propriedades = propriedadesClonadas;
6220
+ return objetoClonado;
6221
+ }
6222
+ // Tuplas
6223
+ const nomeClasseTupla = (_a = valorAtual.constructor) === null || _a === void 0 ? void 0 : _a.name;
6224
+ if (nomeClasseTupla &&
6225
+ /^(Dupla|Trio|Quarteto|Quinteto|Sexteto|Septeto|Octeto|Noneto|Deceto)$/.test(nomeClasseTupla)) {
6226
+ const valoresClonados = [];
6227
+ visitados.set(valorAtual, valoresClonados);
6228
+ // Extrair valores da tupla baseado no tipo
6229
+ let valores = [];
6230
+ switch (nomeClasseTupla) {
6231
+ case 'Dupla':
6232
+ valores = [valorAtual.primeiro, valorAtual.segundo];
6233
+ break;
6234
+ case 'Trio':
6235
+ valores = [valorAtual.primeiro, valorAtual.segundo, valorAtual.terceiro];
6236
+ break;
6237
+ case 'Quarteto':
6238
+ valores = [
6239
+ valorAtual.primeiro,
6240
+ valorAtual.segundo,
6241
+ valorAtual.terceiro,
6242
+ valorAtual.quarto,
6243
+ ];
6244
+ break;
6245
+ case 'Quinteto':
6246
+ valores = [
6247
+ valorAtual.primeiro,
6248
+ valorAtual.segundo,
6249
+ valorAtual.terceiro,
6250
+ valorAtual.quarto,
6251
+ valorAtual.quinto,
6252
+ ];
6253
+ break;
6254
+ case 'Sexteto':
6255
+ valores = [
6256
+ valorAtual.primeiro,
6257
+ valorAtual.segundo,
6258
+ valorAtual.terceiro,
6259
+ valorAtual.quarto,
6260
+ valorAtual.quinto,
6261
+ valorAtual.sexto,
6262
+ ];
6263
+ break;
6264
+ case 'Septeto':
6265
+ valores = [
6266
+ valorAtual.primeiro,
6267
+ valorAtual.segundo,
6268
+ valorAtual.terceiro,
6269
+ valorAtual.quarto,
6270
+ valorAtual.quinto,
6271
+ valorAtual.sexto,
6272
+ valorAtual.setimo,
6273
+ ];
6274
+ break;
6275
+ case 'Octeto':
6276
+ valores = [
6277
+ valorAtual.primeiro,
6278
+ valorAtual.segundo,
6279
+ valorAtual.terceiro,
6280
+ valorAtual.quarto,
6281
+ valorAtual.quinto,
6282
+ valorAtual.sexto,
6283
+ valorAtual.setimo,
6284
+ valorAtual.oitavo,
6285
+ ];
6286
+ break;
6287
+ case 'Noneto':
6288
+ valores = [
6289
+ valorAtual.primeiro,
6290
+ valorAtual.segundo,
6291
+ valorAtual.terceiro,
6292
+ valorAtual.quarto,
6293
+ valorAtual.quinto,
6294
+ valorAtual.sexto,
6295
+ valorAtual.setimo,
6296
+ valorAtual.oitavo,
6297
+ valorAtual.nono,
6298
+ ];
6299
+ break;
6300
+ case 'Deceto':
6301
+ valores = [
6302
+ valorAtual.primeiro,
6303
+ valorAtual.segundo,
6304
+ valorAtual.terceiro,
6305
+ valorAtual.quarto,
6306
+ valorAtual.quinto,
6307
+ valorAtual.sexto,
6308
+ valorAtual.setimo,
6309
+ valorAtual.oitavo,
6310
+ valorAtual.nono,
6311
+ valorAtual.decimo,
6312
+ ];
6313
+ break;
6314
+ default:
6315
+ // Se não conseguir identificar, tentar extrair valores diretamente
6316
+ if (valorAtual.valor) {
6317
+ valores = Array.isArray(valorAtual.valor)
6318
+ ? valorAtual.valor
6319
+ : [valorAtual.valor];
6320
+ }
6321
+ }
6322
+ // Clonar valores
6323
+ for (let i = 0; i < valores.length; i++) {
6324
+ valoresClonados.push(clonarProfundo(valores[i]));
6325
+ }
6326
+ // Recriar a tupla com valores clonados
6327
+ switch (nomeClasseTupla) {
6328
+ case 'Dupla':
6329
+ return new construtos_1.Dupla(valoresClonados[0], valoresClonados[1]);
6330
+ case 'Trio':
6331
+ return new construtos_1.Trio(valoresClonados[0], valoresClonados[1], valoresClonados[2]);
6332
+ case 'Quarteto':
6333
+ return new construtos_1.Quarteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3]);
6334
+ case 'Quinteto':
6335
+ return new construtos_1.Quinteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4]);
6336
+ case 'Sexteto':
6337
+ return new construtos_1.Sexteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5]);
6338
+ case 'Septeto':
6339
+ return new construtos_1.Septeto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6]);
6340
+ case 'Octeto':
6341
+ return new construtos_1.Octeto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6], valoresClonados[7]);
6342
+ case 'Noneto':
6343
+ return new construtos_1.Noneto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6], valoresClonados[7], valoresClonados[8]);
6344
+ case 'Deceto':
6345
+ return new construtos_1.Deceto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6], valoresClonados[7], valoresClonados[8], valoresClonados[9]);
6346
+ default:
6347
+ // Se não conseguir recriar, retornar os valores clonados como array
6348
+ return valoresClonados;
6349
+ }
6350
+ }
6351
+ // DeleguaFuncao e FuncaoPadrao - funções não são clonadas profundamente
6352
+ // Elas mantêm referência à mesma definição, mas isso é comportamento esperado
6353
+ if (valorAtual instanceof estruturas_1.DeleguaFuncao || valorAtual instanceof funcao_padrao_1.FuncaoPadrao) {
6354
+ return valorAtual;
6355
+ }
6356
+ // Objetos simples (plain objects)
6357
+ const objetoClonado = {};
6358
+ visitados.set(valorAtual, objetoClonado);
6359
+ for (const chave in valorAtual) {
6360
+ if (valorAtual.hasOwnProperty(chave)) {
6361
+ objetoClonado[chave] = clonarProfundo(valorAtual[chave]);
6362
+ }
6363
+ }
6364
+ return objetoClonado;
6365
+ }
6366
+ return Promise.resolve(clonarProfundo(valorResolvido));
6367
+ }
6086
6368
  /**
6087
6369
  * Encontra o primeiro elemento de um vetor cuja função de pesquisa retorne
6088
6370
  * verdadeiro na avaliação de cada elemento.
@@ -7067,7 +7349,7 @@ exports.default = {
7067
7349
  ],
7068
7350
  implementacao: (interpretador, nomePrimitiva, vetor, elemento) => {
7069
7351
  vetor.push(elemento);
7070
- // TODO: Será que apenas isso é suficiente aqui?
7352
+ // TODO: Será que apenas isso é suficiente aqui?
7071
7353
  if (nomePrimitiva !== '') {
7072
7354
  interpretador.pilhaEscoposExecucao.atribuirVariavel({ lexema: nomePrimitiva }, vetor);
7073
7355
  }
@@ -7139,7 +7421,9 @@ exports.default = {
7139
7421
  return Promise.resolve(elementos);
7140
7422
  }
7141
7423
  else {
7142
- elementos = !itens.length ? vetor.splice(posicaoInicial) : vetor.splice(posicaoInicial, ...itens);
7424
+ elementos = !itens.length
7425
+ ? vetor.splice(posicaoInicial)
7426
+ : vetor.splice(posicaoInicial, ...itens);
7143
7427
  if (nomePrimitiva !== '') {
7144
7428
  interpretador.pilhaEscoposExecucao.atribuirVariavel({ lexema: nomePrimitiva }, elementos);
7145
7429
  }
@@ -7230,7 +7514,7 @@ exports.default = {
7230
7514
  'escreva(v.inclui(2)) // verdadeiro\n' +
7231
7515
  'escreva(v.inclui(4)) // falso\n```' +
7232
7516
  '\n\n ### Formas de uso \n',
7233
- exemploCodigo: 'vetor.inclui(elemento)'
7517
+ exemploCodigo: 'vetor.inclui(elemento)',
7234
7518
  },
7235
7519
  inverter: {
7236
7520
  tipoRetorno: 'qualquer[]',
@@ -7258,8 +7542,7 @@ exports.default = {
7258
7542
  '\n\n```delegua\nvar v = [1, 2, 3]\n' +
7259
7543
  'escreva(v.juntar(":")) // "1:2:3"\n```' +
7260
7544
  '\n\n ### Formas de uso \n',
7261
- exemploCodigo: 'vetor.juntar()\n' +
7262
- 'vetor.juntar(<separador>)',
7545
+ exemploCodigo: 'vetor.juntar()\n' + 'vetor.juntar(<separador>)',
7263
7546
  },
7264
7547
  mapear: {
7265
7548
  tipoRetorno: 'qualquer[]',
@@ -11052,6 +11335,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
11052
11335
  pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
11053
11336
  pilhaEscoposExecucao.definirVariavel('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
11054
11337
  pilhaEscoposExecucao.definirVariavel('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
11338
+ pilhaEscoposExecucao.definirVariavel('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
11055
11339
  pilhaEscoposExecucao.definirVariavel('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
11056
11340
  pilhaEscoposExecucao.definirVariavel('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
11057
11341
  pilhaEscoposExecucao.definirVariavel('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
@@ -11701,7 +11985,6 @@ const metodo_primitiva_1 = require("./estruturas/metodo-primitiva");
11701
11985
  const lexador_1 = require("../lexador");
11702
11986
  const avaliador_sintatico_1 = require("../avaliador-sintatico");
11703
11987
  const espaco_memoria_1 = require("./espaco-memoria");
11704
- const comum_1 = require("./comum");
11705
11988
  const excecoes_1 = require("../excecoes");
11706
11989
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
11707
11990
  const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
@@ -11757,7 +12040,6 @@ class InterpretadorBase {
11757
12040
  emLacoRepeticao: false,
11758
12041
  };
11759
12042
  this.pilhaEscoposExecucao.empilhar(escopoExecucao);
11760
- (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
11761
12043
  }
11762
12044
  visitarExpressaoSeparador(expressao) {
11763
12045
  throw new Error('Método não implementado.');
@@ -12140,6 +12422,10 @@ class InterpretadorBase {
12140
12422
  return Number(valorEsquerdo) - Number(valorDireito);
12141
12423
  case delegua_1.default.ADICAO:
12142
12424
  case delegua_1.default.MAIS_IGUAL:
12425
+ // Se ambos os operandos são vetores, concatená-los
12426
+ if (Array.isArray(valorEsquerdo) && Array.isArray(valorDireito)) {
12427
+ return valorEsquerdo.concat(valorDireito);
12428
+ }
12143
12429
  if (this.tiposNumericos.includes(tipoEsquerdo) &&
12144
12430
  this.tiposNumericos.includes(tipoDireito)) {
12145
12431
  return Number(valorEsquerdo) + Number(valorDireito);
@@ -12433,8 +12719,7 @@ class InterpretadorBase {
12433
12719
  // para vetor de duplas.
12434
12720
  // TODO: Converter elementos para `Construto` se necessário.
12435
12721
  if (declaracao.vetorOuDicionario.tipo === 'dicionário') {
12436
- valorVetorResolvido = Object.entries(valorVetorResolvido)
12437
- .map(v => new construtos_1.Dupla(v[0], v[1]));
12722
+ valorVetorResolvido = Object.entries(valorVetorResolvido).map((v) => new construtos_1.Dupla(v[0], v[1]));
12438
12723
  }
12439
12724
  if (!Array.isArray(valorVetorResolvido)) {
12440
12725
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
@@ -12864,7 +13149,7 @@ class InterpretadorBase {
12864
13149
  const funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao);
12865
13150
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, funcao);
12866
13151
  return Promise.resolve({
12867
- declaracao: funcao
13152
+ declaracao: funcao,
12868
13153
  });
12869
13154
  }
12870
13155
  /**
@@ -13216,7 +13501,7 @@ class InterpretadorBase {
13216
13501
  exports.InterpretadorBase = InterpretadorBase;
13217
13502
 
13218
13503
  }).call(this)}).call(this,require('_process'))
13219
- },{"../avaliador-sintatico":12,"../bibliotecas/primitivas-dicionario":21,"../construtos":52,"../excecoes":110,"../inferenciador":116,"../lexador":174,"../quebras":181,"../tipos-de-dados/delegua":182,"../tipos-de-dados/primitivos":184,"../tipos-de-simbolos/delegua":187,"./comum":142,"./espaco-memoria":143,"./estruturas":150,"./estruturas/metodo-primitiva":151,"./pilha-escopos-execucao":160,"_process":421,"browser-process-hrtime":367}],158:[function(require,module,exports){
13504
+ },{"../avaliador-sintatico":12,"../bibliotecas/primitivas-dicionario":21,"../construtos":52,"../excecoes":110,"../inferenciador":116,"../lexador":174,"../quebras":181,"../tipos-de-dados/delegua":182,"../tipos-de-dados/primitivos":184,"../tipos-de-simbolos/delegua":187,"./espaco-memoria":143,"./estruturas":150,"./estruturas/metodo-primitiva":151,"./pilha-escopos-execucao":160,"_process":421,"browser-process-hrtime":367}],158:[function(require,module,exports){
13220
13505
  "use strict";
13221
13506
  var __importDefault = (this && this.__importDefault) || function (mod) {
13222
13507
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -13231,6 +13516,7 @@ const excecoes_1 = require("../excecoes");
13231
13516
  const declaracoes_1 = require("../declaracoes");
13232
13517
  const quebras_1 = require("../quebras");
13233
13518
  const montao_1 = require("./montao");
13519
+ const comum_1 = require("./comum");
13234
13520
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
13235
13521
  const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
13236
13522
  const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
@@ -13244,6 +13530,14 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13244
13530
  constructor(diretorioBase, performance = false, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
13245
13531
  super(diretorioBase, performance, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);
13246
13532
  this.montao = new montao_1.Montao();
13533
+ this.pontoInicializacaoBibliotecasGlobais();
13534
+ }
13535
+ /**
13536
+ * Cada dialeto que deriva deste interpretador conhece este ponto de inicialização.
13537
+ * A partir daqui, cada dialeto pode carregar as bibliotecas globais específicas do seu dialeto.
13538
+ */
13539
+ pontoInicializacaoBibliotecasGlobais() {
13540
+ (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
13247
13541
  }
13248
13542
  resolverReferenciaMontao(referenciaMontao) {
13249
13543
  const valorMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, referenciaMontao.endereco);
@@ -13294,8 +13588,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13294
13588
  }
13295
13589
  if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
13296
13590
  return objeto.valor.paraTexto();
13297
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
13298
- objeto instanceof estruturas_1.DeleguaFuncao)
13591
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
13299
13592
  return objeto.paraTexto();
13300
13593
  if (objeto instanceof quebras_1.RetornoQuebra) {
13301
13594
  if (typeof objeto.valor === 'boolean')
@@ -13333,7 +13626,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13333
13626
  if (typeof valor === primitivos_1.default.BOOLEANO) {
13334
13627
  valor = valor ? 'verdadeiro' : 'falso';
13335
13628
  }
13336
- if (valor instanceof estruturas_1.ReferenciaMontao || ((valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty) && (valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty('tipo')))) {
13629
+ if (valor instanceof estruturas_1.ReferenciaMontao ||
13630
+ ((valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty) && (valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty('tipo')))) {
13337
13631
  valor = this.resolverValor(valor);
13338
13632
  }
13339
13633
  objetoEscrita[propriedade] = valor;
@@ -13372,13 +13666,14 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13372
13666
  return Promise.resolve({
13373
13667
  tipo: `função<${funcao.declaracao.tipo || 'qualquer'}>`,
13374
13668
  tipoExplicito: funcao.declaracao.tipoExplicito,
13375
- declaracao: funcao
13669
+ declaracao: funcao,
13376
13670
  });
13377
13671
  }
13378
13672
  async logicaComumExecucaoEnquanto(enquanto, acumularRetornos) {
13379
13673
  let retornoExecucao;
13380
13674
  const retornos = [];
13381
- while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13675
+ while ((acumularRetornos ||
13676
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13382
13677
  this.eVerdadeiro(await this.avaliar(enquanto.condicao))) {
13383
13678
  try {
13384
13679
  retornoExecucao = await this.executar(enquanto.corpo);
@@ -13386,7 +13681,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13386
13681
  if (acumularRetornos) {
13387
13682
  return {
13388
13683
  valorRetornado: retornos,
13389
- tipo: 'vetor'
13684
+ tipo: 'vetor',
13390
13685
  };
13391
13686
  }
13392
13687
  return null;
@@ -13410,7 +13705,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13410
13705
  if (acumularRetornos) {
13411
13706
  return {
13412
13707
  valorRetornado: retornos,
13413
- tipo: 'vetor'
13708
+ tipo: 'vetor',
13414
13709
  };
13415
13710
  }
13416
13711
  return retornoExecucao;
@@ -13428,7 +13723,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13428
13723
  if (acumularRetornos) {
13429
13724
  return {
13430
13725
  valorRetornado: retornos,
13431
- tipo: 'vetor'
13726
+ tipo: 'vetor',
13432
13727
  };
13433
13728
  }
13434
13729
  return null;
@@ -13448,12 +13743,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13448
13743
  });
13449
13744
  return Promise.reject(erro);
13450
13745
  }
13451
- } while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13746
+ } while ((acumularRetornos ||
13747
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13452
13748
  this.eVerdadeiro(await this.avaliar(fazer.condicaoEnquanto)));
13453
13749
  if (acumularRetornos) {
13454
13750
  return {
13455
13751
  valorRetornado: retornos,
13456
- tipo: 'vetor'
13752
+ tipo: 'vetor',
13457
13753
  };
13458
13754
  }
13459
13755
  }
@@ -13469,9 +13765,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13469
13765
  }
13470
13766
  let retornoExecucao;
13471
13767
  const retornos = [];
13472
- while (acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
13473
- if (para.condicao !== null &&
13474
- !this.eVerdadeiro(await this.avaliar(para.condicao))) {
13768
+ while (acumularRetornos ||
13769
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
13770
+ if (para.condicao !== null && !this.eVerdadeiro(await this.avaliar(para.condicao))) {
13475
13771
  break;
13476
13772
  }
13477
13773
  retornoExecucao = await this.executar(para.corpo);
@@ -13479,7 +13775,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13479
13775
  if (acumularRetornos) {
13480
13776
  return {
13481
13777
  valorRetornado: retornos,
13482
- tipo: 'vetor'
13778
+ tipo: 'vetor',
13483
13779
  };
13484
13780
  }
13485
13781
  return null;
@@ -13497,7 +13793,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13497
13793
  if (acumularRetornos) {
13498
13794
  return {
13499
13795
  valorRetornado: retornos,
13500
- tipo: 'vetor'
13796
+ tipo: 'vetor',
13501
13797
  };
13502
13798
  }
13503
13799
  return retornoExecucao;
@@ -13518,14 +13814,16 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13518
13814
  if (paraCada.vetorOuDicionario.tipo === 'dicionário') {
13519
13815
  valorVetorOuDicionarioResolvido = Object.entries(valorVetorOuDicionarioResolvido).map((v) => new construtos_1.Dupla(v[0], v[1]));
13520
13816
  }
13521
- if (paraCada.vetorOuDicionario.tipo === 'texto' || typeof valorVetorOuDicionarioResolvido === 'string') {
13817
+ if (paraCada.vetorOuDicionario.tipo === 'texto' ||
13818
+ typeof valorVetorOuDicionarioResolvido === 'string') {
13522
13819
  valorVetorOuDicionarioResolvido = valorVetorOuDicionarioResolvido.split('');
13523
13820
  }
13524
13821
  if (!Array.isArray(valorVetorOuDicionarioResolvido)) {
13525
13822
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
13526
13823
  }
13527
13824
  const retornos = [];
13528
- while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13825
+ while ((acumularRetornos ||
13826
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13529
13827
  paraCada.posicaoAtual < valorVetorOuDicionarioResolvido.length) {
13530
13828
  try {
13531
13829
  if (paraCada.variavelIteracao instanceof construtos_1.Variavel) {
@@ -13541,7 +13839,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13541
13839
  if (acumularRetornos) {
13542
13840
  return {
13543
13841
  valorRetornado: retornos,
13544
- tipo: 'vetor'
13842
+ tipo: 'vetor',
13545
13843
  };
13546
13844
  }
13547
13845
  return null;
@@ -13566,7 +13864,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13566
13864
  if (acumularRetornos) {
13567
13865
  return {
13568
13866
  valorRetornado: retornos,
13569
- tipo: 'vetor'
13867
+ tipo: 'vetor',
13570
13868
  };
13571
13869
  }
13572
13870
  return retornoExecucao;
@@ -14024,7 +14322,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14024
14322
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
14025
14323
  }
14026
14324
  const resultadoCompreensao = await this.avaliar(listaCompreensao.paraCada);
14027
- const resultadoCompreensaoResolvido = resultadoCompreensao.valorRetornado.filter(r => r !== null).map(r => this.resolverValor(r));
14325
+ const resultadoCompreensaoResolvido = resultadoCompreensao.valorRetornado
14326
+ .filter((r) => r !== null)
14327
+ .map((r) => this.resolverValor(r));
14028
14328
  return resultadoCompreensaoResolvido;
14029
14329
  }
14030
14330
  visitarExpressaoPara(expressao) {
@@ -14159,7 +14459,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14159
14459
  escopoAnterior.espacoMemoria.valores = Object.assign(escopoAnterior.espacoMemoria.valores, ultimoEscopo.espacoMemoria.valores);
14160
14460
  escopoAnterior.espacoMemoria.enderecosMontao = new Set([
14161
14461
  ...escopoAnterior.espacoMemoria.enderecosMontao,
14162
- ...ultimoEscopo.espacoMemoria.enderecosMontao
14462
+ ...ultimoEscopo.espacoMemoria.enderecosMontao,
14163
14463
  ]);
14164
14464
  }
14165
14465
  else {
@@ -14179,7 +14479,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14179
14479
  const resultados = await super.interpretar(declaracoes, manterAmbiente);
14180
14480
  if (resultados.resultado.length > 0) {
14181
14481
  const ultimoResultado = resultados.resultado[resultados.resultado.length - 1];
14182
- if (ultimoResultado && ultimoResultado.valorRetornado instanceof quebras_1.RetornoQuebra && ultimoResultado.valorRetornado.valor instanceof estruturas_1.ReferenciaMontao) {
14482
+ if (ultimoResultado &&
14483
+ ultimoResultado.valorRetornado instanceof quebras_1.RetornoQuebra &&
14484
+ ultimoResultado.valorRetornado.valor instanceof estruturas_1.ReferenciaMontao) {
14183
14485
  const ultimaDeclaracao = declaracoes[declaracoes.length - 1];
14184
14486
  ultimoResultado.valorRetornado.valor = this.montao.obterReferencia(ultimaDeclaracao.hashArquivo, ultimaDeclaracao.linha, ultimoResultado.valorRetornado.valor.endereco);
14185
14487
  }
@@ -14189,7 +14491,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14189
14491
  }
14190
14492
  exports.Interpretador = Interpretador;
14191
14493
 
14192
- },{"../bibliotecas/primitivas-dicionario":21,"../bibliotecas/primitivas-numero":22,"../bibliotecas/primitivas-texto":23,"../bibliotecas/primitivas-vetor":24,"../construtos":52,"../declaracoes":97,"../excecoes":110,"../inferenciador":116,"../quebras":181,"../tipos-de-dados/delegua":182,"../tipos-de-dados/primitivos":184,"./estruturas":150,"./interpretador-base":157,"./montao":159}],159:[function(require,module,exports){
14494
+ },{"../bibliotecas/primitivas-dicionario":21,"../bibliotecas/primitivas-numero":22,"../bibliotecas/primitivas-texto":23,"../bibliotecas/primitivas-vetor":24,"../construtos":52,"../declaracoes":97,"../excecoes":110,"../inferenciador":116,"../quebras":181,"../tipos-de-dados/delegua":182,"../tipos-de-dados/primitivos":184,"./comum":142,"./estruturas":150,"./interpretador-base":157,"./montao":159}],159:[function(require,module,exports){
14193
14495
  "use strict";
14194
14496
  Object.defineProperty(exports, "__esModule", { value: true });
14195
14497
  exports.Montao = void 0;
@@ -16369,13 +16671,14 @@ exports.palavrasReservadas = {
16369
16671
  nulo: pitugues_1.default.NULO,
16370
16672
  ou: pitugues_1.default.OU,
16371
16673
  padrao: pitugues_1.default.PADRAO,
16674
+ padrão: pitugues_1.default.PADRAO,
16372
16675
  para: pitugues_1.default.PARA,
16373
16676
  pegue: pitugues_1.default.PEGUE,
16374
16677
  quebrar: pitugues_1.default.QUEBRAR,
16375
16678
  retorna: pitugues_1.default.RETORNA,
16376
16679
  se: pitugues_1.default.SE,
16377
16680
  senao: pitugues_1.default.SENAO,
16378
- senão: pitugues_1.default.SENÃO,
16681
+ senão: pitugues_1.default.SENAO,
16379
16682
  super: pitugues_1.default.SUPER,
16380
16683
  sustar: pitugues_1.default.SUSTAR,
16381
16684
  tendo: pitugues_1.default.TENDO,