@designliquido/delegua 0.42.2 → 0.43.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 (190) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  3. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  4. package/analisador-semantico/analisador-semantico.js +7 -1
  5. package/analisador-semantico/analisador-semantico.js.map +1 -1
  6. package/analisador-semantico/pilha-variaveis.d.ts.map +1 -1
  7. package/analisador-semantico/pilha-variaveis.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  9. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.d.ts +0 -1
  11. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  12. package/avaliador-sintatico/avaliador-sintatico.js +57 -40
  13. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +6 -3
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +16 -3
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +257 -58
  22. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  23. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  24. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  25. package/avaliador-sintatico/micro-avaliador-sintatico-base.d.ts.map +1 -1
  26. package/avaliador-sintatico/micro-avaliador-sintatico-base.js.map +1 -1
  27. package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
  28. package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
  29. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
  30. package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
  31. package/bibliotecas/biblioteca-global.d.ts +6 -5
  32. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  33. package/bibliotecas/biblioteca-global.js +56 -22
  34. package/bibliotecas/biblioteca-global.js.map +1 -1
  35. package/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts.map +1 -1
  36. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js +5 -3
  37. package/bibliotecas/dialetos/egua-classico/biblioteca-global.js.map +1 -1
  38. package/bibliotecas/dialetos/egua-classico/index.d.ts.map +1 -1
  39. package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
  40. package/bibliotecas/dialetos/egua-classico/matematica.js +26 -8
  41. package/bibliotecas/dialetos/egua-classico/matematica.js.map +1 -1
  42. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  43. package/bibliotecas/primitivas-texto.js +5 -7
  44. package/bibliotecas/primitivas-texto.js.map +1 -1
  45. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  46. package/bibliotecas/primitivas-vetor.js +15 -30
  47. package/bibliotecas/primitivas-vetor.js.map +1 -1
  48. package/bin/package.json +1 -1
  49. package/construtos/acesso-metodo.d.ts.map +1 -1
  50. package/construtos/acesso-metodo.js.map +1 -1
  51. package/construtos/atribuicao-por-indice.d.ts.map +1 -1
  52. package/construtos/atribuicao-por-indice.js.map +1 -1
  53. package/construtos/binario.d.ts.map +1 -1
  54. package/construtos/binario.js +4 -2
  55. package/construtos/binario.js.map +1 -1
  56. package/construtos/decorador.d.ts.map +1 -1
  57. package/construtos/decorador.js.map +1 -1
  58. package/construtos/fim-para.d.ts.map +1 -1
  59. package/construtos/fim-para.js.map +1 -1
  60. package/construtos/formatacao-escrita.d.ts.map +1 -1
  61. package/construtos/formatacao-escrita.js.map +1 -1
  62. package/construtos/literal.d.ts.map +1 -1
  63. package/construtos/literal.js.map +1 -1
  64. package/construtos/referencia-funcao.d.ts.map +1 -1
  65. package/construtos/referencia-funcao.js.map +1 -1
  66. package/construtos/super.d.ts.map +1 -1
  67. package/construtos/super.js.map +1 -1
  68. package/construtos/tuplas/index.d.ts.map +1 -1
  69. package/construtos/tuplas/index.js.map +1 -1
  70. package/construtos/tuplas/septeto.d.ts.map +1 -1
  71. package/construtos/tuplas/septeto.js.map +1 -1
  72. package/construtos/variavel.d.ts.map +1 -1
  73. package/construtos/variavel.js.map +1 -1
  74. package/construtos/vetor.d.ts.map +1 -1
  75. package/construtos/vetor.js.map +1 -1
  76. package/declaracoes/aleatorio.d.ts.map +1 -1
  77. package/declaracoes/aleatorio.js.map +1 -1
  78. package/declaracoes/comentario.d.ts.map +1 -1
  79. package/declaracoes/comentario.js.map +1 -1
  80. package/declaracoes/const-multiplo.d.ts.map +1 -1
  81. package/declaracoes/const-multiplo.js.map +1 -1
  82. package/declaracoes/escolha.d.ts.map +1 -1
  83. package/declaracoes/escolha.js.map +1 -1
  84. package/declaracoes/para-cada.d.ts.map +1 -1
  85. package/declaracoes/para-cada.js.map +1 -1
  86. package/declaracoes/var-multiplo.d.ts.map +1 -1
  87. package/declaracoes/var-multiplo.js.map +1 -1
  88. package/formatadores/formatador-delegua.d.ts.map +1 -1
  89. package/formatadores/formatador-delegua.js.map +1 -1
  90. package/formatadores/formatador-pitugues.d.ts.map +1 -1
  91. package/formatadores/formatador-pitugues.js.map +1 -1
  92. package/geracao-identificadores/index.d.ts.map +1 -1
  93. package/geracao-identificadores/index.js.map +1 -1
  94. package/inferenciador.d.ts.map +1 -1
  95. package/inferenciador.js.map +1 -1
  96. package/informacao-variavel-ou-constante.js +1 -1
  97. package/informacao-variavel-ou-constante.js.map +1 -1
  98. package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
  99. package/interfaces/primitiva-interface.d.ts +1 -1
  100. package/interfaces/visitante-comum-interface.d.ts.map +1 -1
  101. package/interpretador/comum.d.ts.map +1 -1
  102. package/interpretador/comum.js.map +1 -1
  103. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  104. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +24 -8
  105. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  106. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
  107. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +4 -2
  108. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  109. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  110. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +26 -9
  111. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  112. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  113. package/interpretador/estruturas/delegua-funcao.js +12 -4
  114. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  115. package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
  116. package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
  117. package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
  118. package/interpretador/estruturas/funcao-padrao.js.map +1 -1
  119. package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  120. package/interpretador/estruturas/objeto-delegua-classe.js +2 -1
  121. package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
  122. package/interpretador/interpretador-base.d.ts.map +1 -1
  123. package/interpretador/interpretador-base.js +88 -36
  124. package/interpretador/interpretador-base.js.map +1 -1
  125. package/interpretador/interpretador-com-depuracao.d.ts.map +1 -1
  126. package/interpretador/interpretador-com-depuracao.js +14 -6
  127. package/interpretador/interpretador-com-depuracao.js.map +1 -1
  128. package/interpretador/interpretador.d.ts.map +1 -1
  129. package/interpretador/interpretador.js +13 -5
  130. package/interpretador/interpretador.js.map +1 -1
  131. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  132. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  133. package/lexador/dialetos/lexador-egua-classico.d.ts.map +1 -1
  134. package/lexador/dialetos/lexador-egua-classico.js +3 -1
  135. package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
  136. package/lexador/dialetos/lexador-guarani.d.ts.map +1 -1
  137. package/lexador/dialetos/lexador-guarani.js +6 -2
  138. package/lexador/dialetos/lexador-guarani.js.map +1 -1
  139. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  140. package/lexador/dialetos/lexador-pitugues.js +4 -2
  141. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  142. package/lexador/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
  143. package/lexador/dialetos/lexador-portugol-ipt.js +4 -2
  144. package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
  145. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +0 -1
  146. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
  147. package/lexador/dialetos/palavras-reservadas/pitugues.js +0 -1
  148. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -1
  149. package/lexador/lexador-base-linha-unica.d.ts.map +1 -1
  150. package/lexador/lexador-base-linha-unica.js.map +1 -1
  151. package/lexador/lexador-base.d.ts.map +1 -1
  152. package/lexador/lexador-base.js.map +1 -1
  153. package/lexador/lexador.d.ts.map +1 -1
  154. package/lexador/lexador.js +3 -1
  155. package/lexador/lexador.js.map +1 -1
  156. package/lexador/micro-lexador.d.ts.map +1 -1
  157. package/lexador/micro-lexador.js +3 -1
  158. package/lexador/micro-lexador.js.map +1 -1
  159. package/lexador/traducao/lexador-javascript.d.ts.map +1 -1
  160. package/lexador/traducao/lexador-javascript.js.map +1 -1
  161. package/package.json +1 -1
  162. package/tipos-de-simbolos/pitugues.d.ts +0 -1
  163. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  164. package/tipos-de-simbolos/pitugues.js +0 -1
  165. package/tipos-de-simbolos/pitugues.js.map +1 -1
  166. package/tradutores/python/python3-lexer.d.ts.map +1 -1
  167. package/tradutores/python/python3-lexer.js +2 -1
  168. package/tradutores/python/python3-lexer.js.map +1 -1
  169. package/tradutores/python/python3-parser.d.ts.map +1 -1
  170. package/tradutores/python/python3-parser.js +17 -8
  171. package/tradutores/python/python3-parser.js.map +1 -1
  172. package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
  173. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  174. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  175. package/tradutores/tradutor-assemblyscript.js +22 -8
  176. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  177. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  178. package/tradutores/tradutor-javascript.js +24 -8
  179. package/tradutores/tradutor-javascript.js.map +1 -1
  180. package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
  181. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  182. package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
  183. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  184. package/tradutores/tradutor-python.d.ts.map +1 -1
  185. package/tradutores/tradutor-python.js +7 -5
  186. package/tradutores/tradutor-python.js.map +1 -1
  187. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  188. package/tradutores/tradutor-reverso-javascript.js +2 -1
  189. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  190. package/umd/delegua.js +628 -258
package/umd/delegua.js CHANGED
@@ -306,7 +306,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
306
306
  throw this.erro(this.simbolos[this.atual], `Tipo de dados desconhecido: '${this.simbolos[this.atual].lexema}'.`);
307
307
  }
308
308
  if (this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
309
- const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
309
+ const tiposVetores = [
310
+ 'inteiro[]',
311
+ 'numero[]',
312
+ 'número[]',
313
+ 'qualquer[]',
314
+ 'real[]',
315
+ 'texto[]',
316
+ ];
310
317
  this.avancarEDevolverAnterior();
311
318
  if (!this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_DIREITO)) {
312
319
  throw this.erro(this.simbolos[this.atual], `Esperado símbolo de fechamento do vetor: ']'. Atual: ${this.simbolos[this.atual].lexema}`);
@@ -404,8 +411,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
404
411
  case delegua_2.default.EXPRESSAO_REGULAR:
405
412
  let valor = '';
406
413
  let linhaAtual = this.simbolos[this.atual].linha;
407
- let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
408
- .length %
414
+ let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR).length %
409
415
  2 ===
410
416
  0;
411
417
  if (eParExpressaoRegular) {
@@ -658,16 +664,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
658
664
  if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
659
665
  const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
660
666
  if (erros.length > 0) {
661
- throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => mensagem += `${erro}\n`, '')}`);
667
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => (mensagem += `${erro}\n`), '')}`);
662
668
  }
663
669
  return entidadeChamadaResolvidaVariavel;
664
670
  }
665
671
  }
666
- if (tipoPrimitiva !== undefined && this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
672
+ if (tipoPrimitiva !== undefined &&
673
+ this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
667
674
  var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
668
675
  const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
669
676
  if (erros.length > 0) {
670
- throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => mensagem += `${erro}\n`, '')}`);
677
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => (mensagem += `${erro}\n`), '')}`);
671
678
  }
672
679
  return entidadeChamadaResolvidaVariavel;
673
680
  }
@@ -865,7 +872,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
865
872
  blocoEscopo() {
866
873
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
867
874
  let declaracoes = [];
868
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
875
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
876
+ !this.estaNoFinal()) {
869
877
  const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
870
878
  if (Array.isArray(retornoDeclaracao)) {
871
879
  declaracoes = declaracoes.concat(retornoDeclaracao);
@@ -919,7 +927,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
919
927
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
920
928
  const caminhos = [];
921
929
  let caminhoPadrao = null;
922
- while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
930
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
931
+ !this.estaNoFinal()) {
923
932
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
924
933
  const caminhoCondicoes = [this.expressao()];
925
934
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
@@ -1314,8 +1323,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1314
1323
  }
1315
1324
  switch (inicializador.constructor.name) {
1316
1325
  case 'AcessoIndiceVariavel':
1317
- const entidadeChamadaAcessoIndiceVariavel = inicializador.entidadeChamada;
1318
- return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
1326
+ const entidadeChamadaAcessoIndiceVariavel = inicializador
1327
+ .entidadeChamada;
1328
+ // Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
1329
+ if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
1330
+ return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
1331
+ }
1332
+ if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
1333
+ return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
1334
+ }
1335
+ // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
1336
+ return 'qualquer';
1319
1337
  case 'Chamada':
1320
1338
  const entidadeChamadaChamada = inicializador.entidadeChamada;
1321
1339
  switch (entidadeChamadaChamada.constructor.name) {
@@ -1323,8 +1341,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1323
1341
  const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
1324
1342
  return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
1325
1343
  case 'AcessoMetodoOuPropriedade':
1326
- // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1327
- // e a chamada normalmente é feita para uma primitiva.
1344
+ // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1345
+ // e a chamada normalmente é feita para uma primitiva.
1328
1346
  // A inferência, portanto, ocorre pelo uso da primitiva.
1329
1347
  const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
1330
1348
  if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
@@ -1360,9 +1378,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1360
1378
  case 'Noneto':
1361
1379
  case 'Deceto':
1362
1380
  return delegua_1.default.TUPLA;
1363
- case "ImportarBiblioteca":
1364
- case "ModuloDeclaracoes":
1365
- return "módulo";
1381
+ case 'ImportarBiblioteca':
1382
+ case 'ModuloDeclaracoes':
1383
+ return 'módulo';
1366
1384
  default:
1367
1385
  return inicializador.tipo;
1368
1386
  }
@@ -1403,7 +1421,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1403
1421
  throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
1404
1422
  }
1405
1423
  for (let [indice, identificador] of identificadores.entries()) {
1406
- // Se tipo ainda não foi definido, infere.
1407
1424
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1408
1425
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1409
1426
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
@@ -1621,7 +1638,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1621
1638
  this.pilhaDecoradores = [];
1622
1639
  const metodos = [];
1623
1640
  const propriedades = [];
1624
- while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
1641
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
1642
+ !this.estaNoFinal()) {
1625
1643
  // Se o símbolo atual é arroba, é um decorador.
1626
1644
  // Caso contrário, verificamos o próximo símbolo.
1627
1645
  if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
@@ -1713,92 +1731,91 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1713
1731
  }
1714
1732
  /**
1715
1733
  * Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
1716
- * TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
1717
1734
  */
1718
1735
  inicializarPilhaEscopos() {
1719
1736
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
1720
1737
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
1721
1738
  // Funções nativas de Delégua
1722
1739
  this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
1723
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
1740
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número'),
1724
1741
  ]));
1725
1742
  this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
1726
1743
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
1727
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
1744
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
1728
1745
  ]));
1729
1746
  this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
1730
1747
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1731
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1748
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1732
1749
  ]));
1733
1750
  this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
1734
1751
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1735
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1752
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1736
1753
  ]));
1737
1754
  this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
1738
1755
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1739
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1756
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1740
1757
  ]));
1741
1758
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
1742
1759
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1743
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1760
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1744
1761
  ]));
1745
1762
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
1746
1763
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1747
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1764
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1748
1765
  ]));
1749
1766
  this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
1750
1767
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1751
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1768
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1752
1769
  ]));
1753
1770
  this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
1754
1771
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1755
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1772
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
1756
1773
  ]));
1757
1774
  this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
1758
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1775
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
1759
1776
  ]));
1760
1777
  this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
1761
1778
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1762
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
1779
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
1763
1780
  ]));
1764
1781
  this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1765
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1782
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1766
1783
  ]));
1767
1784
  this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1768
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1785
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1769
1786
  ]));
1770
1787
  this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
1771
1788
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1772
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
1789
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
1773
1790
  ]));
1774
1791
  this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
1775
1792
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1776
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1793
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1777
1794
  ]));
1778
1795
  this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
1779
1796
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1780
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1797
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1781
1798
  ]));
1782
1799
  this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
1783
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1800
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1784
1801
  ]));
1785
1802
  this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
1786
1803
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1787
1804
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
1788
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
1805
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
1789
1806
  ]));
1790
1807
  this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
1791
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
1808
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
1792
1809
  ]));
1793
1810
  this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
1794
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1811
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1795
1812
  ]));
1796
1813
  this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
1797
1814
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1798
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
1815
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
1799
1816
  ]));
1800
1817
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
1801
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
1818
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1802
1819
  ]));
1803
1820
  // TODO: Escrever algum tipo de validação aqui.
1804
1821
  for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
@@ -2183,7 +2200,8 @@ class AvaliadorSintaticoEguaClassico {
2183
2200
  }
2184
2201
  blocoEscopo() {
2185
2202
  const declaracoes = [];
2186
- while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
2203
+ while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
2204
+ !this.estaNoFinal()) {
2187
2205
  declaracoes.push(this.resolverDeclaracaoForaDeBloco());
2188
2206
  }
2189
2207
  this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
@@ -2288,7 +2306,8 @@ class AvaliadorSintaticoEguaClassico {
2288
2306
  this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
2289
2307
  const caminhos = [];
2290
2308
  let caminhoPadrao = null;
2291
- while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
2309
+ while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) &&
2310
+ !this.estaNoFinal()) {
2292
2311
  if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CASO)) {
2293
2312
  const caminhoCondicoes = [this.expressao()];
2294
2313
  this.consumir(egua_classico_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
@@ -2450,7 +2469,8 @@ class AvaliadorSintaticoEguaClassico {
2450
2469
  }
2451
2470
  this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
2452
2471
  const metodos = [];
2453
- while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
2472
+ while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
2473
+ !this.estaNoFinal()) {
2454
2474
  metodos.push(this.funcao('método'));
2455
2475
  }
2456
2476
  this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
@@ -2504,9 +2524,12 @@ const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime
2504
2524
  const construtos_1 = require("../../construtos");
2505
2525
  const declaracoes_1 = require("../../declaracoes");
2506
2526
  const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
2507
- const pitugues_1 = __importDefault(require("../../tipos-de-simbolos/pitugues"));
2508
2527
  const lexador_1 = require("../../lexador");
2509
2528
  const inferenciador_1 = require("../../inferenciador");
2529
+ const pilha_escopos_1 = require("../pilha-escopos");
2530
+ const informacao_escopo_1 = require("../informacao-escopo");
2531
+ const informacao_variavel_ou_constante_1 = require("../../informacao-variavel-ou-constante");
2532
+ const pitugues_1 = __importDefault(require("../../tipos-de-simbolos/pitugues"));
2510
2533
  /**
2511
2534
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
2512
2535
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -2521,6 +2544,77 @@ class AvaliadorSintaticoPitugues {
2521
2544
  this.blocos = 0;
2522
2545
  this.performance = performance;
2523
2546
  this.escopos = [];
2547
+ this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
2548
+ this.primitivasConhecidas = {};
2549
+ this.tiposDefinidosEmCodigo = {};
2550
+ }
2551
+ logicaComumInferenciaTiposVariaveisEConstantes(inicializador, tipo) {
2552
+ if (tipo !== 'qualquer') {
2553
+ return tipo;
2554
+ }
2555
+ switch (inicializador.constructor.name) {
2556
+ case 'AcessoIndiceVariavel':
2557
+ const entidadeChamadaAcessoIndiceVariavel = inicializador
2558
+ .entidadeChamada;
2559
+ // Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
2560
+ if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
2561
+ return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
2562
+ }
2563
+ if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
2564
+ return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
2565
+ }
2566
+ // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
2567
+ return 'qualquer';
2568
+ case 'Chamada':
2569
+ const entidadeChamadaChamada = inicializador.entidadeChamada;
2570
+ switch (entidadeChamadaChamada.constructor.name) {
2571
+ case 'AcessoMetodo':
2572
+ const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
2573
+ return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
2574
+ case 'AcessoMetodoOuPropriedade':
2575
+ // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
2576
+ // e a chamada normalmente é feita para uma primitiva.
2577
+ // A inferência, portanto, ocorre pelo uso da primitiva.
2578
+ const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
2579
+ if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
2580
+ return this.primitivasConhecidas[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
2581
+ }
2582
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
2583
+ case 'AcessoPropriedade':
2584
+ const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
2585
+ return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
2586
+ case 'ArgumentoReferenciaFuncao':
2587
+ // TODO: Voltar aqui se necessário.
2588
+ return 'qualquer';
2589
+ case 'ReferenciaFuncao':
2590
+ const entidadeChamadaReferenciaFuncao = entidadeChamadaChamada;
2591
+ return entidadeChamadaReferenciaFuncao.tipo;
2592
+ case 'Variavel':
2593
+ const entidadeChamadaVariavel = entidadeChamadaChamada;
2594
+ return entidadeChamadaVariavel.tipo;
2595
+ }
2596
+ break;
2597
+ case 'FuncaoConstruto':
2598
+ const funcaoConstruto = inicializador;
2599
+ return `função<${funcaoConstruto.tipo}>`;
2600
+ case 'Leia':
2601
+ return 'texto';
2602
+ case 'Dupla':
2603
+ case 'Trio':
2604
+ case 'Quarteto':
2605
+ case 'Quinteto':
2606
+ case 'Sexteto':
2607
+ case 'Septeto':
2608
+ case 'Octeto':
2609
+ case 'Noneto':
2610
+ case 'Deceto':
2611
+ return 'tupla';
2612
+ case 'ImportarBiblioteca':
2613
+ case 'ModuloDeclaracoes':
2614
+ return 'módulo';
2615
+ default:
2616
+ return inicializador.tipo;
2617
+ }
2524
2618
  }
2525
2619
  expressaoLeia() {
2526
2620
  const simboloLeia = this.simbolos[this.atual];
@@ -2566,8 +2660,8 @@ class AvaliadorSintaticoPitugues {
2566
2660
  let retorno = [];
2567
2661
  for (let [indice, identificador] of identificadores.entries()) {
2568
2662
  // Se tipo ainda não foi definido, infere.
2569
- // tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
2570
- // this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
2663
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
2664
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
2571
2665
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo
2572
2666
  // TODO: Discutir decoradores com comunidade.
2573
2667
  // Array.from(this.pilhaDecoradores)
@@ -2582,10 +2676,12 @@ class AvaliadorSintaticoPitugues {
2582
2676
  declaracaoDeVariaveis() {
2583
2677
  const identificadores = [];
2584
2678
  let retorno = [];
2679
+ let tipo = 'qualquer';
2585
2680
  do {
2586
2681
  identificadores.push(this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
2587
2682
  } while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
2588
2683
  if (!this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
2684
+ // Inicialização de variáveis sem valor.
2589
2685
  for (let [indice, identificador] of identificadores.entries()) {
2590
2686
  retorno.push(new declaracoes_1.Var(identificador, null));
2591
2687
  }
@@ -2600,9 +2696,11 @@ class AvaliadorSintaticoPitugues {
2600
2696
  throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
2601
2697
  }
2602
2698
  for (let [indice, identificador] of identificadores.entries()) {
2603
- retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice]));
2699
+ const inicializador = inicializadores[indice];
2700
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
2701
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
2702
+ retorno.push(new declaracoes_1.Var(identificador, inicializador, tipo));
2604
2703
  }
2605
- this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA);
2606
2704
  return retorno;
2607
2705
  }
2608
2706
  sincronizar() {
@@ -2674,9 +2772,6 @@ class AvaliadorSintaticoPitugues {
2674
2772
  const simboloAtual = this.simbolos[this.atual];
2675
2773
  let valores = [];
2676
2774
  switch (simboloAtual.tipo) {
2677
- case pitugues_1.default.SUPER:
2678
- const simboloSuper = this.avancarEDevolverAnterior();
2679
- return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
2680
2775
  case pitugues_1.default.COLCHETE_ESQUERDO:
2681
2776
  this.avancarEDevolverAnterior();
2682
2777
  if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.COLCHETE_DIREITO)) {
@@ -2716,14 +2811,18 @@ class AvaliadorSintaticoPitugues {
2716
2811
  case pitugues_1.default.FUNÇÃO:
2717
2812
  const simboloFuncao = this.avancarEDevolverAnterior();
2718
2813
  const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
2719
- // this.pilhaEscopos.definirTipoVariavel(simboloFuncao.lexema, 'função');
2814
+ this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
2720
2815
  return corpoDaFuncao;
2816
+ case pitugues_1.default.IMPORTAR:
2817
+ return this.declaracaoImportar();
2721
2818
  case pitugues_1.default.NULO:
2722
2819
  this.avancarEDevolverAnterior();
2723
2820
  return new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, null);
2724
2821
  case pitugues_1.default.ISTO:
2725
2822
  const simboloIsto = this.avancarEDevolverAnterior();
2726
2823
  return new construtos_1.Isto(this.hashArquivo, simboloAtual.linha, simboloIsto);
2824
+ case pitugues_1.default.LEIA:
2825
+ return this.expressaoLeia();
2727
2826
  case pitugues_1.default.NUMERO:
2728
2827
  case pitugues_1.default.TEXTO:
2729
2828
  const simboloLiteral = this.avancarEDevolverAnterior();
@@ -2732,14 +2831,22 @@ class AvaliadorSintaticoPitugues {
2732
2831
  return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
2733
2832
  case pitugues_1.default.IDENTIFICADOR:
2734
2833
  const simboloIdentificador = this.avancarEDevolverAnterior();
2735
- return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador);
2834
+ let tipoOperando;
2835
+ if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
2836
+ tipoOperando = simboloIdentificador.lexema;
2837
+ }
2838
+ else {
2839
+ tipoOperando = this.pilhaEscopos.obterTipoVariavelPorNome(simboloIdentificador.lexema);
2840
+ }
2841
+ return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
2736
2842
  case pitugues_1.default.PARENTESE_ESQUERDO:
2737
2843
  this.avancarEDevolverAnterior();
2738
2844
  const expressao = this.expressao();
2739
2845
  this.consumir(pitugues_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
2740
2846
  return new construtos_1.Agrupamento(this.hashArquivo, simboloAtual.linha, expressao);
2741
- case pitugues_1.default.IMPORTAR:
2742
- return this.declaracaoImportar();
2847
+ case pitugues_1.default.SUPER:
2848
+ const simboloSuper = this.avancarEDevolverAnterior();
2849
+ return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
2743
2850
  }
2744
2851
  throw this.erro(this.simboloAtual(), 'Esperado expressão.');
2745
2852
  }
@@ -2903,9 +3010,8 @@ class AvaliadorSintaticoPitugues {
2903
3010
  }
2904
3011
  return expressao;
2905
3012
  }
3013
+ // TODO: Depreciar.
2906
3014
  expressao() {
2907
- if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.LEIA))
2908
- return this.expressaoLeia();
2909
3015
  return this.atribuir();
2910
3016
  }
2911
3017
  declaracaoEscreva() {
@@ -2923,6 +3029,7 @@ class AvaliadorSintaticoPitugues {
2923
3029
  return new declaracoes_1.Expressao(expressao);
2924
3030
  }
2925
3031
  blocoEscopo() {
3032
+ this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
2926
3033
  let declaracoes = [];
2927
3034
  let simboloAtual = this.simboloAtual();
2928
3035
  const simboloAnterior = this.simboloAnterior();
@@ -2946,28 +3053,27 @@ class AvaliadorSintaticoPitugues {
2946
3053
  `Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
2947
3054
  `Atual: ${espacosIndentacaoLinhaAtual}`);
2948
3055
  }
2949
- else {
2950
- // Indentação ok, é um bloco de escopo.
2951
- // Inclui todas as declarações cujas linhas tenham o mesmo número de espaços
2952
- // de indentação do bloco.
2953
- // Se `simboloAtual` for definido em algum momento como indefinido,
2954
- // Significa que o código acabou, então o bloco também acabou.
2955
- const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
2956
- while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
2957
- const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
2958
- if (Array.isArray(retornoDeclaracao)) {
2959
- declaracoes = declaracoes.concat(retornoDeclaracao);
2960
- }
2961
- else {
2962
- declaracoes.push(retornoDeclaracao);
2963
- }
2964
- simboloAtual = this.simboloAtual();
2965
- if (!simboloAtual)
2966
- break;
2967
- espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
3056
+ // Indentação ok, é um bloco de escopo.
3057
+ // Inclui todas as declarações cujas linhas tenham o mesmo número de espaços
3058
+ // de indentação do bloco.
3059
+ // Se `simboloAtual` for definido em algum momento como indefinido,
3060
+ // Significa que o código acabou, então o bloco também acabou.
3061
+ const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
3062
+ while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
3063
+ const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
3064
+ if (Array.isArray(retornoDeclaracao)) {
3065
+ declaracoes = declaracoes.concat(retornoDeclaracao);
2968
3066
  }
3067
+ else {
3068
+ declaracoes.push(retornoDeclaracao);
3069
+ }
3070
+ simboloAtual = this.simboloAtual();
3071
+ if (!simboloAtual)
3072
+ break;
3073
+ espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
2969
3074
  }
2970
3075
  }
3076
+ this.pilhaEscopos.removerUltimo();
2971
3077
  return declaracoes;
2972
3078
  }
2973
3079
  declaracaoEnquanto() {
@@ -3033,30 +3139,54 @@ class AvaliadorSintaticoPitugues {
3033
3139
  this.blocos -= 1;
3034
3140
  }
3035
3141
  }
3142
+ declaracaoParaCada(simboloPara) {
3143
+ const nomeVariavelIteracao = this.consumir(pitugues_1.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
3144
+ if (!this.verificarSeSimboloAtualEIgualA(pitugues_1.default.DE, pitugues_1.default.EM)) {
3145
+ throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
3146
+ }
3147
+ const vetor = this.expressao();
3148
+ if (!vetor.hasOwnProperty('tipo')) {
3149
+ throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
3150
+ }
3151
+ const tipoVetor = vetor.tipo;
3152
+ if (!tipoVetor.endsWith('[]') && tipoVetor !== 'vetor') {
3153
+ throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
3154
+ }
3155
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
3156
+ // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
3157
+ const corpo = this.resolverDeclaracao();
3158
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
3159
+ }
3160
+ declaracaoParaTradicional(simboloPara) {
3161
+ let inicializador;
3162
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA)) {
3163
+ inicializador = null;
3164
+ }
3165
+ else if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VARIAVEL)) {
3166
+ inicializador = this.declaracaoDeVariaveis();
3167
+ }
3168
+ else {
3169
+ inicializador = this.declaracaoExpressao();
3170
+ }
3171
+ let condicao = null;
3172
+ if (!this.verificarTipoSimboloAtual(pitugues_1.default.PONTO_E_VIRGULA)) {
3173
+ condicao = this.expressao();
3174
+ }
3175
+ let incrementar = null;
3176
+ if (this.simbolos[this.atual].tipo !== pitugues_1.default.DOIS_PONTOS) {
3177
+ incrementar = this.expressao();
3178
+ }
3179
+ const corpo = this.resolverDeclaracao();
3180
+ return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
3181
+ }
3036
3182
  declaracaoPara() {
3037
3183
  try {
3038
3184
  const simboloPara = this.simboloAnterior();
3039
3185
  this.blocos += 1;
3040
- let inicializador;
3041
- if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA)) {
3042
- inicializador = null;
3043
- }
3044
- else if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VARIAVEL)) {
3045
- inicializador = this.declaracaoDeVariaveis();
3046
- }
3047
- else {
3048
- inicializador = this.declaracaoExpressao();
3049
- }
3050
- let condicao = null;
3051
- if (!this.verificarTipoSimboloAtual(pitugues_1.default.PONTO_E_VIRGULA)) {
3052
- condicao = this.expressao();
3053
- }
3054
- let incrementar = null;
3055
- if (this.simbolos[this.atual].tipo !== pitugues_1.default.DOIS_PONTOS) {
3056
- incrementar = this.expressao();
3186
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.CADA)) {
3187
+ return this.declaracaoParaCada(simboloPara);
3057
3188
  }
3058
- const corpo = this.resolverDeclaracao();
3059
- return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
3189
+ return this.declaracaoParaTradicional(simboloPara);
3060
3190
  }
3061
3191
  catch (erro) {
3062
3192
  throw erro;
@@ -3166,7 +3296,6 @@ class AvaliadorSintaticoPitugues {
3166
3296
  case pitugues_1.default.PARA:
3167
3297
  this.avancarEDevolverAnterior();
3168
3298
  return this.declaracaoPara();
3169
- case pitugues_1.default.PAUSA:
3170
3299
  case pitugues_1.default.SUSTAR:
3171
3300
  this.avancarEDevolverAnterior();
3172
3301
  return this.declaracaoSustar();
@@ -3200,17 +3329,18 @@ class AvaliadorSintaticoPitugues {
3200
3329
  const parametro = {};
3201
3330
  if (this.simboloAtual().tipo === pitugues_1.default.MULTIPLICACAO) {
3202
3331
  this.consumir(pitugues_1.default.MULTIPLICACAO, null);
3203
- parametro['tipo'] = 'multiplo';
3332
+ parametro.abrangencia = 'multiplo';
3204
3333
  }
3205
3334
  else {
3206
- parametro['tipo'] = 'padrao';
3335
+ parametro.abrangencia = 'padrao';
3207
3336
  }
3208
- parametro['nome'] = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
3337
+ parametro.nome = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
3209
3338
  if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
3210
- parametro['valorPadrao'] = this.primario();
3339
+ parametro.valorPadrao = this.primario();
3211
3340
  }
3341
+ this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
3212
3342
  parametros.push(parametro);
3213
- if (parametro['tipo'] === 'multiplo')
3343
+ if (parametro.abrangencia === 'multiplo')
3214
3344
  break;
3215
3345
  } while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
3216
3346
  return parametros;
@@ -3270,12 +3400,100 @@ class AvaliadorSintaticoPitugues {
3270
3400
  return null;
3271
3401
  }
3272
3402
  }
3403
+ registrarTiposBibliotecasEPrimitivas() {
3404
+ this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
3405
+ this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
3406
+ // Funções nativas de Delégua
3407
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
3408
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número'),
3409
+ ]));
3410
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
3411
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
3412
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
3413
+ ]));
3414
+ this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
3415
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3416
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
3417
+ ]));
3418
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
3419
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3420
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
3421
+ ]));
3422
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
3423
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3424
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
3425
+ ]));
3426
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
3427
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3428
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
3429
+ ]));
3430
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
3431
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3432
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
3433
+ ]));
3434
+ this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
3435
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3436
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
3437
+ ]));
3438
+ this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
3439
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3440
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
3441
+ ]));
3442
+ this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
3443
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
3444
+ ]));
3445
+ this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
3446
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3447
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
3448
+ ]));
3449
+ this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
3450
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
3451
+ ]));
3452
+ this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
3453
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
3454
+ ]));
3455
+ this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
3456
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3457
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
3458
+ ]));
3459
+ this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
3460
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3461
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
3462
+ ]));
3463
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
3464
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3465
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
3466
+ ]));
3467
+ this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
3468
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
3469
+ ]));
3470
+ this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
3471
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3472
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
3473
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
3474
+ ]));
3475
+ this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
3476
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
3477
+ ]));
3478
+ this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
3479
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
3480
+ ]));
3481
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
3482
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3483
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
3484
+ ]));
3485
+ this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
3486
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
3487
+ ]));
3488
+ }
3273
3489
  analisar(retornoLexador, hashArquivo) {
3274
3490
  const inicioAnalise = (0, browser_process_hrtime_1.default)();
3275
3491
  this.erros = [];
3276
3492
  this.atual = 0;
3277
3493
  this.blocos = 0;
3278
3494
  this.escopos = [];
3495
+ this.registrarTiposBibliotecasEPrimitivas();
3496
+ this.tiposDefinidosEmCodigo = {};
3279
3497
  this.hashArquivo = hashArquivo || 0;
3280
3498
  this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
3281
3499
  this.pragmas = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.pragmas) || {};
@@ -3291,6 +3509,7 @@ class AvaliadorSintaticoPitugues {
3291
3509
  }
3292
3510
  if (this.performance) {
3293
3511
  const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
3512
+ // eslint-disable-next-line no-undef
3294
3513
  console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
3295
3514
  }
3296
3515
  return {
@@ -3301,7 +3520,7 @@ class AvaliadorSintaticoPitugues {
3301
3520
  }
3302
3521
  exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
3303
3522
 
3304
- },{"../../construtos":42,"../../declaracoes":82,"../../inferenciador":105,"../../lexador":154,"../../tipos-de-simbolos/pitugues":169,"../erro-avaliador-sintatico":7,"browser-process-hrtime":342}],5:[function(require,module,exports){
3523
+ },{"../../construtos":42,"../../declaracoes":82,"../../inferenciador":105,"../../informacao-variavel-ou-constante":106,"../../lexador":154,"../../tipos-de-simbolos/pitugues":169,"../erro-avaliador-sintatico":7,"../informacao-escopo":9,"../pilha-escopos":12,"browser-process-hrtime":342}],5:[function(require,module,exports){
3305
3524
  "use strict";
3306
3525
  var __importDefault = (this && this.__importDefault) || function (mod) {
3307
3526
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -3993,7 +4212,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
3993
4212
  if (arguments.length <= 0) {
3994
4213
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A função recebe ao menos um parâmetro.'));
3995
4214
  }
3996
- const valorMinimo = minimo.hasOwnProperty('valor') ? minimo.valor : minimo;
4215
+ const valorMinimo = minimo.hasOwnProperty('valor')
4216
+ ? minimo.valor
4217
+ : minimo;
3997
4218
  if (arguments.length === 2) {
3998
4219
  if (typeof valorMinimo !== 'number') {
3999
4220
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'O parâmetro deve ser um número.'));
@@ -4003,7 +4224,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
4003
4224
  if (arguments.length > 3) {
4004
4225
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A quantidade de parâmetros máxima para esta função é 2.'));
4005
4226
  }
4006
- const valorMaximo = maximo.hasOwnProperty('valor') ? maximo.valor : maximo;
4227
+ const valorMaximo = maximo.hasOwnProperty('valor')
4228
+ ? maximo.valor
4229
+ : maximo;
4007
4230
  if (typeof valorMinimo !== 'number' || typeof valorMaximo !== 'number') {
4008
4231
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Os dois parâmetros devem ser do tipo número.'));
4009
4232
  }
@@ -4018,7 +4241,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
4018
4241
  */
4019
4242
  async function algum(interpretador, vetor, funcaoPesquisa) {
4020
4243
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4021
- const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor') ? funcaoPesquisa.valor : funcaoPesquisa;
4244
+ const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
4245
+ ? funcaoPesquisa.valor
4246
+ : funcaoPesquisa;
4022
4247
  if (!Array.isArray(valorVetor)) {
4023
4248
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
4024
4249
  }
@@ -4042,7 +4267,9 @@ async function algum(interpretador, vetor, funcaoPesquisa) {
4042
4267
  */
4043
4268
  async function encontrar(interpretador, vetor, funcaoPesquisa) {
4044
4269
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4045
- const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor') ? funcaoPesquisa.valor : funcaoPesquisa;
4270
+ const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
4271
+ ? funcaoPesquisa.valor
4272
+ : funcaoPesquisa;
4046
4273
  if (!Array.isArray(valorVetor)) {
4047
4274
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
4048
4275
  }
@@ -4066,7 +4293,9 @@ async function encontrar(interpretador, vetor, funcaoPesquisa) {
4066
4293
  */
4067
4294
  async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
4068
4295
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4069
- const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor') ? funcaoPesquisa.valor : funcaoPesquisa;
4296
+ const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
4297
+ ? funcaoPesquisa.valor
4298
+ : funcaoPesquisa;
4070
4299
  if (!Array.isArray(valorVetor)) {
4071
4300
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
4072
4301
  }
@@ -4090,7 +4319,9 @@ async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
4090
4319
  */
4091
4320
  async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
4092
4321
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4093
- const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor') ? funcaoPesquisa.valor : funcaoPesquisa;
4322
+ const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
4323
+ ? funcaoPesquisa.valor
4324
+ : funcaoPesquisa;
4094
4325
  if (!Array.isArray(valorVetor)) {
4095
4326
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
4096
4327
  }
@@ -4113,7 +4344,9 @@ async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
4113
4344
  */
4114
4345
  async function encontrarUltimoIndice(interpretador, vetor, funcaoPesquisa) {
4115
4346
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4116
- const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor') ? funcaoPesquisa.valor : funcaoPesquisa;
4347
+ const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
4348
+ ? funcaoPesquisa.valor
4349
+ : funcaoPesquisa;
4117
4350
  if (!Array.isArray(valorVetor)) {
4118
4351
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
4119
4352
  }
@@ -4138,7 +4371,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
4138
4371
  if (vetor === null || vetor === undefined)
4139
4372
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() não pode ser nulo.'));
4140
4373
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4141
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
4374
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
4375
+ ? funcaoFiltragem.valor
4376
+ : funcaoFiltragem;
4142
4377
  if (!Array.isArray(valorVetor)) {
4143
4378
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() deve ser um vetor.'));
4144
4379
  }
@@ -4147,7 +4382,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
4147
4382
  }
4148
4383
  const resultados = [];
4149
4384
  for (let indice = 0; indice < valorVetor.length; ++indice) {
4150
- const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
4385
+ const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [
4386
+ valorVetor[indice],
4387
+ ]);
4151
4388
  if (deveRetornarValor === false)
4152
4389
  continue;
4153
4390
  resultados.push(valorVetor[indice]);
@@ -4192,28 +4429,34 @@ function validacaoComumNumeros(valorParaConverter) {
4192
4429
  async function inteiro(interpretador, valorParaConverter) {
4193
4430
  if (valorParaConverter === null || valorParaConverter === undefined)
4194
4431
  return Promise.resolve(0);
4195
- const valor = valorParaConverter.hasOwnProperty('valor') ? valorParaConverter.valor : valorParaConverter;
4432
+ const valor = valorParaConverter.hasOwnProperty('valor')
4433
+ ? valorParaConverter.valor
4434
+ : valorParaConverter;
4196
4435
  const resultadoValidacao = validacaoComumNumeros(valor);
4197
4436
  return resultadoValidacao || Promise.resolve(parseInt(valor));
4198
4437
  }
4199
4438
  /**
4200
- *
4201
- * @param interpretador
4202
- * @param vetor
4203
- * @param funcaoMapeamento
4204
- * @returns
4439
+ * Dado um vetor e uma função de mapeamento, executa a função de mapeamento
4440
+ * passando como argumento cada elemento do vetor.
4441
+ * @param interpretador A instância do interpretador.
4442
+ * @param vetor O vetor
4443
+ * @param funcaoMapeamento A função de mapeamento.
4444
+ * @returns O resultado acumulado da execução da função de mapeamento.
4205
4445
  */
4206
4446
  async function mapear(interpretador, vetor, funcaoMapeamento) {
4207
4447
  if (vetor === null || vetor === undefined)
4208
4448
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
4209
4449
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4210
- const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor') ? funcaoMapeamento.valor : funcaoMapeamento;
4450
+ const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
4451
+ ? funcaoMapeamento.valor
4452
+ : funcaoMapeamento;
4211
4453
  // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
4212
4454
  // na avaliação sintática. Estudar remoção.
4213
4455
  if (!Array.isArray(valorVetor)) {
4214
4456
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
4215
4457
  }
4216
- if (valorFuncaoMapeamento.constructor.name !== 'DeleguaFuncao') {
4458
+ const nomeConstrutorFuncaoMapeamento = valorFuncaoMapeamento.constructor.name.replaceAll('_', '');
4459
+ if (nomeConstrutorFuncaoMapeamento !== 'DeleguaFuncao') {
4217
4460
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
4218
4461
  }
4219
4462
  const resultados = [];
@@ -4231,7 +4474,9 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
4231
4474
  async function numero(interpretador, valorParaConverter) {
4232
4475
  if (valorParaConverter === null || valorParaConverter === undefined)
4233
4476
  return Promise.resolve(0);
4234
- const valor = valorParaConverter.hasOwnProperty('valor') ? valorParaConverter.valor : valorParaConverter;
4477
+ const valor = valorParaConverter.hasOwnProperty('valor')
4478
+ ? valorParaConverter.valor
4479
+ : valorParaConverter;
4235
4480
  const resultadoValidacao = validacaoComumNumeros(valor);
4236
4481
  return resultadoValidacao || Promise.resolve(Number(valor));
4237
4482
  }
@@ -4271,7 +4516,9 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
4271
4516
  if (vetor === null || vetor === undefined)
4272
4517
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() não pode ser nulo.'));
4273
4518
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4274
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
4519
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
4520
+ ? funcaoFiltragem.valor
4521
+ : funcaoFiltragem;
4275
4522
  // TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
4276
4523
  // na avaliação sintática. Estudar remoção.
4277
4524
  if (!Array.isArray(valorVetor)) {
@@ -4295,7 +4542,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
4295
4542
  if (vetor === null || vetor === undefined)
4296
4543
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() não pode ser nulo.'));
4297
4544
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4298
- const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
4545
+ const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
4546
+ ? funcaoFiltragem.valor
4547
+ : funcaoFiltragem;
4299
4548
  if (!Array.isArray(valorVetor)) {
4300
4549
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() deve ser um vetor.'));
4301
4550
  }
@@ -4303,7 +4552,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
4303
4552
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O segundo parâmetro da função primeiroEmCondicao() deve ser uma função.'));
4304
4553
  }
4305
4554
  for (let indice = 0; indice < valorVetor.length; ++indice) {
4306
- const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
4555
+ const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [
4556
+ valorVetor[indice],
4557
+ ]);
4307
4558
  if (valorResolvido !== null) {
4308
4559
  return valorResolvido;
4309
4560
  }
@@ -4335,7 +4586,9 @@ async function real(interpretador, numero) {
4335
4586
  */
4336
4587
  async function reduzir(interpretador, vetor, funcaoReducao, valorInicial = null) {
4337
4588
  const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
4338
- const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor') ? funcaoReducao.valor : funcaoReducao;
4589
+ const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor')
4590
+ ? funcaoReducao.valor
4591
+ : funcaoReducao;
4339
4592
  const valorPadrao = valorInicial.hasOwnProperty('valor') ? valorInicial.valor : valorInicial;
4340
4593
  if (!Array.isArray(valorVetor)) {
4341
4594
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
@@ -4536,7 +4789,7 @@ exports.default = {
4536
4789
  tipoRetorno: 'texto[]',
4537
4790
  argumentos: [
4538
4791
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('divisor', 'texto'),
4539
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número')
4792
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número'),
4540
4793
  ],
4541
4794
  implementacao: (interpretador, texto, divisor, limite) => {
4542
4795
  if (limite) {
@@ -4549,15 +4802,13 @@ exports.default = {
4549
4802
  tipoRetorno: 'texto',
4550
4803
  argumentos: [
4551
4804
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
4552
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
4805
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
4553
4806
  ],
4554
4807
  implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
4555
4808
  },
4556
4809
  inclui: {
4557
4810
  tipoRetorno: 'texto',
4558
- argumentos: [
4559
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')
4560
- ],
4811
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')],
4561
4812
  implementacao: (interpretador, texto, elemento) => Promise.resolve(texto.includes(elemento)),
4562
4813
  },
4563
4814
  inverter: {
@@ -4579,7 +4830,7 @@ exports.default = {
4579
4830
  tipoRetorno: 'texto',
4580
4831
  argumentos: [
4581
4832
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto'),
4582
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto')
4833
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto'),
4583
4834
  ],
4584
4835
  implementacao: (interpretador, texto, elemento, substituto) => Promise.resolve(texto.replace(elemento, substituto)),
4585
4836
  },
@@ -4587,7 +4838,7 @@ exports.default = {
4587
4838
  tipoRetorno: 'texto',
4588
4839
  argumentos: [
4589
4840
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
4590
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
4841
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
4591
4842
  ],
4592
4843
  implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
4593
4844
  },
@@ -4605,9 +4856,7 @@ const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-co
4605
4856
  exports.default = {
4606
4857
  adicionar: {
4607
4858
  tipoRetorno: 'qualquer[]',
4608
- argumentos: [
4609
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
4610
- ],
4859
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
4611
4860
  implementacao: (interpretador, vetor, elemento) => {
4612
4861
  vetor.push(elemento);
4613
4862
  return Promise.resolve(vetor);
@@ -4615,18 +4864,14 @@ exports.default = {
4615
4864
  },
4616
4865
  concatenar: {
4617
4866
  tipoRetorno: 'qualquer[]',
4618
- argumentos: [
4619
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')
4620
- ],
4867
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')],
4621
4868
  implementacao: (interpretador, vetor, outroVetor) => {
4622
4869
  return Promise.resolve(vetor.concat(outroVetor));
4623
4870
  },
4624
4871
  },
4625
4872
  empilhar: {
4626
4873
  tipoRetorno: 'qualquer[]',
4627
- argumentos: [
4628
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
4629
- ],
4874
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
4630
4875
  implementacao: (interpretador, vetor, elemento) => {
4631
4876
  vetor.push(elemento);
4632
4877
  return Promise.resolve(vetor);
@@ -4637,7 +4882,7 @@ exports.default = {
4637
4882
  argumentos: [
4638
4883
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'qualquer'),
4639
4884
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('excluirQuantidade', 'número'),
4640
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]')
4885
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]'),
4641
4886
  ],
4642
4887
  implementacao: (interpretador, vetor, inicio, excluirQuantidade, ...itens) => {
4643
4888
  let elementos = [];
@@ -4656,15 +4901,13 @@ exports.default = {
4656
4901
  tipoRetorno: 'qualquer[]',
4657
4902
  argumentos: [
4658
4903
  new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
4659
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
4904
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
4660
4905
  ],
4661
4906
  implementacao: (interpretador, vetor, inicio, fim) => Promise.resolve(vetor.slice(inicio, fim)),
4662
4907
  },
4663
4908
  filtrarPor: {
4664
4909
  tipoRetorno: 'qualquer[]',
4665
- argumentos: [
4666
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
4667
- ],
4910
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
4668
4911
  implementacao: async (interpretador, vetor, funcao) => {
4669
4912
  if (funcao === undefined || funcao === null) {
4670
4913
  return Promise.reject("É necessário passar uma função para o método 'filtrarPor'");
@@ -4680,9 +4923,7 @@ exports.default = {
4680
4923
  },
4681
4924
  inclui: {
4682
4925
  tipoRetorno: 'lógico',
4683
- argumentos: [
4684
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
4685
- ],
4926
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
4686
4927
  implementacao: (interpretador, vetor, elemento) => Promise.resolve(vetor.includes(elemento)),
4687
4928
  },
4688
4929
  inverter: {
@@ -4692,16 +4933,12 @@ exports.default = {
4692
4933
  },
4693
4934
  juntar: {
4694
4935
  tipoRetorno: 'texto',
4695
- argumentos: [
4696
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')
4697
- ],
4936
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')],
4698
4937
  implementacao: (interpretador, vetor, separador) => Promise.resolve(vetor.join(separador)),
4699
4938
  },
4700
4939
  mapear: {
4701
4940
  tipoRetorno: 'qualquer[]',
4702
- argumentos: [
4703
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
4704
- ],
4941
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
4705
4942
  implementacao: async (interpretador, vetor, funcao) => {
4706
4943
  if (funcao === undefined || funcao === null) {
4707
4944
  return Promise.reject("É necessário passar uma função para o método 'mapear'");
@@ -4716,14 +4953,15 @@ exports.default = {
4716
4953
  },
4717
4954
  ordenar: {
4718
4955
  tipoRetorno: 'qualquer[]',
4719
- argumentos: [
4720
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
4721
- ],
4956
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')],
4722
4957
  implementacao: async (interpretador, vetor, funcaoOrdenacao) => {
4723
4958
  if (funcaoOrdenacao !== undefined && funcaoOrdenacao !== null) {
4724
4959
  for (let i = 0; i < vetor.length - 1; i++) {
4725
4960
  for (let j = 1; j < vetor.length; j++) {
4726
- if ((await funcaoOrdenacao.chamar(interpretador, [vetor[j - 1], vetor[j]])) > 0) {
4961
+ if ((await funcaoOrdenacao.chamar(interpretador, [
4962
+ vetor[j - 1],
4963
+ vetor[j],
4964
+ ])) > 0) {
4727
4965
  const aux = vetor[j];
4728
4966
  vetor[j] = vetor[j - 1];
4729
4967
  vetor[j - 1] = aux;
@@ -4740,9 +4978,7 @@ exports.default = {
4740
4978
  },
4741
4979
  remover: {
4742
4980
  tipoRetorno: 'qualquer[]',
4743
- argumentos: [
4744
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
4745
- ],
4981
+ argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
4746
4982
  implementacao: (interpretador, vetor, elemento) => {
4747
4983
  const index = vetor.indexOf(elemento);
4748
4984
  if (index !== -1)
@@ -5028,7 +5264,8 @@ class Binario {
5028
5264
  this.tipo = this.deduzirTipo();
5029
5265
  }
5030
5266
  deduzirTipo() {
5031
- if (['logico', 'lógico'].includes(this.esquerda.tipo) || ['logico', 'lógico'].includes(this.direita.tipo)) {
5267
+ if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
5268
+ ['logico', 'lógico'].includes(this.direita.tipo)) {
5032
5269
  return 'lógico';
5033
5270
  }
5034
5271
  if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
@@ -5037,7 +5274,8 @@ class Binario {
5037
5274
  if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
5038
5275
  return 'inteiro';
5039
5276
  }
5040
- if (['numero', 'número'].includes(this.esquerda.tipo) || ['numero', 'número'].includes(this.direita.tipo)) {
5277
+ if (['numero', 'número'].includes(this.esquerda.tipo) ||
5278
+ ['numero', 'número'].includes(this.direita.tipo)) {
5041
5279
  return 'número';
5042
5280
  }
5043
5281
  return 'qualquer';
@@ -7586,7 +7824,7 @@ class InformacaoVariavelOuConstante {
7586
7824
  this.argumentos = argumentos;
7587
7825
  }
7588
7826
  toString() {
7589
- return `InformacaoVariavelOuConstante(nome=${this.nome}, tipo=${this.tipo}, argumentos=${this.argumentos.map(arg => arg.toString()).join(', ')})`;
7827
+ return `InformacaoVariavelOuConstante(nome=${this.nome}, tipo=${this.tipo}, argumentos=${this.argumentos.map((arg) => arg.toString()).join(', ')})`;
7590
7828
  }
7591
7829
  }
7592
7830
  exports.InformacaoVariavelOuConstante = InformacaoVariavelOuConstante;
@@ -7937,7 +8175,9 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
7937
8175
  const argumentosResolvidos = [];
7938
8176
  for (let i = indiceArgumentoAtual; i < argumentos.length; i++) {
7939
8177
  const argumentoAtual = argumentos[i];
7940
- argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor') ? argumentoAtual.valor : argumentoAtual);
8178
+ argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor')
8179
+ ? argumentoAtual.valor
8180
+ : argumentoAtual);
7941
8181
  }
7942
8182
  return argumentosResolvidos;
7943
8183
  }
@@ -7950,14 +8190,19 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
7950
8190
  if (parametro.abrangencia === 'multiplo') {
7951
8191
  const argumentosResolvidos = this.resolverParametrosEspalhados(argumentos, i);
7952
8192
  // TODO: Verificar se `imutavel` é `true` aqui mesmo.
7953
- ambiente.valores[nome] = { tipo: 'vetor', valor: argumentosResolvidos, imutavel: true };
8193
+ ambiente.valores[nome] = {
8194
+ tipo: 'vetor',
8195
+ valor: argumentosResolvidos,
8196
+ imutavel: true,
8197
+ };
7954
8198
  }
7955
8199
  else {
7956
8200
  let argumento = argumentos[i];
7957
8201
  if (argumento.valor === null) {
7958
8202
  argumentos[i].valor = parametro['padrao'] ? parametro['padrao'].valor : null;
7959
8203
  }
7960
- ambiente.valores[nome] = argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
8204
+ ambiente.valores[nome] =
8205
+ argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
7961
8206
  // Se o argumento é `DeleguaFuncao`, para habilitar o recurso de _currying_,
7962
8207
  // copiamos seu valor para o escopo atual. Nem sempre podemos contar com a tipagem explícita aqui.
7963
8208
  if (argumento.valor && ['funcao', 'função'].includes(argumento.valor.tipo)) {
@@ -7977,7 +8222,8 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
7977
8222
  };
7978
8223
  // TODO: Apenass Potigol usa isso até então.
7979
8224
  // Estudar mover isso para o dialeto.
7980
- if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis && this.nome !== 'construtor') {
8225
+ if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
8226
+ this.nome !== 'construtor') {
7981
8227
  for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
7982
8228
  ambiente.valores[nomeCampo] = {
7983
8229
  valor: valorCampo,
@@ -8278,7 +8524,8 @@ class ObjetoDeleguaClasse {
8278
8524
  throw new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade "${nomePropriedade}" não existe neste objeto.`);
8279
8525
  }
8280
8526
  definir(simbolo, valor) {
8281
- if (this.classe.dialetoRequerDeclaracaoPropriedades && !this.propriedades.hasOwnProperty(simbolo.lexema)) {
8527
+ if (this.classe.dialetoRequerDeclaracaoPropriedades &&
8528
+ !this.propriedades.hasOwnProperty(simbolo.lexema)) {
8282
8529
  throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Propriedade "${simbolo.lexema}" não foi definida na declaração da classe ${this.classe.simboloOriginal.lexema}.`);
8283
8530
  }
8284
8531
  this.propriedades[simbolo.lexema] = valor;
@@ -8408,7 +8655,8 @@ class InterpretadorBase {
8408
8655
  this.diretorioBase = diretorioBase;
8409
8656
  this.performance = performance;
8410
8657
  this.funcaoDeRetorno = funcaoDeRetorno || console.log;
8411
- this.funcaoDeRetornoMesmaLinha = funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
8658
+ this.funcaoDeRetornoMesmaLinha =
8659
+ funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
8412
8660
  this.erros = [];
8413
8661
  this.declaracoes = [];
8414
8662
  this.resultadoInterpretador = [];
@@ -8542,7 +8790,9 @@ class InterpretadorBase {
8542
8790
  textoFinal = textoFinal.replace('${' + elemento.variavel + '}', this.paraTexto((_b = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _b === void 0 ? void 0 : _b.valor));
8543
8791
  }
8544
8792
  else {
8545
- const valor = ((_c = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _c === void 0 ? void 0 : _c.hasOwnProperty('valor')) ? elemento === null || elemento === void 0 ? void 0 : elemento.valor.valor : elemento === null || elemento === void 0 ? void 0 : elemento.valor;
8793
+ const valor = ((_c = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _c === void 0 ? void 0 : _c.hasOwnProperty('valor'))
8794
+ ? elemento === null || elemento === void 0 ? void 0 : elemento.valor.valor
8795
+ : elemento === null || elemento === void 0 ? void 0 : elemento.valor;
8546
8796
  textoFinal = textoFinal.replace('${' + elemento.variavel + '}', `${this.paraTexto(valor)}`);
8547
8797
  }
8548
8798
  });
@@ -8594,7 +8844,8 @@ class InterpretadorBase {
8594
8844
  return true;
8595
8845
  }
8596
8846
  verificarOperandoNumero(operador, operando) {
8597
- if (typeof operando === primitivos_1.default.NUMERO || operando.tipo === delegua_2.default.NUMERO)
8847
+ if (typeof operando === primitivos_1.default.NUMERO ||
8848
+ operando.tipo === delegua_2.default.NUMERO)
8598
8849
  return;
8599
8850
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operando precisa ser um número.', Number(operador.linha));
8600
8851
  }
@@ -8647,11 +8898,15 @@ class InterpretadorBase {
8647
8898
  let resultado = '';
8648
8899
  const conteudo = await this.avaliar(declaracao.expressao);
8649
8900
  const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
8650
- const tipoConteudo = conteudo.hasOwnProperty('tipo') ? conteudo.tipo : typeof conteudo;
8901
+ const tipoConteudo = conteudo.hasOwnProperty('tipo')
8902
+ ? conteudo.tipo
8903
+ : typeof conteudo;
8651
8904
  resultado = valorConteudo;
8652
8905
  if ([delegua_2.default.NUMERO, primitivos_1.default.NUMERO].includes(tipoConteudo) &&
8653
8906
  declaracao.casasDecimais > 0) {
8654
- resultado = valorConteudo.toLocaleString('pt', { maximumFractionDigits: declaracao.casasDecimais });
8907
+ resultado = valorConteudo.toLocaleString('pt', {
8908
+ maximumFractionDigits: declaracao.casasDecimais,
8909
+ });
8655
8910
  }
8656
8911
  if (declaracao.espacos > 0) {
8657
8912
  resultado += ' '.repeat(declaracao.espacos);
@@ -8710,14 +8965,19 @@ class InterpretadorBase {
8710
8965
  const direita = await this.avaliar(expressao.direita);
8711
8966
  const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
8712
8967
  const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
8713
- const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo')) ? esquerda.tipo : (0, inferenciador_1.inferirTipoVariavel)(esquerda);
8714
- const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita);
8968
+ const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
8969
+ ? esquerda.tipo
8970
+ : (0, inferenciador_1.inferirTipoVariavel)(esquerda);
8971
+ const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo'))
8972
+ ? direita.tipo
8973
+ : (0, inferenciador_1.inferirTipoVariavel)(direita);
8715
8974
  switch (expressao.operador.tipo) {
8716
8975
  case delegua_1.default.EXPONENCIACAO:
8717
8976
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
8718
8977
  return Math.pow(valorEsquerdo, valorDireito);
8719
8978
  case delegua_1.default.MAIOR:
8720
- if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
8979
+ if (this.tiposNumericos.includes(tipoEsquerdo) &&
8980
+ this.tiposNumericos.includes(tipoDireito)) {
8721
8981
  return Number(valorEsquerdo) > Number(valorDireito);
8722
8982
  }
8723
8983
  return String(valorEsquerdo) > String(valorDireito);
@@ -8725,7 +8985,8 @@ class InterpretadorBase {
8725
8985
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
8726
8986
  return Number(valorEsquerdo) >= Number(valorDireito);
8727
8987
  case delegua_1.default.MENOR:
8728
- if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
8988
+ if (this.tiposNumericos.includes(tipoEsquerdo) &&
8989
+ this.tiposNumericos.includes(tipoDireito)) {
8729
8990
  return Number(valorEsquerdo) < Number(valorDireito);
8730
8991
  }
8731
8992
  return String(valorEsquerdo) < String(valorDireito);
@@ -8738,7 +8999,8 @@ class InterpretadorBase {
8738
8999
  return Number(valorEsquerdo) - Number(valorDireito);
8739
9000
  case delegua_1.default.ADICAO:
8740
9001
  case delegua_1.default.MAIS_IGUAL:
8741
- if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
9002
+ if (this.tiposNumericos.includes(tipoEsquerdo) &&
9003
+ this.tiposNumericos.includes(tipoDireito)) {
8742
9004
  return Number(valorEsquerdo) + Number(valorDireito);
8743
9005
  }
8744
9006
  // TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
@@ -8757,11 +9019,13 @@ class InterpretadorBase {
8757
9019
  return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
8758
9020
  case delegua_1.default.MULTIPLICACAO:
8759
9021
  case delegua_1.default.MULTIPLICACAO_IGUAL:
8760
- if (tipoEsquerdo === delegua_2.default.TEXTO || tipoDireito === delegua_2.default.TEXTO) {
9022
+ if (tipoEsquerdo === delegua_2.default.TEXTO ||
9023
+ tipoDireito === delegua_2.default.TEXTO) {
8761
9024
  // Sem ambos os valores resolvem como texto, multiplica normal.
8762
9025
  // Se apenas um resolve como texto, o outro repete o
8763
9026
  // texto n vezes, sendo n o valor do outro.
8764
- if (tipoEsquerdo === delegua_2.default.TEXTO && tipoDireito === delegua_2.default.TEXTO) {
9027
+ if (tipoEsquerdo === delegua_2.default.TEXTO &&
9028
+ tipoDireito === delegua_2.default.TEXTO) {
8765
9029
  return Number(valorEsquerdo) * Number(valorDireito);
8766
9030
  }
8767
9031
  if (tipoEsquerdo === delegua_2.default.TEXTO) {
@@ -8833,7 +9097,8 @@ class InterpretadorBase {
8833
9097
  try {
8834
9098
  const variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
8835
9099
  if (variavelEntidadeChamada === null) {
8836
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' + String(expressao.entidadeChamada), expressao.linha));
9100
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
9101
+ String(expressao.entidadeChamada), expressao.linha));
8837
9102
  }
8838
9103
  const entidadeChamada = variavelEntidadeChamada.hasOwnProperty('valor')
8839
9104
  ? variavelEntidadeChamada.valor
@@ -8845,7 +9110,9 @@ class InterpretadorBase {
8845
9110
  return await this.chamarMetodoPrimitiva(expressao, entidadeChamada);
8846
9111
  }
8847
9112
  const argumentos = await this.resolverArgumentosChamada(expressao);
8848
- const aridade = entidadeChamada.aridade ? entidadeChamada.aridade() : entidadeChamada.length;
9113
+ const aridade = entidadeChamada.aridade
9114
+ ? entidadeChamada.aridade()
9115
+ : entidadeChamada.length;
8849
9116
  // Completar os argumentos não preenchidos com valores indefinidos.
8850
9117
  if (argumentos.length < aridade) {
8851
9118
  const diferenca = aridade - argumentos.length;
@@ -8858,7 +9125,9 @@ class InterpretadorBase {
8858
9125
  }
8859
9126
  if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
8860
9127
  try {
8861
- return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor') ? a.valor.valor : a === null || a === void 0 ? void 0 : a.valor), expressao.entidadeChamada.simbolo);
9128
+ return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor')
9129
+ ? a.valor.valor
9130
+ : a === null || a === void 0 ? void 0 : a.valor), expressao.entidadeChamada.simbolo);
8862
9131
  }
8863
9132
  catch (erro) {
8864
9133
  this.erros.push({
@@ -8871,7 +9140,8 @@ class InterpretadorBase {
8871
9140
  // Por algum motivo misterioso, `entidadeChamada instanceof Chamavel` dá `false` em Liquido,
8872
9141
  // mesmo que esteja tudo certo com `DeleguaFuncao`,
8873
9142
  // então precisamos testar o nome do construtor também.
8874
- if (entidadeChamada instanceof estruturas_1.Chamavel || entidadeChamada.constructor.name === 'DeleguaFuncao') {
9143
+ if (entidadeChamada instanceof estruturas_1.Chamavel ||
9144
+ entidadeChamada.constructor.name === 'DeleguaFuncao') {
8875
9145
  const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
8876
9146
  return retornoEntidadeChamada;
8877
9147
  }
@@ -8924,7 +9194,9 @@ class InterpretadorBase {
8924
9194
  // Nunca será método aqui: apenas propriedade.
8925
9195
  const alvoPropriedade = expressao.alvo;
8926
9196
  const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
8927
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
9197
+ const objeto = variavelObjeto.hasOwnProperty('valor')
9198
+ ? variavelObjeto.valor
9199
+ : variavelObjeto;
8928
9200
  const valor = await this.avaliar(expressao.valor);
8929
9201
  if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
8930
9202
  const objetoDeleguaClasse = objeto;
@@ -8953,7 +9225,8 @@ class InterpretadorBase {
8953
9225
  return direita.includes(esquerda);
8954
9226
  }
8955
9227
  else if (direita !== null && typeof direita === 'object') {
8956
- return esquerda in direita || (direita.valor !== undefined && esquerda in direita.valor);
9228
+ return (esquerda in direita ||
9229
+ (direita.valor !== undefined && esquerda in direita.valor));
8957
9230
  }
8958
9231
  throw new excecoes_1.ErroEmTempoDeExecucao(esquerda, "Tipo de chamada inválida com 'em'.", expressao.linha);
8959
9232
  }
@@ -8978,7 +9251,8 @@ class InterpretadorBase {
8978
9251
  }
8979
9252
  let retornoExecucao;
8980
9253
  while (!(retornoExecucao instanceof quebras_1.Quebra)) {
8981
- if (declaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
9254
+ if (declaracao.condicao !== null &&
9255
+ !this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
8982
9256
  break;
8983
9257
  }
8984
9258
  try {
@@ -9010,11 +9284,14 @@ class InterpretadorBase {
9010
9284
  // laço de repetição.
9011
9285
  declaracao.posicaoAtual = 0;
9012
9286
  const vetorResolvido = await this.avaliar(declaracao.vetor);
9013
- const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor') ? vetorResolvido.valor : vetorResolvido;
9287
+ const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
9288
+ ? vetorResolvido.valor
9289
+ : vetorResolvido;
9014
9290
  if (!Array.isArray(valorVetorResolvido)) {
9015
9291
  return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
9016
9292
  }
9017
- while (!(retornoExecucao instanceof quebras_1.Quebra) && declaracao.posicaoAtual < valorVetorResolvido.length) {
9293
+ while (!(retornoExecucao instanceof quebras_1.Quebra) &&
9294
+ declaracao.posicaoAtual < valorVetorResolvido.length) {
9018
9295
  try {
9019
9296
  this.pilhaEscoposExecucao.definirVariavel(declaracao.nomeVariavelIteracao, valorVetorResolvido[declaracao.posicaoAtual]);
9020
9297
  retornoExecucao = await this.executar(declaracao.corpo);
@@ -9060,7 +9337,8 @@ class InterpretadorBase {
9060
9337
  }
9061
9338
  async visitarDeclaracaoEnquanto(declaracao) {
9062
9339
  let retornoExecucao;
9063
- while (!(retornoExecucao instanceof quebras_1.Quebra) && this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
9340
+ while (!(retornoExecucao instanceof quebras_1.Quebra) &&
9341
+ this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
9064
9342
  try {
9065
9343
  retornoExecucao = await this.executar(declaracao.corpo);
9066
9344
  if (retornoExecucao instanceof quebras_1.SustarQuebra) {
@@ -9083,7 +9361,9 @@ class InterpretadorBase {
9083
9361
  }
9084
9362
  async visitarDeclaracaoEscolha(declaracao) {
9085
9363
  const condicaoEscolha = await this.avaliar(declaracao.identificadorOuLiteral);
9086
- const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor') ? condicaoEscolha.valor : condicaoEscolha;
9364
+ const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
9365
+ ? condicaoEscolha.valor
9366
+ : condicaoEscolha;
9087
9367
  const caminhos = declaracao.caminhos;
9088
9368
  const caminhoPadrao = declaracao.caminhoPadrao;
9089
9369
  let encontrado = false;
@@ -9165,9 +9445,7 @@ class InterpretadorBase {
9165
9445
  }
9166
9446
  else {
9167
9447
  const literalErro = new construtos_1.Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
9168
- const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [
9169
- literalErro,
9170
- ]);
9448
+ const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [literalErro]);
9171
9449
  valorRetorno = await chamadaPegue.aceitar(this);
9172
9450
  }
9173
9451
  }
@@ -9187,7 +9465,9 @@ class InterpretadorBase {
9187
9465
  let formatoTexto = '';
9188
9466
  for (const argumento of argumentos) {
9189
9467
  const resultadoAvaliacao = await this.avaliar(argumento);
9190
- let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
9468
+ let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
9469
+ ? resultadoAvaliacao.valor
9470
+ : resultadoAvaliacao;
9191
9471
  formatoTexto += `${this.paraTexto(valor)} `;
9192
9472
  }
9193
9473
  return formatoTexto.trimEnd();
@@ -9348,10 +9628,15 @@ class InterpretadorBase {
9348
9628
  }
9349
9629
  }
9350
9630
  async visitarExpressaoAcessoIndiceVariavel(expressao) {
9351
- const promises = await Promise.all([this.avaliar(expressao.entidadeChamada), this.avaliar(expressao.indice)]);
9631
+ const promises = await Promise.all([
9632
+ this.avaliar(expressao.entidadeChamada),
9633
+ this.avaliar(expressao.indice),
9634
+ ]);
9352
9635
  const variavelObjeto = promises[0];
9353
9636
  const indice = promises[1];
9354
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
9637
+ const objeto = variavelObjeto.hasOwnProperty('valor')
9638
+ ? variavelObjeto.valor
9639
+ : variavelObjeto;
9355
9640
  let valorIndice = indice.hasOwnProperty('valor') ? indice.valor : indice;
9356
9641
  if (Array.isArray(objeto)) {
9357
9642
  if (!Number.isInteger(valorIndice)) {
@@ -9397,7 +9682,9 @@ class InterpretadorBase {
9397
9682
  }
9398
9683
  async visitarExpressaoDefinirValor(expressao) {
9399
9684
  const variavelObjeto = await this.avaliar(expressao.objeto);
9400
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
9685
+ const objeto = variavelObjeto.hasOwnProperty('valor')
9686
+ ? variavelObjeto.valor
9687
+ : variavelObjeto;
9401
9688
  if (objeto.constructor.name !== 'ObjetoDeleguaClasse' && objeto.constructor !== Object) {
9402
9689
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.nome, 'Somente instâncias e dicionários podem possuir campos.', expressao.linha));
9403
9690
  }
@@ -9464,10 +9751,13 @@ class InterpretadorBase {
9464
9751
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
9465
9752
  variavelObjeto = variavelObjeto.valor;
9466
9753
  }
9467
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
9754
+ const objeto = variavelObjeto.hasOwnProperty('valor')
9755
+ ? variavelObjeto.valor
9756
+ : variavelObjeto;
9468
9757
  // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
9469
9758
  // então testamos também o nome do construtor.
9470
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
9759
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
9760
+ objeto.constructor.name === 'ObjetoDeleguaClasse') {
9471
9761
  const valor = objeto.obter(expressao.simbolo);
9472
9762
  if (valor === 0)
9473
9763
  return 0;
@@ -9512,13 +9802,18 @@ class InterpretadorBase {
9512
9802
  async visitarExpressaoDicionario(expressao) {
9513
9803
  const dicionario = {};
9514
9804
  for (let i = 0; i < expressao.chaves.length; i++) {
9515
- const promises = await Promise.all([this.avaliar(expressao.chaves[i]), this.avaliar(expressao.valores[i])]);
9805
+ const promises = await Promise.all([
9806
+ this.avaliar(expressao.chaves[i]),
9807
+ this.avaliar(expressao.valores[i]),
9808
+ ]);
9516
9809
  if (typeof promises[0] === 'boolean') {
9517
9810
  const chaveLogico = promises[0] === true ? 'verdadeiro' : 'falso';
9518
9811
  dicionario[chaveLogico] = promises[1];
9519
9812
  continue;
9520
9813
  }
9521
- dicionario[promises[0]] = promises[1].hasOwnProperty('valor') ? promises[1].valor : promises[1];
9814
+ dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
9815
+ ? promises[1].valor
9816
+ : promises[1];
9522
9817
  }
9523
9818
  return dicionario;
9524
9819
  }
@@ -9580,7 +9875,10 @@ class InterpretadorBase {
9580
9875
  retornoVetor += `${JSON.stringify(elemento)}, `;
9581
9876
  continue;
9582
9877
  }
9583
- retornoVetor += typeof elemento === 'string' ? `'${elemento}', ` : `${this.paraTexto(elemento)}, `;
9878
+ retornoVetor +=
9879
+ typeof elemento === 'string'
9880
+ ? `'${elemento}', `
9881
+ : `${this.paraTexto(elemento)}, `;
9584
9882
  }
9585
9883
  if (retornoVetor.length > 1) {
9586
9884
  retornoVetor = retornoVetor.slice(0, -2);
@@ -9641,7 +9939,8 @@ class InterpretadorBase {
9641
9939
  const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
9642
9940
  let retornoExecucao;
9643
9941
  try {
9644
- for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
9942
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
9943
+ ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
9645
9944
  retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
9646
9945
  }
9647
9946
  return retornoExecucao;
@@ -9854,7 +10153,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
9854
10153
  let formatoTexto = '';
9855
10154
  for (const argumento of argumentos) {
9856
10155
  const resultadoAvaliacao = await this.avaliar(argumento);
9857
- let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
10156
+ let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
10157
+ ? resultadoAvaliacao.valor
10158
+ : resultadoAvaliacao;
9858
10159
  formatoTexto += `${this.paraTexto(valor)} `;
9859
10160
  }
9860
10161
  return formatoTexto.trimEnd();
@@ -10054,7 +10355,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
10054
10355
  let i = this.pilhaEscoposExecucao.pilha.length - 1;
10055
10356
  while (i > 0) {
10056
10357
  let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
10057
- if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
10358
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
10359
+ ultimoEscopo.finalizado) {
10058
10360
  this.pilhaEscoposExecucao.removerUltimo();
10059
10361
  const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
10060
10362
  escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
@@ -10089,7 +10391,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
10089
10391
  if (!this.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
10090
10392
  ultimoEscopo.declaracaoAtual++;
10091
10393
  }
10092
- if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length || ultimoEscopo.finalizado) {
10394
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
10395
+ ultimoEscopo.finalizado) {
10093
10396
  if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
10094
10397
  this.descartarEscopoPorRetornoFuncao();
10095
10398
  }
@@ -10118,7 +10421,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
10118
10421
  const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
10119
10422
  let retornoExecucao;
10120
10423
  try {
10121
- for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
10424
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
10425
+ ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
10122
10426
  if (naoVerificarPrimeiraExecucao) {
10123
10427
  naoVerificarPrimeiraExecucao = false;
10124
10428
  }
@@ -10197,7 +10501,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
10197
10501
  await this.instrucaoPasso(escopo + 1);
10198
10502
  }
10199
10503
  else {
10200
- if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length || escopoVisitado.finalizado) {
10504
+ if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
10505
+ escopoVisitado.finalizado) {
10201
10506
  this.pilhaEscoposExecucao.removerUltimo();
10202
10507
  }
10203
10508
  if (this.pilhaEscoposExecucao.elementos() === 1) {
@@ -10276,7 +10581,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
10276
10581
  * @param nome O nome da variável.
10277
10582
  */
10278
10583
  obterVariavel(nome) {
10279
- const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({ lexema: nome });
10584
+ const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({
10585
+ lexema: nome,
10586
+ });
10280
10587
  return valorOuVariavel.hasOwnProperty('valor')
10281
10588
  ? valorOuVariavel
10282
10589
  : {
@@ -10324,7 +10631,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10324
10631
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
10325
10632
  variavelObjeto = variavelObjeto.valor;
10326
10633
  }
10327
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10634
+ const objeto = variavelObjeto.hasOwnProperty('valor')
10635
+ ? variavelObjeto.valor
10636
+ : variavelObjeto;
10328
10637
  if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
10329
10638
  return objeto.obterMetodo(expressao.nomeMetodo) || null;
10330
10639
  }
@@ -10404,7 +10713,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10404
10713
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
10405
10714
  variavelObjeto = variavelObjeto.valor;
10406
10715
  }
10407
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10716
+ const objeto = variavelObjeto.hasOwnProperty('valor')
10717
+ ? variavelObjeto.valor
10718
+ : variavelObjeto;
10408
10719
  if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
10409
10720
  return objeto.obter(expressao.simbolo);
10410
10721
  }
@@ -10468,10 +10779,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10468
10779
  if (variavelObjeto.constructor.name === 'RetornoQuebra') {
10469
10780
  variavelObjeto = variavelObjeto.valor;
10470
10781
  }
10471
- const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10782
+ const objeto = variavelObjeto.hasOwnProperty('valor')
10783
+ ? variavelObjeto.valor
10784
+ : variavelObjeto;
10472
10785
  // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
10473
10786
  // então testamos também o nome do construtor.
10474
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
10787
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
10788
+ objeto.constructor.name === 'ObjetoDeleguaClasse') {
10475
10789
  return objeto.obterMetodo(expressao.nomePropriedade) || null;
10476
10790
  }
10477
10791
  // Objeto simples do JavaScript, ou dicionário de Delégua.
@@ -10521,7 +10835,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10521
10835
  // Se o retorno for uma função anônima, o escopo precisa ser preservado.
10522
10836
  // Como quebras matam o topo da pilha de escopos, precisamos dizer
10523
10837
  // para a finalização para copiar as variáveis para o escopo de baixo.
10524
- if (retornoQuebra.valor.constructor.name === 'DeleguaFuncao') {
10838
+ const construtorRetorno = retornoQuebra.valor.constructor.name.replaceAll('_', '');
10839
+ if (construtorRetorno === 'DeleguaFuncao') {
10525
10840
  retornoQuebra.preservarEscopo = true;
10526
10841
  }
10527
10842
  return retornoQuebra;
@@ -10990,7 +11305,9 @@ class LexadorEguaClassico {
10990
11305
  this.avancar();
10991
11306
  }
10992
11307
  const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
10993
- const tipo = codigo in egua_classico_1.palavrasReservadas ? egua_classico_1.palavrasReservadas[codigo] : egua_classico_2.default.IDENTIFICADOR;
11308
+ const tipo = codigo in egua_classico_1.palavrasReservadas
11309
+ ? egua_classico_1.palavrasReservadas[codigo]
11310
+ : egua_classico_2.default.IDENTIFICADOR;
10994
11311
  this.adicionarSimbolo(tipo);
10995
11312
  }
10996
11313
  analisarToken() {
@@ -11185,8 +11502,12 @@ class LexadorGuarani extends lexador_base_1.LexadorBase {
11185
11502
  while (this.eAlfabetoOuDigito(this.simboloAtual())) {
11186
11503
  this.avancar();
11187
11504
  }
11188
- const codigo = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual).toLowerCase();
11189
- const tipo = codigo in guarani_2.palavrasReservadas ? guarani_2.palavrasReservadas[codigo] : guarani_1.default.IDENTIFICADOR;
11505
+ const codigo = this.codigo[this.linha]
11506
+ .substring(this.inicioSimbolo, this.atual)
11507
+ .toLowerCase();
11508
+ const tipo = codigo in guarani_2.palavrasReservadas
11509
+ ? guarani_2.palavrasReservadas[codigo]
11510
+ : guarani_1.default.IDENTIFICADOR;
11190
11511
  this.adicionarSimbolo(tipo);
11191
11512
  }
11192
11513
  analisarToken() {
@@ -11340,7 +11661,8 @@ class LexadorPitugues {
11340
11661
  eFinalDoCodigo() {
11341
11662
  if (this.linha > this.codigo.length - 1)
11342
11663
  return true;
11343
- return this.linha == this.codigo.length - 1 && this.codigo[this.codigo.length - 1].length <= this.atual;
11664
+ return (this.linha == this.codigo.length - 1 &&
11665
+ this.codigo[this.codigo.length - 1].length <= this.atual);
11344
11666
  }
11345
11667
  avancar() {
11346
11668
  this.atual += 1;
@@ -11409,7 +11731,8 @@ class LexadorPitugues {
11409
11731
  }
11410
11732
  identificarPalavraChave() {
11411
11733
  const linhaPrimeiroCaracter = this.linha;
11412
- while (this.eAlfabetoOuDigito(this.simboloAtual()) && this.linha === linhaPrimeiroCaracter) {
11734
+ while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
11735
+ this.linha === linhaPrimeiroCaracter) {
11413
11736
  this.avancar();
11414
11737
  }
11415
11738
  let textoPalavraChave;
@@ -11709,7 +12032,8 @@ class LexadorPortugolIpt {
11709
12032
  eFinalDoCodigo() {
11710
12033
  if (this.linha > this.codigo.length - 1)
11711
12034
  return true;
11712
- return this.linha == this.codigo.length - 1 && this.codigo[this.codigo.length - 1].length <= this.atual;
12035
+ return (this.linha == this.codigo.length - 1 &&
12036
+ this.codigo[this.codigo.length - 1].length <= this.atual);
11713
12037
  }
11714
12038
  /**
11715
12039
  * Indica se o código está na última linha.
@@ -11787,7 +12111,8 @@ class LexadorPortugolIpt {
11787
12111
  }
11788
12112
  identificarPalavraChave() {
11789
12113
  const linhaPrimeiroCaracter = this.linha;
11790
- while (this.eAlfabetoOuDigito(this.simboloAtual()) && this.linha === linhaPrimeiroCaracter) {
12114
+ while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
12115
+ this.linha === linhaPrimeiroCaracter) {
11791
12116
  this.avancar();
11792
12117
  }
11793
12118
  let textoPalavraChave;
@@ -11988,7 +12313,6 @@ exports.palavrasReservadas = {
11988
12313
  ou: pitugues_1.default.OU,
11989
12314
  padrao: pitugues_1.default.PADRAO,
11990
12315
  para: pitugues_1.default.PARA,
11991
- pausa: pitugues_1.default.PAUSA,
11992
12316
  pegue: pitugues_1.default.PEGUE,
11993
12317
  retorna: pitugues_1.default.RETORNA,
11994
12318
  se: pitugues_1.default.SE,
@@ -12442,7 +12766,9 @@ class Lexador {
12442
12766
  this.avancar();
12443
12767
  }
12444
12768
  const codigo = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual);
12445
- const tipo = codigo in palavras_reservadas_1.palavrasReservadas ? palavras_reservadas_1.palavrasReservadas[codigo] : delegua_1.default.IDENTIFICADOR;
12769
+ const tipo = codigo in palavras_reservadas_1.palavrasReservadas
12770
+ ? palavras_reservadas_1.palavrasReservadas[codigo]
12771
+ : delegua_1.default.IDENTIFICADOR;
12446
12772
  this.adicionarSimbolo(tipo);
12447
12773
  }
12448
12774
  analisarToken() {
@@ -12808,7 +13134,9 @@ class MicroLexador {
12808
13134
  this.atual++;
12809
13135
  }
12810
13136
  const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
12811
- const tipo = codigo in palavras_reservadas_1.palavrasReservadasMicroGramatica ? palavras_reservadas_1.palavrasReservadasMicroGramatica[codigo] : delegua_1.default.IDENTIFICADOR;
13137
+ const tipo = codigo in palavras_reservadas_1.palavrasReservadasMicroGramatica
13138
+ ? palavras_reservadas_1.palavrasReservadasMicroGramatica[codigo]
13139
+ : delegua_1.default.IDENTIFICADOR;
12812
13140
  this.adicionarSimbolo(tipo);
12813
13141
  }
12814
13142
  analisarToken() {
@@ -13410,7 +13738,6 @@ exports.default = {
13410
13738
  PARA: 'PARA',
13411
13739
  PARENTESE_DIREITO: 'PARENTESE_DIREITO',
13412
13740
  PARENTESE_ESQUERDO: 'PARENTESE_ESQUERDO',
13413
- PAUSA: 'PAUSA',
13414
13741
  PEGUE: 'PEGUE',
13415
13742
  PONTO: 'PONTO',
13416
13743
  PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
@@ -13723,7 +14050,8 @@ class Python3Lexer extends Lexer_1.Lexer {
13723
14050
  }
13724
14051
  else {
13725
14052
  // Possibly emit more than 1 DEDENT token.
13726
- while (this.indents.length && this.indents[this.indents.length - 1] > indent) {
14053
+ while (this.indents.length &&
14054
+ this.indents[this.indents.length - 1] > indent) {
13727
14055
  this.emit(this.createDedent());
13728
14056
  this.indents.pop();
13729
14057
  }
@@ -15439,7 +15767,8 @@ class Python3Parser extends Parser_1.Parser {
15439
15767
  this.state = 269;
15440
15768
  this._errHandler.sync(this);
15441
15769
  _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx);
15442
- while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
15770
+ while (_alt !== 2 &&
15771
+ _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
15443
15772
  if (_alt === 1) {
15444
15773
  {
15445
15774
  {
@@ -15752,7 +16081,8 @@ class Python3Parser extends Parser_1.Parser {
15752
16081
  this.state = 357;
15753
16082
  this._errHandler.sync(this);
15754
16083
  _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx);
15755
- while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
16084
+ while (_alt !== 2 &&
16085
+ _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
15756
16086
  if (_alt === 1) {
15757
16087
  {
15758
16088
  {
@@ -16990,12 +17320,14 @@ class Python3Parser extends Parser_1.Parser {
16990
17320
  this.state = 526;
16991
17321
  this._errHandler.sync(this);
16992
17322
  _la = this._input.LA(1);
16993
- while (_la === Python3Parser.DOT || _la === Python3Parser.ELLIPSIS) {
17323
+ while (_la === Python3Parser.DOT ||
17324
+ _la === Python3Parser.ELLIPSIS) {
16994
17325
  {
16995
17326
  {
16996
17327
  this.state = 523;
16997
17328
  _la = this._input.LA(1);
16998
- if (!(_la === Python3Parser.DOT || _la === Python3Parser.ELLIPSIS)) {
17329
+ if (!(_la === Python3Parser.DOT ||
17330
+ _la === Python3Parser.ELLIPSIS)) {
16999
17331
  this._errHandler.recoverInline(this);
17000
17332
  }
17001
17333
  else {
@@ -17025,7 +17357,8 @@ class Python3Parser extends Parser_1.Parser {
17025
17357
  {
17026
17358
  this.state = 530;
17027
17359
  _la = this._input.LA(1);
17028
- if (!(_la === Python3Parser.DOT || _la === Python3Parser.ELLIPSIS)) {
17360
+ if (!(_la === Python3Parser.DOT ||
17361
+ _la === Python3Parser.ELLIPSIS)) {
17029
17362
  this._errHandler.recoverInline(this);
17030
17363
  }
17031
17364
  else {
@@ -17040,7 +17373,8 @@ class Python3Parser extends Parser_1.Parser {
17040
17373
  this.state = 533;
17041
17374
  this._errHandler.sync(this);
17042
17375
  _la = this._input.LA(1);
17043
- } while (_la === Python3Parser.DOT || _la === Python3Parser.ELLIPSIS);
17376
+ } while (_la === Python3Parser.DOT ||
17377
+ _la === Python3Parser.ELLIPSIS);
17044
17378
  }
17045
17379
  break;
17046
17380
  }
@@ -18500,7 +18834,9 @@ class Python3Parser extends Parser_1.Parser {
18500
18834
  _la = this._input.LA(1);
18501
18835
  while (((_la & ~0x1f) === 0 &&
18502
18836
  ((1 << _la) &
18503
- ((1 << Python3Parser.IN) | (1 << Python3Parser.NOT) | (1 << Python3Parser.IS))) !==
18837
+ ((1 << Python3Parser.IN) |
18838
+ (1 << Python3Parser.NOT) |
18839
+ (1 << Python3Parser.IS))) !==
18504
18840
  0) ||
18505
18841
  (((_la - 74) & ~0x1f) === 0 &&
18506
18842
  ((1 << (_la - 74)) &
@@ -18822,7 +19158,8 @@ class Python3Parser extends Parser_1.Parser {
18822
19158
  {
18823
19159
  this.state = 828;
18824
19160
  _la = this._input.LA(1);
18825
- if (!(_la === Python3Parser.LEFT_SHIFT || _la === Python3Parser.RIGHT_SHIFT)) {
19161
+ if (!(_la === Python3Parser.LEFT_SHIFT ||
19162
+ _la === Python3Parser.RIGHT_SHIFT)) {
18826
19163
  this._errHandler.recoverInline(this);
18827
19164
  }
18828
19165
  else {
@@ -26215,7 +26552,8 @@ class TradutorAssemblyScript {
26215
26552
  resultado += ' '.repeat(this.indentacao);
26216
26553
  if (Array.isArray(declaracaoTente.caminhoPegue)) {
26217
26554
  for (let declaracao of declaracaoTente.caminhoPegue) {
26218
- resultado += this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
26555
+ resultado +=
26556
+ this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
26219
26557
  }
26220
26558
  }
26221
26559
  else {
@@ -26229,7 +26567,8 @@ class TradutorAssemblyScript {
26229
26567
  if (declaracaoTente.caminhoFinalmente !== null) {
26230
26568
  resultado += '\nfinally {\n';
26231
26569
  for (let finalmente of declaracaoTente.caminhoFinalmente) {
26232
- resultado += this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
26570
+ resultado +=
26571
+ this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
26233
26572
  }
26234
26573
  resultado += ' '.repeat(this.indentacao);
26235
26574
  resultado += '}';
@@ -26259,7 +26598,10 @@ class TradutorAssemblyScript {
26259
26598
  logicaTraducaoMetodoClasse(metodoClasse) {
26260
26599
  this.indentacao += 4;
26261
26600
  let resultado = ' '.repeat(this.indentacao);
26262
- resultado += metodoClasse.simbolo.lexema === 'construtor' ? 'constructor(' : metodoClasse.simbolo.lexema + '(';
26601
+ resultado +=
26602
+ metodoClasse.simbolo.lexema === 'construtor'
26603
+ ? 'constructor('
26604
+ : metodoClasse.simbolo.lexema + '(';
26263
26605
  for (let parametro of metodoClasse.funcao.parametros) {
26264
26606
  resultado += parametro.nome.lexema + ', ';
26265
26607
  }
@@ -26379,7 +26721,8 @@ class TradutorAssemblyScript {
26379
26721
  this.indentacao += 4;
26380
26722
  resultado += ' '.repeat(this.indentacao);
26381
26723
  for (let condicao of caminho.condicoes) {
26382
- resultado += 'case ' + this.dicionarioConstrutos[condicao.constructor.name](condicao) + ':\n';
26724
+ resultado +=
26725
+ 'case ' + this.dicionarioConstrutos[condicao.constructor.name](condicao) + ':\n';
26383
26726
  resultado += ' '.repeat(this.indentacao);
26384
26727
  }
26385
26728
  for (let declaracao of caminho.declaracoes) {
@@ -26392,7 +26735,8 @@ class TradutorAssemblyScript {
26392
26735
  this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
26393
26736
  break;
26394
26737
  default:
26395
- resultado += this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
26738
+ resultado +=
26739
+ this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
26396
26740
  break;
26397
26741
  }
26398
26742
  resultado += ' '.repeat(this.indentacao + 4);
@@ -26532,20 +26876,27 @@ class TradutorAssemblyScript {
26532
26876
  traduzirConstrutoBinario(binario) {
26533
26877
  let resultado = '';
26534
26878
  if (binario.esquerda.constructor.name === 'Agrupamento')
26535
- resultado += '(' + this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) + ')';
26879
+ resultado +=
26880
+ '(' +
26881
+ this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
26882
+ ')';
26536
26883
  else
26537
26884
  resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
26538
26885
  let operador = this.traduzirSimboloOperador(binario.operador);
26539
26886
  resultado += ` ${operador} `;
26540
26887
  if (binario.direita.constructor.name === 'Agrupamento')
26541
- resultado += '(' + this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) + ')';
26888
+ resultado +=
26889
+ '(' +
26890
+ this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
26891
+ ')';
26542
26892
  else
26543
26893
  resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
26544
26894
  return resultado;
26545
26895
  }
26546
26896
  traduzirConstrutoAtribuir(atribuir) {
26547
26897
  let resultado = this.dicionarioConstrutos[atribuir.alvo.constructor.name](atribuir.alvo);
26548
- resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
26898
+ resultado +=
26899
+ ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
26549
26900
  return resultado;
26550
26901
  }
26551
26902
  // TODO: Eliminar o soft cast para `any`.
@@ -26761,13 +27112,19 @@ class TradutorJavaScript {
26761
27112
  traduzirConstrutoBinario(binario) {
26762
27113
  let resultado = '';
26763
27114
  if (binario.esquerda.constructor.name === 'Agrupamento')
26764
- resultado += '(' + this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) + ')';
27115
+ resultado +=
27116
+ '(' +
27117
+ this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
27118
+ ')';
26765
27119
  else
26766
27120
  resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
26767
27121
  let operador = this.traduzirSimboloOperador(binario.operador);
26768
27122
  resultado += ` ${operador} `;
26769
27123
  if (binario.direita.constructor.name === 'Agrupamento')
26770
- resultado += '(' + this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) + ')';
27124
+ resultado +=
27125
+ '(' +
27126
+ this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
27127
+ ')';
26771
27128
  else
26772
27129
  resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
26773
27130
  return resultado;
@@ -26805,7 +27162,8 @@ class TradutorJavaScript {
26805
27162
  for (let i = 0; i < dicionario.chaves.length; i++) {
26806
27163
  resultado += this.dicionarioConstrutos[dicionario.chaves[i].constructor.name](dicionario.chaves[i]);
26807
27164
  resultado += ':';
26808
- resultado += this.dicionarioConstrutos[dicionario.valores[i].constructor.name](dicionario.valores[i]) + ',';
27165
+ resultado +=
27166
+ this.dicionarioConstrutos[dicionario.valores[i].constructor.name](dicionario.valores[i]) + ',';
26809
27167
  }
26810
27168
  resultado += '}';
26811
27169
  return resultado;
@@ -26878,7 +27236,10 @@ class TradutorJavaScript {
26878
27236
  logicaTraducaoMetodoClasse(metodoClasse) {
26879
27237
  this.indentacao += 4;
26880
27238
  let resultado = ' '.repeat(this.indentacao);
26881
- resultado += metodoClasse.simbolo.lexema === 'construtor' ? 'constructor(' : metodoClasse.simbolo.lexema + '(';
27239
+ resultado +=
27240
+ metodoClasse.simbolo.lexema === 'construtor'
27241
+ ? 'constructor('
27242
+ : metodoClasse.simbolo.lexema + '(';
26882
27243
  for (let parametro of metodoClasse.funcao.parametros) {
26883
27244
  resultado += parametro.nome.lexema + ', ';
26884
27245
  }
@@ -26916,7 +27277,10 @@ class TradutorJavaScript {
26916
27277
  resultado += ' '.repeat(this.indentacao);
26917
27278
  if (caminho.condicoes && caminho.condicoes.length > 0) {
26918
27279
  for (let condicao of caminho.condicoes) {
26919
- resultado += 'case ' + this.dicionarioConstrutos[condicao.constructor.name](condicao) + ':\n';
27280
+ resultado +=
27281
+ 'case ' +
27282
+ this.dicionarioConstrutos[condicao.constructor.name](condicao) +
27283
+ ':\n';
26920
27284
  resultado += ' '.repeat(this.indentacao);
26921
27285
  }
26922
27286
  }
@@ -26934,7 +27298,8 @@ class TradutorJavaScript {
26934
27298
  this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
26935
27299
  break;
26936
27300
  default:
26937
- resultado += this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
27301
+ resultado +=
27302
+ this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
26938
27303
  break;
26939
27304
  }
26940
27305
  }
@@ -27068,7 +27433,8 @@ class TradutorJavaScript {
27068
27433
  resultado += ' '.repeat(this.indentacao);
27069
27434
  if (Array.isArray(declaracaoTente.caminhoPegue)) {
27070
27435
  for (let declaracao of declaracaoTente.caminhoPegue) {
27071
- resultado += this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
27436
+ resultado +=
27437
+ this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
27072
27438
  }
27073
27439
  }
27074
27440
  else {
@@ -27082,7 +27448,8 @@ class TradutorJavaScript {
27082
27448
  if (declaracaoTente.caminhoFinalmente !== null) {
27083
27449
  resultado += '\nfinally {\n';
27084
27450
  for (let finalmente of declaracaoTente.caminhoFinalmente) {
27085
- resultado += this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
27451
+ resultado +=
27452
+ this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
27086
27453
  }
27087
27454
  resultado += ' '.repeat(this.indentacao);
27088
27455
  resultado += '}';
@@ -28201,7 +28568,8 @@ class TradutorPython {
28201
28568
  case 'texto':
28202
28569
  return `str(${textoArgumentos})`;
28203
28570
  default:
28204
- if (argumentosValidados.length === 0 && !this.classesConhecidas.includes(variavel.simbolo.lexema)) {
28571
+ if (argumentosValidados.length === 0 &&
28572
+ !this.classesConhecidas.includes(variavel.simbolo.lexema)) {
28205
28573
  return `${variavel.simbolo.lexema}`;
28206
28574
  }
28207
28575
  return `${variavel.simbolo.lexema}(${textoArgumentos})`;
@@ -28337,8 +28705,7 @@ class TradutorPython {
28337
28705
  if (Array.isArray(declaracaoPara.inicializador)) {
28338
28706
  for (const declaracaoInicializador of declaracaoPara.inicializador) {
28339
28707
  resultado +=
28340
- this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) +
28341
- `\n`;
28708
+ this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
28342
28709
  }
28343
28710
  }
28344
28711
  else {
@@ -28414,7 +28781,8 @@ class TradutorPython {
28414
28781
  resultado += ' '.repeat(this.indentacao);
28415
28782
  if (Array.isArray(declaracaoTente.caminhoPegue)) {
28416
28783
  for (let declaracao of declaracaoTente.caminhoPegue) {
28417
- resultado += this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
28784
+ resultado +=
28785
+ this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
28418
28786
  }
28419
28787
  }
28420
28788
  else {
@@ -28428,7 +28796,8 @@ class TradutorPython {
28428
28796
  resultado += '\nfinally:\n';
28429
28797
  resultado += ' '.repeat(this.indentacao);
28430
28798
  for (let finalmente of declaracaoTente.caminhoFinalmente) {
28431
- resultado += this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
28799
+ resultado +=
28800
+ this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
28432
28801
  }
28433
28802
  }
28434
28803
  return resultado;
@@ -28674,7 +29043,8 @@ class TradutorReversoJavaScript {
28674
29043
  let resultado = '';
28675
29044
  let emOuDe = declaracao.type === 'ForInStatement' ? 'em' : 'de';
28676
29045
  resultado += `para (${this.traduzirDeclaracao(declaracao.left)} ${emOuDe} `;
28677
- resultado += this.dicionarioConstrutos[declaracao.right.constructor.name](declaracao.right) + ') ';
29046
+ resultado +=
29047
+ this.dicionarioConstrutos[declaracao.right.constructor.name](declaracao.right) + ') ';
28678
29048
  resultado += this.logicaComumBlocoEscopo(declaracao.body);
28679
29049
  return resultado;
28680
29050
  }