@designliquido/delegua 0.57.1 → 0.58.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 (117) 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 +69 -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 +41 -13
  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 +2 -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/lexador/micro-lexador-pitugues.d.ts +30 -0
  106. package/lexador/micro-lexador-pitugues.d.ts.map +1 -0
  107. package/lexador/micro-lexador-pitugues.js +210 -0
  108. package/lexador/micro-lexador-pitugues.js.map +1 -0
  109. package/package.json +1 -1
  110. package/quebras/index.d.ts.map +1 -1
  111. package/quebras/index.js.map +1 -1
  112. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  113. package/tipos-de-simbolos/pitugues.js.map +1 -1
  114. package/tradutores/tradutor-javascript.js.map +1 -1
  115. package/tradutores/tradutor-python.d.ts.map +1 -1
  116. package/tradutores/tradutor-python.js.map +1 -1
  117. package/umd/delegua.js +389 -68
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,34 @@ 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
+ this.consumir(delegua_2.default.SE, "Esperado condição 'se' após vetor.");
461
+ const condicao = this.expressao();
462
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, 'Espero fechamento de colchetes após condição.');
463
+ const tipoVetor = vetor.tipo;
464
+ if (!tipoVetor.endsWith('[]') && !['qualquer', 'vetor'].includes(tipoVetor)) {
465
+ throw this.erro(localizacaoVetor, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
466
+ }
467
+ const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao);
468
+ 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, [
469
+ new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
470
+ new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao),
471
+ ]), [], null),
472
+ ])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
473
+ );
474
+ }
446
475
  primario() {
447
476
  const simboloAtual = this.simbolos[this.atual];
448
477
  let valores = [];
@@ -458,6 +487,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
458
487
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
459
488
  return this.construtoTupla();
460
489
  }
490
+ // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
491
+ // de lista serão tratados como 'qualquer', para evitar erros de tipo.
492
+ this.intuirTipoQualquerParaIdentificadores = true;
493
+ const retornoExpressaoOuPrimeiroValor = this.seTernario();
494
+ this.intuirTipoQualquerParaIdentificadores = false;
495
+ if (this.simbolos[this.atual].tipo === delegua_2.default.PARA) {
496
+ return this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
497
+ }
498
+ // Aqui já sabemos que não é uma compreensão de lista.
499
+ valores.push(retornoExpressaoOuPrimeiroValor);
461
500
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
462
501
  switch (this.simbolos[this.atual].tipo) {
463
502
  case delegua_2.default.VIRGULA:
@@ -469,7 +508,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
469
508
  valores.push(new construtos_1.ComentarioComoConstruto(simboloComentario));
470
509
  break;
471
510
  default:
472
- const valor = this.atribuir();
511
+ const valor = this.seTernario();
473
512
  valores.push(valor);
474
513
  break;
475
514
  }
@@ -527,7 +566,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
527
566
  case delegua_2.default.IDENTIFICADOR:
528
567
  const simboloIdentificador = this.avancarEDevolverAnterior();
529
568
  let tipoOperando;
530
- if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
569
+ if (this.intuirTipoQualquerParaIdentificadores) {
570
+ // Esta indicação é utilizada para compreensões de lista, onde o
571
+ // tipo do identificador de iteração é 'qualquer' por definição.
572
+ tipoOperando = 'qualquer';
573
+ this.pilhaEscopos.definirInformacoesVariavel(simboloIdentificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloIdentificador.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
574
+ );
575
+ }
576
+ else if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
531
577
  tipoOperando = simboloIdentificador.lexema;
532
578
  }
533
579
  else {
@@ -663,7 +709,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
663
709
  const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
664
710
  let tipoInferido = expressaoAnterior.tipo;
665
711
  // 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) {
712
+ if (expressaoAnterior.tipo === 'dicionário' &&
713
+ expressaoAnterior.constructor !== construtos_1.Dicionario) {
667
714
  // TODO: Achar algum caso em que aqui não seja variável.
668
715
  const nomeDicionario = expressaoAnterior.simbolo.lexema;
669
716
  const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
@@ -1082,7 +1129,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1082
1129
  const corpo = this.resolverDeclaracao();
1083
1130
  return {
1084
1131
  condicao,
1085
- corpo
1132
+ corpo,
1086
1133
  };
1087
1134
  }
1088
1135
  declaracaoEnquanto() {
@@ -1187,7 +1234,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1187
1234
  const condicaoEnquanto = this.expressao();
1188
1235
  return {
1189
1236
  caminhoFazer,
1190
- condicaoEnquanto
1237
+ condicaoEnquanto,
1191
1238
  };
1192
1239
  }
1193
1240
  declaracaoFazer(simboloFazer) {
@@ -1218,7 +1265,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1218
1265
  case delegua_2.default.CHAVE_ESQUERDA:
1219
1266
  this.avancarEDevolverAnterior();
1220
1267
  do {
1221
- const identificadorImportacao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de elemento a ser importado.");
1268
+ const identificadorImportacao = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador de elemento a ser importado.');
1222
1269
  elementosImportacao.push(identificadorImportacao);
1223
1270
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1224
1271
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após lista de elementos a serem importados.");
@@ -1285,7 +1332,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1285
1332
  nomeVariavelChave,
1286
1333
  nomeVariavelValor,
1287
1334
  dicionario,
1288
- corpo
1335
+ corpo,
1289
1336
  };
1290
1337
  }
1291
1338
  declaracaoParaCadaDicionario(simboloPara) {
@@ -1309,7 +1356,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1309
1356
  }
1310
1357
  }
1311
1358
  const tipoVetor = vetor.tipo;
1312
- if (!tipoVetor.endsWith('[]') && !['dicionário', 'qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
1359
+ if (!tipoVetor.endsWith('[]') &&
1360
+ !['dicionário', 'qualquer', 'texto', 'vetor'].includes(tipoVetor)) {
1313
1361
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
1314
1362
  }
1315
1363
  let tipoVariavelIteracao = 'qualquer';
@@ -1322,7 +1370,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1322
1370
  return {
1323
1371
  variavelIteracao,
1324
1372
  vetor,
1325
- corpo
1373
+ corpo,
1326
1374
  };
1327
1375
  }
1328
1376
  declaracaoParaCadaVetor(simboloPara) {
@@ -1373,7 +1421,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1373
1421
  inicializador,
1374
1422
  condicao,
1375
1423
  incrementar,
1376
- corpo
1424
+ corpo,
1377
1425
  };
1378
1426
  }
1379
1427
  declaracaoParaTradicional(simboloPara) {
@@ -1642,11 +1690,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1642
1690
  if (!tipoCorrespondente) {
1643
1691
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Tipo '${entidadeChamadaAcessoMetodoOuPropriedade.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
1644
1692
  }
1645
- if (!(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.metodos) &&
1646
- !(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.propriedades)) {
1693
+ if (!(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1694
+ tipoCorrespondente.metodos) &&
1695
+ !(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1696
+ tipoCorrespondente.propriedades)) {
1647
1697
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Membro '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe no tipo '${entidadeChamadaAcessoMetodoOuPropriedade.objeto.tipo}'.`);
1648
1698
  }
1649
- if (entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in tipoCorrespondente.metodos) {
1699
+ if (entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema in
1700
+ tipoCorrespondente.metodos) {
1650
1701
  return tipoCorrespondente.metodos[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
1651
1702
  }
1652
1703
  return tipoCorrespondente.propriedades[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
@@ -1713,7 +1764,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1713
1764
  for (var i = 0; i < construto.valores.length; i++) {
1714
1765
  const chaveCorrespondente = this.resolverValorConstruto(construto.chaves[i]);
1715
1766
  const valorCorrespondente = construto.valores[i];
1716
- subElementos[chaveCorrespondente] = this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
1767
+ subElementos[chaveCorrespondente] =
1768
+ this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
1717
1769
  }
1718
1770
  retorno.subElementos = subElementos;
1719
1771
  const endereco = this.montaoTipos.adicionarReferencia(retorno);
@@ -2066,6 +2118,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2066
2118
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
2067
2119
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
2068
2120
  ]));
2121
+ this.pilhaEscopos.definirInformacoesVariavel('clonar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('clonar', 'qualquer', true, [
2122
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
2123
+ ]));
2069
2124
  this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar', 'qualquer', true, [
2070
2125
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
2071
2126
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
@@ -3182,7 +3237,6 @@ const primitivas_dicionario_1 = __importDefault(require("../../bibliotecas/primi
3182
3237
  const primitivas_numero_1 = __importDefault(require("../../bibliotecas/primitivas-numero"));
3183
3238
  const primitivas_texto_1 = __importDefault(require("../../bibliotecas/primitivas-texto"));
3184
3239
  const primitivas_vetor_1 = __importDefault(require("../../bibliotecas/primitivas-vetor"));
3185
- const lista_compreensao_1 = require("../../construtos/lista-compreensao");
3186
3240
  /**
3187
3241
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
3188
3242
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -3409,8 +3463,9 @@ class AvaliadorSintaticoPitugues {
3409
3463
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
3410
3464
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 0, 'qualquer[]');
3411
3465
  }
3412
- if (this.simbolos[this.atual].tipo == 'IDENTIFICADOR' && !this.verificarTipoProximoSimbolo(pitugues_2.default.VIRGULA)) {
3413
- return this.resolverListaDeCompreensao();
3466
+ if (this.simbolos[this.atual].tipo == 'IDENTIFICADOR' &&
3467
+ !this.verificarTipoProximoSimbolo(pitugues_2.default.VIRGULA)) {
3468
+ return this.resolverCompreensaoDeLista();
3414
3469
  }
3415
3470
  while (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
3416
3471
  const valor = this.atribuir();
@@ -3617,8 +3672,22 @@ class AvaliadorSintaticoPitugues {
3617
3672
  }
3618
3673
  return expressao;
3619
3674
  }
3675
+ seTernario() {
3676
+ let expressaoEntao = this.ou();
3677
+ if (this.simbolos[this.atual] && this.simbolos[this.atual].tipo === pitugues_2.default.SE && expressaoEntao.linha === this.simbolos[this.atual].linha) {
3678
+ while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
3679
+ const operador = this.simbolos[this.atual - 1];
3680
+ const expressaoOuCondicao = this.seTernario();
3681
+ this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
3682
+ ${this.simbolos[this.atual].lexema}.`);
3683
+ const expressaoSenao = this.seTernario();
3684
+ expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
3685
+ }
3686
+ }
3687
+ return expressaoEntao;
3688
+ }
3620
3689
  atribuir() {
3621
- const expressao = this.ou();
3690
+ const expressao = this.seTernario();
3622
3691
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.IGUAL) ||
3623
3692
  this.verificarSeSimboloAtualEIgualA(pitugues_2.default.MAIS_IGUAL)) {
3624
3693
  const igual = this.simboloAnterior();
@@ -3981,7 +4050,7 @@ class AvaliadorSintaticoPitugues {
3981
4050
  * Resolve uma lista de compreensão.
3982
4051
  * @returns {ListaCompreensao} A lista de compreensão resolvida.
3983
4052
  */
3984
- resolverListaDeCompreensao() {
4053
+ resolverCompreensaoDeLista() {
3985
4054
  // TODO: Se expressão não começar com um identificador, por exemplo `3 * x`, como faríamos para
3986
4055
  // aceitar o `x` na avaliação da expressão?
3987
4056
  if (this.simbolos[this.atual].tipo === pitugues_2.default.IDENTIFICADOR) {
@@ -3990,7 +4059,8 @@ class AvaliadorSintaticoPitugues {
3990
4059
  this.pilhaEscopos.definirInformacoesVariavel(simboloVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloVariavelIteracao.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
3991
4060
  );
3992
4061
  }
3993
- const retornoExpressao = this.expressao();
4062
+ // TODO: Reavaliar a precedência do se ternário.
4063
+ const retornoExpressao = this.ou();
3994
4064
  this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificado.");
3995
4065
  this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
3996
4066
  const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
@@ -4005,7 +4075,8 @@ class AvaliadorSintaticoPitugues {
4005
4075
  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
4076
  }
4007
4077
  const localizacaoVetor = this.simboloAnterior();
4008
- const vetor = this.expressao();
4078
+ // TODO: Reavaliar a precedência do se ternário.
4079
+ const vetor = this.ou();
4009
4080
  this.consumir(pitugues_2.default.SE, "Esperado condição 'se' após vetor.");
4010
4081
  const condicao = this.expressao();
4011
4082
  this.consumir(pitugues_2.default.COLCHETE_DIREITO, 'Espero fechamento de colchetes após condição.');
@@ -4014,10 +4085,10 @@ class AvaliadorSintaticoPitugues {
4014
4085
  throw this.erro(localizacaoVetor, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
4015
4086
  }
4016
4087
  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, [
4088
+ 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
4089
  new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
4019
- new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao)
4020
- ]), [], null)
4090
+ new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao),
4091
+ ]), [], null),
4021
4092
  ])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
4022
4093
  );
4023
4094
  }
@@ -4241,7 +4312,7 @@ class AvaliadorSintaticoPitugues {
4241
4312
  }
4242
4313
  exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
4243
4314
 
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){
4315
+ },{"../../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
4316
  "use strict";
4246
4317
  var __importDefault = (this && this.__importDefault) || function (mod) {
4247
4318
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -5977,6 +6048,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
5977
6048
  exports.aleatorio = aleatorio;
5978
6049
  exports.aleatorioEntre = aleatorioEntre;
5979
6050
  exports.algum = algum;
6051
+ exports.clonar = clonar;
5980
6052
  exports.encontrar = encontrar;
5981
6053
  exports.encontrarIndice = encontrarIndice;
5982
6054
  exports.encontrarUltimo = encontrarUltimo;
@@ -6083,6 +6155,211 @@ async function algum(interpretador, vetor, funcaoPesquisa) {
6083
6155
  }
6084
6156
  return false;
6085
6157
  }
6158
+ /**
6159
+ * Clona profundamente uma variável ou constante em Delégua.
6160
+ * @param {InterpretadorInterface} interpretador A instância do interpretador.
6161
+ * @param {VariavelInterface | any} valor O valor a ser clonado.
6162
+ * @returns {Promise<any>} Uma cópia profunda do valor fornecido.
6163
+ */
6164
+ async function clonar(interpretador, valor) {
6165
+ // Resolver o valor caso seja uma VariavelInterface
6166
+ // Verificar se é null/undefined antes de usar hasOwnProperty
6167
+ let valorResolvido;
6168
+ if (valor === null || valor === undefined) {
6169
+ valorResolvido = valor;
6170
+ }
6171
+ else if (typeof valor === 'object' && valor.hasOwnProperty('valor')) {
6172
+ valorResolvido = valor.valor;
6173
+ }
6174
+ else {
6175
+ valorResolvido = valor;
6176
+ }
6177
+ // Map para evitar referências circulares
6178
+ const visitados = new WeakMap();
6179
+ function clonarProfundo(valorAtual) {
6180
+ var _a;
6181
+ // Valores primitivos (null, undefined, number, string, boolean)
6182
+ if (valorAtual === null || valorAtual === undefined) {
6183
+ return valorAtual;
6184
+ }
6185
+ if (typeof valorAtual !== 'object') {
6186
+ return valorAtual;
6187
+ }
6188
+ // Verificar se já visitamos este objeto (evitar referências circulares)
6189
+ if (visitados.has(valorAtual)) {
6190
+ return visitados.get(valorAtual);
6191
+ }
6192
+ // Arrays
6193
+ if (Array.isArray(valorAtual)) {
6194
+ const arrayClonado = [];
6195
+ visitados.set(valorAtual, arrayClonado);
6196
+ for (let i = 0; i < valorAtual.length; i++) {
6197
+ arrayClonado[i] = clonarProfundo(valorAtual[i]);
6198
+ }
6199
+ return arrayClonado;
6200
+ }
6201
+ // Objetos de Delégua - ObjetoDeleguaClasse
6202
+ if (valorAtual instanceof objeto_delegua_classe_1.ObjetoDeleguaClasse) {
6203
+ // Clonar propriedades do objeto
6204
+ const propriedadesClonadas = {};
6205
+ visitados.set(valorAtual, propriedadesClonadas);
6206
+ for (const chave in valorAtual.propriedades) {
6207
+ if (valorAtual.propriedades.hasOwnProperty(chave)) {
6208
+ propriedadesClonadas[chave] = clonarProfundo(valorAtual.propriedades[chave]);
6209
+ }
6210
+ }
6211
+ // Criar novo objeto com as propriedades clonadas
6212
+ // Nota: A classe em si não é clonada, apenas suas propriedades
6213
+ const objetoClonado = new objeto_delegua_classe_1.ObjetoDeleguaClasse(valorAtual.classe);
6214
+ objetoClonado.propriedades = propriedadesClonadas;
6215
+ return objetoClonado;
6216
+ }
6217
+ // Tuplas
6218
+ const nomeClasseTupla = (_a = valorAtual.constructor) === null || _a === void 0 ? void 0 : _a.name;
6219
+ if (nomeClasseTupla &&
6220
+ /^(Dupla|Trio|Quarteto|Quinteto|Sexteto|Septeto|Octeto|Noneto|Deceto)$/.test(nomeClasseTupla)) {
6221
+ const valoresClonados = [];
6222
+ visitados.set(valorAtual, valoresClonados);
6223
+ // Extrair valores da tupla baseado no tipo
6224
+ let valores = [];
6225
+ switch (nomeClasseTupla) {
6226
+ case 'Dupla':
6227
+ valores = [valorAtual.primeiro, valorAtual.segundo];
6228
+ break;
6229
+ case 'Trio':
6230
+ valores = [valorAtual.primeiro, valorAtual.segundo, valorAtual.terceiro];
6231
+ break;
6232
+ case 'Quarteto':
6233
+ valores = [
6234
+ valorAtual.primeiro,
6235
+ valorAtual.segundo,
6236
+ valorAtual.terceiro,
6237
+ valorAtual.quarto,
6238
+ ];
6239
+ break;
6240
+ case 'Quinteto':
6241
+ valores = [
6242
+ valorAtual.primeiro,
6243
+ valorAtual.segundo,
6244
+ valorAtual.terceiro,
6245
+ valorAtual.quarto,
6246
+ valorAtual.quinto,
6247
+ ];
6248
+ break;
6249
+ case 'Sexteto':
6250
+ valores = [
6251
+ valorAtual.primeiro,
6252
+ valorAtual.segundo,
6253
+ valorAtual.terceiro,
6254
+ valorAtual.quarto,
6255
+ valorAtual.quinto,
6256
+ valorAtual.sexto,
6257
+ ];
6258
+ break;
6259
+ case 'Septeto':
6260
+ valores = [
6261
+ valorAtual.primeiro,
6262
+ valorAtual.segundo,
6263
+ valorAtual.terceiro,
6264
+ valorAtual.quarto,
6265
+ valorAtual.quinto,
6266
+ valorAtual.sexto,
6267
+ valorAtual.setimo,
6268
+ ];
6269
+ break;
6270
+ case 'Octeto':
6271
+ valores = [
6272
+ valorAtual.primeiro,
6273
+ valorAtual.segundo,
6274
+ valorAtual.terceiro,
6275
+ valorAtual.quarto,
6276
+ valorAtual.quinto,
6277
+ valorAtual.sexto,
6278
+ valorAtual.setimo,
6279
+ valorAtual.oitavo,
6280
+ ];
6281
+ break;
6282
+ case 'Noneto':
6283
+ valores = [
6284
+ valorAtual.primeiro,
6285
+ valorAtual.segundo,
6286
+ valorAtual.terceiro,
6287
+ valorAtual.quarto,
6288
+ valorAtual.quinto,
6289
+ valorAtual.sexto,
6290
+ valorAtual.setimo,
6291
+ valorAtual.oitavo,
6292
+ valorAtual.nono,
6293
+ ];
6294
+ break;
6295
+ case 'Deceto':
6296
+ valores = [
6297
+ valorAtual.primeiro,
6298
+ valorAtual.segundo,
6299
+ valorAtual.terceiro,
6300
+ valorAtual.quarto,
6301
+ valorAtual.quinto,
6302
+ valorAtual.sexto,
6303
+ valorAtual.setimo,
6304
+ valorAtual.oitavo,
6305
+ valorAtual.nono,
6306
+ valorAtual.decimo,
6307
+ ];
6308
+ break;
6309
+ default:
6310
+ // Se não conseguir identificar, tentar extrair valores diretamente
6311
+ if (valorAtual.valor) {
6312
+ valores = Array.isArray(valorAtual.valor)
6313
+ ? valorAtual.valor
6314
+ : [valorAtual.valor];
6315
+ }
6316
+ }
6317
+ // Clonar valores
6318
+ for (let i = 0; i < valores.length; i++) {
6319
+ valoresClonados.push(clonarProfundo(valores[i]));
6320
+ }
6321
+ // Recriar a tupla com valores clonados
6322
+ switch (nomeClasseTupla) {
6323
+ case 'Dupla':
6324
+ return new construtos_1.Dupla(valoresClonados[0], valoresClonados[1]);
6325
+ case 'Trio':
6326
+ return new construtos_1.Trio(valoresClonados[0], valoresClonados[1], valoresClonados[2]);
6327
+ case 'Quarteto':
6328
+ return new construtos_1.Quarteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3]);
6329
+ case 'Quinteto':
6330
+ return new construtos_1.Quinteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4]);
6331
+ case 'Sexteto':
6332
+ return new construtos_1.Sexteto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5]);
6333
+ case 'Septeto':
6334
+ return new construtos_1.Septeto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6]);
6335
+ case 'Octeto':
6336
+ return new construtos_1.Octeto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6], valoresClonados[7]);
6337
+ case 'Noneto':
6338
+ return new construtos_1.Noneto(valoresClonados[0], valoresClonados[1], valoresClonados[2], valoresClonados[3], valoresClonados[4], valoresClonados[5], valoresClonados[6], valoresClonados[7], valoresClonados[8]);
6339
+ case 'Deceto':
6340
+ 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]);
6341
+ default:
6342
+ // Se não conseguir recriar, retornar os valores clonados como array
6343
+ return valoresClonados;
6344
+ }
6345
+ }
6346
+ // DeleguaFuncao e FuncaoPadrao - funções não são clonadas profundamente
6347
+ // Elas mantêm referência à mesma definição, mas isso é comportamento esperado
6348
+ if (valorAtual instanceof estruturas_1.DeleguaFuncao || valorAtual instanceof funcao_padrao_1.FuncaoPadrao) {
6349
+ return valorAtual;
6350
+ }
6351
+ // Objetos simples (plain objects)
6352
+ const objetoClonado = {};
6353
+ visitados.set(valorAtual, objetoClonado);
6354
+ for (const chave in valorAtual) {
6355
+ if (valorAtual.hasOwnProperty(chave)) {
6356
+ objetoClonado[chave] = clonarProfundo(valorAtual[chave]);
6357
+ }
6358
+ }
6359
+ return objetoClonado;
6360
+ }
6361
+ return Promise.resolve(clonarProfundo(valorResolvido));
6362
+ }
6086
6363
  /**
6087
6364
  * Encontra o primeiro elemento de um vetor cuja função de pesquisa retorne
6088
6365
  * verdadeiro na avaliação de cada elemento.
@@ -7067,7 +7344,7 @@ exports.default = {
7067
7344
  ],
7068
7345
  implementacao: (interpretador, nomePrimitiva, vetor, elemento) => {
7069
7346
  vetor.push(elemento);
7070
- // TODO: Será que apenas isso é suficiente aqui?
7347
+ // TODO: Será que apenas isso é suficiente aqui?
7071
7348
  if (nomePrimitiva !== '') {
7072
7349
  interpretador.pilhaEscoposExecucao.atribuirVariavel({ lexema: nomePrimitiva }, vetor);
7073
7350
  }
@@ -7127,18 +7404,47 @@ exports.default = {
7127
7404
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('excluirQuantidade', 'número'),
7128
7405
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('itens', 'qualquer[]'),
7129
7406
  ],
7130
- implementacao: (interpretador, nomePrimitiva, vetor, inicio, excluirQuantidade, ...itens) => {
7407
+ implementacao: (interpretador, nomePrimitiva, vetor, posicaoInicial, quantidadeExclusao, ...itens) => {
7131
7408
  let elementos = [];
7132
- if (excluirQuantidade || excluirQuantidade === 0) {
7409
+ if (quantidadeExclusao || quantidadeExclusao === 0) {
7133
7410
  elementos = !itens.length
7134
- ? vetor.splice(inicio, excluirQuantidade)
7135
- : vetor.splice(inicio, excluirQuantidade, ...itens);
7411
+ ? vetor.splice(posicaoInicial, quantidadeExclusao)
7412
+ : vetor.splice(posicaoInicial, quantidadeExclusao, ...itens);
7413
+ if (nomePrimitiva !== '') {
7414
+ interpretador.pilhaEscoposExecucao.atribuirVariavel({ lexema: nomePrimitiva }, vetor);
7415
+ }
7416
+ return Promise.resolve(elementos);
7136
7417
  }
7137
7418
  else {
7138
- elementos = !itens.length ? vetor.splice(inicio) : vetor.splice(inicio, ...itens);
7419
+ elementos = !itens.length
7420
+ ? vetor.splice(posicaoInicial)
7421
+ : vetor.splice(posicaoInicial, ...itens);
7422
+ if (nomePrimitiva !== '') {
7423
+ interpretador.pilhaEscoposExecucao.atribuirVariavel({ lexema: nomePrimitiva }, elementos);
7424
+ }
7425
+ return Promise.resolve(vetor);
7139
7426
  }
7140
- return Promise.resolve(elementos);
7141
7427
  },
7428
+ assinaturaFormato: 'vetor.encaixar(posicaoInicial?: número, quantidadeExclusao?: número, itens?: qualquer[])',
7429
+ documentacao: '# `vetor.encaixar(posicaoInicial, quantidadeExclusao, itens)` \n \n' +
7430
+ 'Encaixa um vetor em outro, dadas posições de início e quantidade de ítens a serem excluídos do vetor original. \n' +
7431
+ '\n\n ## Exemplo de Código\n' +
7432
+ '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
7433
+ 'escreva(v.encaixar()) // "[1, 2, 3, 4, 5]", ou seja, não faz coisa alguma.\n' +
7434
+ `var v1 = v.encaixar(2)\n` +
7435
+ 'escreva(v) // "[3, 4, 5]", ou seja, a posição 2, onde fica o 3, passa a ser a nova posição inicial do vetor.\n' +
7436
+ 'escreva(v1) // "[1, 2]", ou seja, o retorno de `encaixar()` são as posições removidas do vetor original.\n' +
7437
+ 'var v2 = [1, 2, 3, 4, 5]\n' +
7438
+ 'escreva(v2.encaixar(2, 1)) // "[3]"\n' +
7439
+ 'escreva(v2) // "[1, 2, 4, 5]"\n```' +
7440
+ 'var v3 = [1, 2, 3, 4, 5]\n' +
7441
+ 'escreva(v3.encaixar(2, 1, "teste")) // "[3]"\n' +
7442
+ 'escreva(v3) // "[1, 2, "teste", 4, 5]"\n```' +
7443
+ '\n\n ### Formas de uso \n' +
7444
+ '`encaixar` suporta sobrecarga do método.\n\n',
7445
+ exemploCodigo: 'vetor.encaixar(<nova posição inicial>)\n' +
7446
+ 'vetor.encaixar(<a partir desta posição>, <exclua esta quantidade de elementos>)\n' +
7447
+ 'vetor.encaixar(<a partir desta posição>, <exclua esta quantidade de elementos>, <adicione estes elementos>)',
7142
7448
  },
7143
7449
  fatiar: {
7144
7450
  tipoRetorno: 'qualquer[]',
@@ -7154,7 +7460,7 @@ exports.default = {
7154
7460
  '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
7155
7461
  'escreva(v.fatiar()) // "[1, 2, 3, 4, 5]", ou seja, não faz coisa alguma.\n' +
7156
7462
  'escreva(v.fatiar(2, 4)) // "[3, 4]"\n' +
7157
- 'escreva(v.fatiar(2)) // "[3, 4, 5]", ou seja, seleciona tudo da posição 3 até o final do vetor.\n```' +
7463
+ 'escreva(v.fatiar(2)) // "[3, 4, 5]", ou seja, extrai trecho da posição até o final do vetor.\n```' +
7158
7464
  '\n\n ### Formas de uso \n' +
7159
7465
  'Fatiar suporta sobrecarga do método.\n\n',
7160
7466
  exemploCodigo: 'vetor.fatiar(<a partir desta posição>)\n' +
@@ -7181,8 +7487,7 @@ exports.default = {
7181
7487
  },
7182
7488
  assinaturaFormato: 'vetor.filtrarPor(funcao: função)',
7183
7489
  documentacao: '# `vetor.filtrarPor(funcao)` \n \n' +
7184
- 'Dada uma função passada como parâmetro, executa essa função para cada elemento do vetor. \n' +
7185
- 'Elementos cujo retorno da função é `falso` são excluídos. \n' +
7490
+ 'Devolve todos os elementos de um vetor cujo resultado da execução de uma função, passada por parâmetro, seja verdadeiro.\n' +
7186
7491
  '\n\n ### Exemplo de Código\n' +
7187
7492
  '\n\n```delegua\nvar v = [1, 2, 3, 4, 5]\n' +
7188
7493
  'var funcaoNumerosImpares = funcao (n) { retorna n % 2 > 0 }\n' +
@@ -7226,13 +7531,13 @@ exports.default = {
7226
7531
  ],
7227
7532
  implementacao: (interpretador, nomePrimitiva, vetor, separador) => Promise.resolve(vetor.join(separador)),
7228
7533
  assinaturaFormato: 'vetor.juntar(separador: texto)',
7229
- documentacao: '# `vetor.juntar(separador)` \n \n' +
7534
+ documentacao: '# `vetor.juntar(separador = ",")` \n \n' +
7230
7535
  'Junta todos os elementos de um vetor em um texto, separando cada elemento pelo separador passado como parâmetro.\n' +
7231
7536
  '\n\n ## Exemplo de Código\n' +
7232
7537
  '\n\n```delegua\nvar v = [1, 2, 3]\n' +
7233
7538
  'escreva(v.juntar(":")) // "1:2:3"\n```' +
7234
7539
  '\n\n ### Formas de uso \n',
7235
- exemploCodigo: 'vetor.juntar()',
7540
+ exemploCodigo: 'vetor.juntar()\n' + 'vetor.juntar(<separador>)',
7236
7541
  },
7237
7542
  mapear: {
7238
7543
  tipoRetorno: 'qualquer[]',
@@ -7251,7 +7556,7 @@ exports.default = {
7251
7556
  return retorno;
7252
7557
  },
7253
7558
  assinaturaFormato: 'vetor.mapear(funcao: função)',
7254
- documentacao: '# `vetor.mapear(funcao)` \n \n' +
7559
+ documentacao: '# `vetor.mapear(funcao)`\n\n' +
7255
7560
  'Dada uma função passada como parâmetro, executa essa função para cada elemento do vetor. \n' +
7256
7561
  'Cada elemento retornado por esta função é adicionado ao vetor resultante. \n' +
7257
7562
  '\n\n ## Exemplo de Código\n' +
@@ -11025,6 +11330,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
11025
11330
  pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
11026
11331
  pilhaEscoposExecucao.definirVariavel('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
11027
11332
  pilhaEscoposExecucao.definirVariavel('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
11333
+ pilhaEscoposExecucao.definirVariavel('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
11028
11334
  pilhaEscoposExecucao.definirVariavel('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
11029
11335
  pilhaEscoposExecucao.definirVariavel('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
11030
11336
  pilhaEscoposExecucao.definirVariavel('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
@@ -11674,7 +11980,6 @@ const metodo_primitiva_1 = require("./estruturas/metodo-primitiva");
11674
11980
  const lexador_1 = require("../lexador");
11675
11981
  const avaliador_sintatico_1 = require("../avaliador-sintatico");
11676
11982
  const espaco_memoria_1 = require("./espaco-memoria");
11677
- const comum_1 = require("./comum");
11678
11983
  const excecoes_1 = require("../excecoes");
11679
11984
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
11680
11985
  const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
@@ -11730,7 +12035,6 @@ class InterpretadorBase {
11730
12035
  emLacoRepeticao: false,
11731
12036
  };
11732
12037
  this.pilhaEscoposExecucao.empilhar(escopoExecucao);
11733
- (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
11734
12038
  }
11735
12039
  visitarExpressaoSeparador(expressao) {
11736
12040
  throw new Error('Método não implementado.');
@@ -12406,8 +12710,7 @@ class InterpretadorBase {
12406
12710
  // para vetor de duplas.
12407
12711
  // TODO: Converter elementos para `Construto` se necessário.
12408
12712
  if (declaracao.vetorOuDicionario.tipo === 'dicionário') {
12409
- valorVetorResolvido = Object.entries(valorVetorResolvido)
12410
- .map(v => new construtos_1.Dupla(v[0], v[1]));
12713
+ valorVetorResolvido = Object.entries(valorVetorResolvido).map((v) => new construtos_1.Dupla(v[0], v[1]));
12411
12714
  }
12412
12715
  if (!Array.isArray(valorVetorResolvido)) {
12413
12716
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
@@ -12837,7 +13140,7 @@ class InterpretadorBase {
12837
13140
  const funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao);
12838
13141
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, funcao);
12839
13142
  return Promise.resolve({
12840
- declaracao: funcao
13143
+ declaracao: funcao,
12841
13144
  });
12842
13145
  }
12843
13146
  /**
@@ -13189,7 +13492,7 @@ class InterpretadorBase {
13189
13492
  exports.InterpretadorBase = InterpretadorBase;
13190
13493
 
13191
13494
  }).call(this)}).call(this,require('_process'))
13192
- },{"../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){
13495
+ },{"../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){
13193
13496
  "use strict";
13194
13497
  var __importDefault = (this && this.__importDefault) || function (mod) {
13195
13498
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -13204,6 +13507,7 @@ const excecoes_1 = require("../excecoes");
13204
13507
  const declaracoes_1 = require("../declaracoes");
13205
13508
  const quebras_1 = require("../quebras");
13206
13509
  const montao_1 = require("./montao");
13510
+ const comum_1 = require("./comum");
13207
13511
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
13208
13512
  const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
13209
13513
  const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
@@ -13217,6 +13521,14 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13217
13521
  constructor(diretorioBase, performance = false, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
13218
13522
  super(diretorioBase, performance, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);
13219
13523
  this.montao = new montao_1.Montao();
13524
+ this.pontoInicializacaoBibliotecasGlobais();
13525
+ }
13526
+ /**
13527
+ * Cada dialeto que deriva deste interpretador conhece este ponto de inicialização.
13528
+ * A partir daqui, cada dialeto pode carregar as bibliotecas globais específicas do seu dialeto.
13529
+ */
13530
+ pontoInicializacaoBibliotecasGlobais() {
13531
+ (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
13220
13532
  }
13221
13533
  resolverReferenciaMontao(referenciaMontao) {
13222
13534
  const valorMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, referenciaMontao.endereco);
@@ -13267,8 +13579,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13267
13579
  }
13268
13580
  if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
13269
13581
  return objeto.valor.paraTexto();
13270
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
13271
- objeto instanceof estruturas_1.DeleguaFuncao)
13582
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
13272
13583
  return objeto.paraTexto();
13273
13584
  if (objeto instanceof quebras_1.RetornoQuebra) {
13274
13585
  if (typeof objeto.valor === 'boolean')
@@ -13306,7 +13617,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13306
13617
  if (typeof valor === primitivos_1.default.BOOLEANO) {
13307
13618
  valor = valor ? 'verdadeiro' : 'falso';
13308
13619
  }
13309
- 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')))) {
13620
+ if (valor instanceof estruturas_1.ReferenciaMontao ||
13621
+ ((valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty) && (valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty('tipo')))) {
13310
13622
  valor = this.resolverValor(valor);
13311
13623
  }
13312
13624
  objetoEscrita[propriedade] = valor;
@@ -13345,13 +13657,14 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13345
13657
  return Promise.resolve({
13346
13658
  tipo: `função<${funcao.declaracao.tipo || 'qualquer'}>`,
13347
13659
  tipoExplicito: funcao.declaracao.tipoExplicito,
13348
- declaracao: funcao
13660
+ declaracao: funcao,
13349
13661
  });
13350
13662
  }
13351
13663
  async logicaComumExecucaoEnquanto(enquanto, acumularRetornos) {
13352
13664
  let retornoExecucao;
13353
13665
  const retornos = [];
13354
- while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13666
+ while ((acumularRetornos ||
13667
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13355
13668
  this.eVerdadeiro(await this.avaliar(enquanto.condicao))) {
13356
13669
  try {
13357
13670
  retornoExecucao = await this.executar(enquanto.corpo);
@@ -13359,7 +13672,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13359
13672
  if (acumularRetornos) {
13360
13673
  return {
13361
13674
  valorRetornado: retornos,
13362
- tipo: 'vetor'
13675
+ tipo: 'vetor',
13363
13676
  };
13364
13677
  }
13365
13678
  return null;
@@ -13383,7 +13696,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13383
13696
  if (acumularRetornos) {
13384
13697
  return {
13385
13698
  valorRetornado: retornos,
13386
- tipo: 'vetor'
13699
+ tipo: 'vetor',
13387
13700
  };
13388
13701
  }
13389
13702
  return retornoExecucao;
@@ -13401,7 +13714,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13401
13714
  if (acumularRetornos) {
13402
13715
  return {
13403
13716
  valorRetornado: retornos,
13404
- tipo: 'vetor'
13717
+ tipo: 'vetor',
13405
13718
  };
13406
13719
  }
13407
13720
  return null;
@@ -13421,12 +13734,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13421
13734
  });
13422
13735
  return Promise.reject(erro);
13423
13736
  }
13424
- } while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13737
+ } while ((acumularRetornos ||
13738
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13425
13739
  this.eVerdadeiro(await this.avaliar(fazer.condicaoEnquanto)));
13426
13740
  if (acumularRetornos) {
13427
13741
  return {
13428
13742
  valorRetornado: retornos,
13429
- tipo: 'vetor'
13743
+ tipo: 'vetor',
13430
13744
  };
13431
13745
  }
13432
13746
  }
@@ -13442,9 +13756,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13442
13756
  }
13443
13757
  let retornoExecucao;
13444
13758
  const retornos = [];
13445
- while (acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
13446
- if (para.condicao !== null &&
13447
- !this.eVerdadeiro(await this.avaliar(para.condicao))) {
13759
+ while (acumularRetornos ||
13760
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
13761
+ if (para.condicao !== null && !this.eVerdadeiro(await this.avaliar(para.condicao))) {
13448
13762
  break;
13449
13763
  }
13450
13764
  retornoExecucao = await this.executar(para.corpo);
@@ -13452,7 +13766,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13452
13766
  if (acumularRetornos) {
13453
13767
  return {
13454
13768
  valorRetornado: retornos,
13455
- tipo: 'vetor'
13769
+ tipo: 'vetor',
13456
13770
  };
13457
13771
  }
13458
13772
  return null;
@@ -13470,7 +13784,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13470
13784
  if (acumularRetornos) {
13471
13785
  return {
13472
13786
  valorRetornado: retornos,
13473
- tipo: 'vetor'
13787
+ tipo: 'vetor',
13474
13788
  };
13475
13789
  }
13476
13790
  return retornoExecucao;
@@ -13491,14 +13805,16 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13491
13805
  if (paraCada.vetorOuDicionario.tipo === 'dicionário') {
13492
13806
  valorVetorOuDicionarioResolvido = Object.entries(valorVetorOuDicionarioResolvido).map((v) => new construtos_1.Dupla(v[0], v[1]));
13493
13807
  }
13494
- if (paraCada.vetorOuDicionario.tipo === 'texto' || typeof valorVetorOuDicionarioResolvido === 'string') {
13808
+ if (paraCada.vetorOuDicionario.tipo === 'texto' ||
13809
+ typeof valorVetorOuDicionarioResolvido === 'string') {
13495
13810
  valorVetorOuDicionarioResolvido = valorVetorOuDicionarioResolvido.split('');
13496
13811
  }
13497
13812
  if (!Array.isArray(valorVetorOuDicionarioResolvido)) {
13498
13813
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
13499
13814
  }
13500
13815
  const retornos = [];
13501
- while ((acumularRetornos || !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13816
+ while ((acumularRetornos ||
13817
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
13502
13818
  paraCada.posicaoAtual < valorVetorOuDicionarioResolvido.length) {
13503
13819
  try {
13504
13820
  if (paraCada.variavelIteracao instanceof construtos_1.Variavel) {
@@ -13514,7 +13830,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13514
13830
  if (acumularRetornos) {
13515
13831
  return {
13516
13832
  valorRetornado: retornos,
13517
- tipo: 'vetor'
13833
+ tipo: 'vetor',
13518
13834
  };
13519
13835
  }
13520
13836
  return null;
@@ -13539,7 +13855,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13539
13855
  if (acumularRetornos) {
13540
13856
  return {
13541
13857
  valorRetornado: retornos,
13542
- tipo: 'vetor'
13858
+ tipo: 'vetor',
13543
13859
  };
13544
13860
  }
13545
13861
  return retornoExecucao;
@@ -13997,7 +14313,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13997
14313
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
13998
14314
  }
13999
14315
  const resultadoCompreensao = await this.avaliar(listaCompreensao.paraCada);
14000
- const resultadoCompreensaoResolvido = resultadoCompreensao.valorRetornado.filter(r => r !== null).map(r => this.resolverValor(r));
14316
+ const resultadoCompreensaoResolvido = resultadoCompreensao.valorRetornado
14317
+ .filter((r) => r !== null)
14318
+ .map((r) => this.resolverValor(r));
14001
14319
  return resultadoCompreensaoResolvido;
14002
14320
  }
14003
14321
  visitarExpressaoPara(expressao) {
@@ -14132,7 +14450,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14132
14450
  escopoAnterior.espacoMemoria.valores = Object.assign(escopoAnterior.espacoMemoria.valores, ultimoEscopo.espacoMemoria.valores);
14133
14451
  escopoAnterior.espacoMemoria.enderecosMontao = new Set([
14134
14452
  ...escopoAnterior.espacoMemoria.enderecosMontao,
14135
- ...ultimoEscopo.espacoMemoria.enderecosMontao
14453
+ ...ultimoEscopo.espacoMemoria.enderecosMontao,
14136
14454
  ]);
14137
14455
  }
14138
14456
  else {
@@ -14152,7 +14470,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14152
14470
  const resultados = await super.interpretar(declaracoes, manterAmbiente);
14153
14471
  if (resultados.resultado.length > 0) {
14154
14472
  const ultimoResultado = resultados.resultado[resultados.resultado.length - 1];
14155
- if (ultimoResultado && ultimoResultado.valorRetornado instanceof quebras_1.RetornoQuebra && ultimoResultado.valorRetornado.valor instanceof estruturas_1.ReferenciaMontao) {
14473
+ if (ultimoResultado &&
14474
+ ultimoResultado.valorRetornado instanceof quebras_1.RetornoQuebra &&
14475
+ ultimoResultado.valorRetornado.valor instanceof estruturas_1.ReferenciaMontao) {
14156
14476
  const ultimaDeclaracao = declaracoes[declaracoes.length - 1];
14157
14477
  ultimoResultado.valorRetornado.valor = this.montao.obterReferencia(ultimaDeclaracao.hashArquivo, ultimaDeclaracao.linha, ultimoResultado.valorRetornado.valor.endereco);
14158
14478
  }
@@ -14162,7 +14482,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
14162
14482
  }
14163
14483
  exports.Interpretador = Interpretador;
14164
14484
 
14165
- },{"../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){
14485
+ },{"../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){
14166
14486
  "use strict";
14167
14487
  Object.defineProperty(exports, "__esModule", { value: true });
14168
14488
  exports.Montao = void 0;
@@ -16342,13 +16662,14 @@ exports.palavrasReservadas = {
16342
16662
  nulo: pitugues_1.default.NULO,
16343
16663
  ou: pitugues_1.default.OU,
16344
16664
  padrao: pitugues_1.default.PADRAO,
16665
+ padrão: pitugues_1.default.PADRAO,
16345
16666
  para: pitugues_1.default.PARA,
16346
16667
  pegue: pitugues_1.default.PEGUE,
16347
16668
  quebrar: pitugues_1.default.QUEBRAR,
16348
16669
  retorna: pitugues_1.default.RETORNA,
16349
16670
  se: pitugues_1.default.SE,
16350
16671
  senao: pitugues_1.default.SENAO,
16351
- senão: pitugues_1.default.SENÃO,
16672
+ senão: pitugues_1.default.SENAO,
16352
16673
  super: pitugues_1.default.SUPER,
16353
16674
  sustar: pitugues_1.default.SUSTAR,
16354
16675
  tendo: pitugues_1.default.TENDO,