@designliquido/delegua 0.41.7 → 0.42.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 (118) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +33 -18
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico.d.ts +16 -3
  5. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.js +185 -55
  7. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +5 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  13. package/avaliador-sintatico/index.d.ts +1 -0
  14. package/avaliador-sintatico/index.d.ts.map +1 -1
  15. package/avaliador-sintatico/index.js +1 -0
  16. package/avaliador-sintatico/index.js.map +1 -1
  17. package/avaliador-sintatico/informacao-escopo.d.ts +3 -2
  18. package/avaliador-sintatico/informacao-escopo.d.ts.map +1 -1
  19. package/avaliador-sintatico/informacao-escopo.js.map +1 -1
  20. package/avaliador-sintatico/pilha-escopos.d.ts +6 -4
  21. package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
  22. package/avaliador-sintatico/pilha-escopos.js +6 -3
  23. package/avaliador-sintatico/pilha-escopos.js.map +1 -1
  24. package/bibliotecas/biblioteca-global.d.ts +18 -11
  25. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  26. package/bibliotecas/biblioteca-global.js +45 -22
  27. package/bibliotecas/biblioteca-global.js.map +1 -1
  28. package/bibliotecas/dialetos/egua-classico/index.js +0 -1
  29. package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
  30. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  31. package/bibliotecas/primitivas-dicionario.js +4 -2
  32. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  33. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  34. package/bibliotecas/primitivas-numero.js +4 -2
  35. package/bibliotecas/primitivas-numero.js.map +1 -1
  36. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  37. package/bibliotecas/primitivas-texto.js +42 -14
  38. package/bibliotecas/primitivas-texto.js.map +1 -1
  39. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  40. package/bibliotecas/primitivas-vetor.js +62 -20
  41. package/bibliotecas/primitivas-vetor.js.map +1 -1
  42. package/bin/package.json +3 -1
  43. package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
  44. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  45. package/construtos/acesso-metodo.d.ts +2 -2
  46. package/construtos/acesso-propriedade.d.ts +2 -2
  47. package/construtos/acesso-propriedade.d.ts.map +1 -1
  48. package/construtos/acesso-propriedade.js.map +1 -1
  49. package/construtos/argumento-referencia-funcao.d.ts +2 -2
  50. package/construtos/binario.d.ts.map +1 -1
  51. package/construtos/binario.js.map +1 -1
  52. package/construtos/componente-linguagem.d.ts +2 -2
  53. package/construtos/componente-linguagem.js +1 -1
  54. package/construtos/referencia-funcao.d.ts +2 -2
  55. package/construtos/super.d.ts.map +1 -1
  56. package/construtos/super.js.map +1 -1
  57. package/inferenciador.d.ts.map +1 -1
  58. package/inferenciador.js.map +1 -1
  59. package/informacao-variavel-ou-constante.d.ts +8 -0
  60. package/informacao-variavel-ou-constante.d.ts.map +1 -0
  61. package/informacao-variavel-ou-constante.js +16 -0
  62. package/informacao-variavel-ou-constante.js.map +1 -0
  63. package/interfaces/construtos/index.d.ts +2 -2
  64. package/interfaces/primitiva-interface.d.ts +2 -0
  65. package/interfaces/primitiva-interface.d.ts.map +1 -1
  66. package/interpretador/comum.d.ts.map +1 -1
  67. package/interpretador/comum.js +2 -0
  68. package/interpretador/comum.js.map +1 -1
  69. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -1
  70. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  71. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  72. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  73. package/interpretador/estruturas/delegua-funcao.js +1 -1
  74. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  75. package/interpretador/interpretador-base.d.ts.map +1 -1
  76. package/interpretador/interpretador-base.js +6 -3
  77. package/interpretador/interpretador-base.js.map +1 -1
  78. package/interpretador/interpretador.d.ts +4 -4
  79. package/interpretador/interpretador.d.ts.map +1 -1
  80. package/interpretador/interpretador.js +2 -2
  81. package/interpretador/interpretador.js.map +1 -1
  82. package/interpretador/pilha-escopos-execucao.js +3 -3
  83. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  84. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  85. package/lexador/dialetos/lexador-pitugues.js +39 -39
  86. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  87. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +56 -0
  88. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -0
  89. package/lexador/dialetos/palavras-reservadas/pitugues.js +63 -0
  90. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -0
  91. package/lexador/index.d.ts +1 -0
  92. package/lexador/index.d.ts.map +1 -1
  93. package/lexador/index.js +1 -0
  94. package/lexador/index.js.map +1 -1
  95. package/package.json +3 -1
  96. package/tipos-de-simbolos/delegua.d.ts +1 -0
  97. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  98. package/tipos-de-simbolos/delegua.js +1 -0
  99. package/tipos-de-simbolos/delegua.js.map +1 -1
  100. package/tipos-de-simbolos/pitugues.d.ts +6 -0
  101. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  102. package/tipos-de-simbolos/pitugues.js +6 -0
  103. package/tipos-de-simbolos/pitugues.js.map +1 -1
  104. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  105. package/tradutores/tradutor-assemblyscript.js +2 -1
  106. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  107. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  108. package/tradutores/tradutor-javascript.js +18 -13
  109. package/tradutores/tradutor-javascript.js.map +1 -1
  110. package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
  111. package/tradutores/tradutor-mermaidjs.js +8 -8
  112. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  113. package/tradutores/tradutor-python.d.ts.map +1 -1
  114. package/tradutores/tradutor-python.js +6 -6
  115. package/tradutores/tradutor-python.js.map +1 -1
  116. package/umd/delegua.js +830 -495
  117. package/bin/delegua +0 -3
  118. package/bin/delegua.cmd +0 -1
@@ -13,6 +13,7 @@ const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
13
13
  const inferenciador_1 = require("../inferenciador");
14
14
  const pilha_escopos_1 = require("./pilha-escopos");
15
15
  const informacao_escopo_1 = require("./informacao-escopo");
16
+ const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-constante");
16
17
  const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
17
18
  const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
18
19
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
@@ -41,20 +42,23 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
41
42
  this.tiposDefinidosEmCodigo = {};
42
43
  this.tiposDeFerramentasExternas = {};
43
44
  this.primitivasConhecidas = {};
44
- for (const nomePrimitivaDicionario of Object.keys(primitivas_dicionario_1.default)) {
45
- this.primitivasConhecidas[nomePrimitivaDicionario] = 'dicionário';
45
+ for (const [nomePrimitivaDicionario, dadosPrimitiva] of Object.entries(primitivas_dicionario_1.default)) {
46
+ this.primitivasConhecidas[nomePrimitivaDicionario] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaDicionario, 'dicionário', dadosPrimitiva.argumentos);
46
47
  }
47
- for (const nomePrimitivaNumero of Object.keys(primitivas_numero_1.default)) {
48
- this.primitivasConhecidas[nomePrimitivaNumero] = 'número';
48
+ for (const [nomePrimitivaNumero, dadosPrimitiva] of Object.entries(primitivas_numero_1.default)) {
49
+ this.primitivasConhecidas[nomePrimitivaNumero] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaNumero, 'número', dadosPrimitiva.argumentos);
49
50
  }
50
- for (const nomePrimitivaTexto of Object.keys(primitivas_texto_1.default)) {
51
- this.primitivasConhecidas[nomePrimitivaTexto] = 'texto';
51
+ for (const [nomePrimitivaTexto, dadosPrimitiva] of Object.entries(primitivas_texto_1.default)) {
52
+ this.primitivasConhecidas[nomePrimitivaTexto] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaTexto, 'texto', dadosPrimitiva.argumentos);
52
53
  }
53
- for (const nomePrimitivaVetor of Object.keys(primitivas_vetor_1.default)) {
54
- this.primitivasConhecidas[nomePrimitivaVetor] = 'vetor';
54
+ for (const [nomePrimitivaVetor, dadosPrimitiva] of Object.entries(primitivas_vetor_1.default)) {
55
+ this.primitivasConhecidas[nomePrimitivaVetor] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaVetor, 'vetor', dadosPrimitiva.argumentos);
55
56
  }
56
- this.primitivasConhecidas['inteiro'] = 'inteiro';
57
- this.primitivasConhecidas['texto'] = 'texto';
57
+ // TODO: Por enquanto não há necessidade de validar argumentos aqui, mas isso pode mudar no futuro.
58
+ this.primitivasConhecidas['inteiro'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro');
59
+ this.primitivasConhecidas['numero'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('numero', 'número');
60
+ this.primitivasConhecidas['número'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número');
61
+ this.primitivasConhecidas['texto'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto');
58
62
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
59
63
  }
60
64
  verificarDefinicaoTipoAtual() {
@@ -163,6 +167,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
163
167
  }
164
168
  const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valores);
165
169
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, valores.length, tipoVetor);
170
+ case delegua_2.default.EXPRESSAO_REGULAR:
171
+ let valor = '';
172
+ let linhaAtual = this.simbolos[this.atual].linha;
173
+ let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
174
+ .length %
175
+ 2 ===
176
+ 0;
177
+ if (eParExpressaoRegular) {
178
+ this.avancarEDevolverAnterior();
179
+ while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
180
+ valor += this.simbolos[this.atual].lexema || '';
181
+ this.avancarEDevolverAnterior();
182
+ }
183
+ this.avancarEDevolverAnterior();
184
+ return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
185
+ }
166
186
  case delegua_2.default.FALSO:
167
187
  this.avancarEDevolverAnterior();
168
188
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false, 'lógico');
@@ -170,7 +190,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
170
190
  case delegua_2.default.FUNÇÃO:
171
191
  const simboloFuncao = this.avancarEDevolverAnterior();
172
192
  const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
173
- this.pilhaEscopos.definirTipoVariavel(simboloFuncao.lexema, 'função');
193
+ this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
174
194
  return corpoDaFuncao;
175
195
  case delegua_2.default.IDENTIFICADOR:
176
196
  const simboloIdentificador = this.avancarEDevolverAnterior();
@@ -200,6 +220,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
200
220
  this.avancarEDevolverAnterior();
201
221
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
202
222
  case delegua_2.default.NUMERO:
223
+ case delegua_2.default.NÚMERO:
203
224
  case delegua_2.default.TEXTO:
204
225
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
205
226
  const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
@@ -283,33 +304,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
283
304
  }
284
305
  }
285
306
  return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
286
- case delegua_2.default.EXPRESSAO_REGULAR:
287
- let valor = '';
288
- let linhaAtual = this.simbolos[this.atual].linha;
289
- let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
290
- .length %
291
- 2 ===
292
- 0;
293
- if (eParExpressaoRegular) {
294
- this.avancarEDevolverAnterior();
295
- while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
296
- valor += this.simbolos[this.atual].lexema || '';
297
- this.avancarEDevolverAnterior();
298
- }
299
- this.avancarEDevolverAnterior();
300
- return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
301
- }
302
307
  }
303
308
  throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
304
309
  }
305
310
  chamar() {
306
311
  let expressao = this.primario();
307
312
  while (true) {
313
+ let tipoPrimitiva = undefined;
308
314
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
309
- expressao = this.finalizarChamada(expressao);
315
+ expressao = this.finalizarChamada(expressao, tipoPrimitiva);
310
316
  }
311
317
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
312
318
  const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
319
+ tipoPrimitiva = expressao.tipo;
313
320
  expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
314
321
  }
315
322
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
@@ -373,10 +380,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
373
380
  }
374
381
  return entidadeChamadaResolvida;
375
382
  }
376
- resolverEntidadeChamada(entidadeChamada) {
383
+ validarArgumentosEntidadeChamada(argumentosEntidadeChamada, argumentosUtilizados) {
384
+ if (argumentosEntidadeChamada.length === 0) {
385
+ return [];
386
+ }
387
+ const possiveisErros = [];
388
+ for (const [indice, argumentoEntidadeChamada] of argumentosEntidadeChamada.entries()) {
389
+ const argumentoUtilizado = argumentosUtilizados[indice];
390
+ if (argumentoUtilizado.tipo === null || argumentoUtilizado.tipo === undefined) {
391
+ continue;
392
+ }
393
+ const argumentoEntidadeChamadaVetor = argumentoEntidadeChamada.tipo.endsWith('[]');
394
+ const argumentoUtilizadoVetor = argumentoUtilizado.tipo.endsWith('[]');
395
+ if (argumentoEntidadeChamadaVetor !== argumentoUtilizadoVetor) {
396
+ possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
397
+ continue;
398
+ }
399
+ const argumentoEntidadeChamadaQualquer = argumentoEntidadeChamada.tipo.startsWith('qualquer');
400
+ if (argumentoEntidadeChamadaQualquer) {
401
+ continue;
402
+ }
403
+ if (argumentoUtilizado.tipo !== argumentoEntidadeChamada.tipo) {
404
+ possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
405
+ }
406
+ }
407
+ return possiveisErros;
408
+ }
409
+ /**
410
+ * Diversas verificações de resolução de entidade chamada, como resolver chamada da pilha ou usar referência, argumentos, etc.
411
+ * @param entidadeChamada O construto da entidade chamada.
412
+ * @param argumentos Os argumentos utilizados na chamada.
413
+ * @param tipoPrimitiva Se for uma primitiva, o tipo dela. Senão, `undefined`.
414
+ * @returns A entidade chamada resolvida, se as validações passarem.
415
+ */
416
+ resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
377
417
  if (entidadeChamada.constructor.name === 'Variavel') {
378
418
  const entidadeChamadaResolvidaVariavel = entidadeChamada;
379
- if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
419
+ if (tipoPrimitiva === undefined) {
420
+ // Provavelmente uma chamada a alguma função da biblioteca global.
421
+ const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
422
+ if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
423
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
424
+ if (erros.length > 0) {
425
+ 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`, '')}`);
426
+ }
427
+ return entidadeChamadaResolvidaVariavel;
428
+ }
429
+ }
430
+ if (tipoPrimitiva !== undefined && this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
431
+ var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
432
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
433
+ if (erros.length > 0) {
434
+ 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`, '')}`);
435
+ }
380
436
  return entidadeChamadaResolvidaVariavel;
381
437
  }
382
438
  if (entidadeChamadaResolvidaVariavel.simbolo.lexema in this.tiposDefinidosEmCodigo) {
@@ -393,7 +449,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
393
449
  }
394
450
  return entidadeChamada;
395
451
  }
396
- finalizarChamada(entidadeChamada) {
452
+ finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
397
453
  const argumentos = [];
398
454
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
399
455
  do {
@@ -406,7 +462,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
406
462
  }
407
463
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
408
464
  // Toda chamada precisa saber de antemão qual o tipo resolvido.
409
- const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada);
465
+ const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva);
410
466
  // TODO: Criar forma de validar tipos dos argumentos da entidade chamada.
411
467
  const construtoChamada = new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
412
468
  construtoChamada.tipo = 'qualquer';
@@ -756,7 +812,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
756
812
  if (!tipoVetor.endsWith('[]')) {
757
813
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
758
814
  }
759
- this.pilhaEscopos.definirTipoVariavel(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2));
815
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
760
816
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
761
817
  const corpo = this.resolverDeclaracao();
762
818
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
@@ -995,7 +1051,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
995
1051
  default:
996
1052
  break;
997
1053
  }
998
- this.pilhaEscopos.definirTipoVariavel(simboloNomeVariavel.lexema, tipoInicializacao);
1054
+ this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloNomeVariavel.lexema, tipoInicializacao));
999
1055
  const blocoCorpo = this.blocoEscopo();
1000
1056
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1001
1057
  }
@@ -1009,7 +1065,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1009
1065
  const inicializador = this.expressao();
1010
1066
  const retornos = [];
1011
1067
  for (let identificador of identificadores) {
1012
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1068
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
1013
1069
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1014
1070
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
1015
1071
  retornos.push(declaracaoVar);
@@ -1085,7 +1141,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1085
1141
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1086
1142
  // Inicialização de variáveis sem valor.
1087
1143
  for (let identificador of identificadores.values()) {
1088
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1144
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1089
1145
  retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
1090
1146
  }
1091
1147
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1102,7 +1158,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1102
1158
  for (let [indice, identificador] of identificadores.entries()) {
1103
1159
  // Se tipo ainda não foi definido, infere.
1104
1160
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1105
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1161
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1106
1162
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1107
1163
  }
1108
1164
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1120,7 +1176,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1120
1176
  const retornos = [];
1121
1177
  for (let identificador of identificadores) {
1122
1178
  // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
1123
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1179
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, 'qualquer'));
1124
1180
  const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1125
1181
  declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
1126
1182
  retornos.push(declaracaoConst);
@@ -1156,7 +1212,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1156
1212
  for (let [indice, identificador] of identificadores.entries()) {
1157
1213
  // Se tipo ainda não foi definido, infere.
1158
1214
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1159
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1215
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1160
1216
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1161
1217
  }
1162
1218
  this.pilhaDecoradores = [];
@@ -1177,9 +1233,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1177
1233
  this.pilhaDecoradores = [];
1178
1234
  // Se houver chamadas recursivas à função, precisamos definir um tipo
1179
1235
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1180
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1236
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, 'qualquer'));
1181
1237
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1182
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipo);
1238
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, corpoDaFuncao.tipo));
1183
1239
  const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipo, decoradores);
1184
1240
  this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
1185
1241
  return funcaoDeclaracao;
@@ -1205,7 +1261,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1205
1261
  parametro.tipoDado = tipoDadoParametro;
1206
1262
  this.avancarEDevolverAnterior();
1207
1263
  }
1208
- this.pilhaEscopos.definirTipoVariavel(parametro.nome.lexema, parametro.tipoDado || 'qualquer');
1264
+ this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
1209
1265
  parametros.push(parametro);
1210
1266
  if (parametro.abrangencia === 'multiplo')
1211
1267
  break;
@@ -1408,26 +1464,99 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1408
1464
  this.avancarEDevolverAnterior();
1409
1465
  }
1410
1466
  }
1467
+ /**
1468
+ * Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
1469
+ * TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
1470
+ */
1411
1471
  inicializarPilhaEscopos() {
1412
1472
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
1413
1473
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
1414
1474
  // Funções nativas de Delégua
1415
- this.pilhaEscopos.definirTipoVariavel('aleatorio', 'inteiro');
1416
- this.pilhaEscopos.definirTipoVariavel('aleatorioEntre', 'inteiro');
1417
- this.pilhaEscopos.definirTipoVariavel('filtrarPor', 'qualquer[]');
1418
- this.pilhaEscopos.definirTipoVariavel('inteiro', 'inteiro');
1419
- this.pilhaEscopos.definirTipoVariavel('mapear', 'qualquer[]');
1420
- this.pilhaEscopos.definirTipoVariavel('paraCada', 'qualquer[]');
1421
- this.pilhaEscopos.definirTipoVariavel('primeiroEmCondicao', 'qualquer');
1422
- this.pilhaEscopos.definirTipoVariavel('real', 'número');
1423
- this.pilhaEscopos.definirTipoVariavel('tamanho', 'inteiro');
1424
- this.pilhaEscopos.definirTipoVariavel('texto', 'texto');
1425
- this.pilhaEscopos.definirTipoVariavel('todosEmCondicao', 'lógico');
1426
- this.pilhaEscopos.definirTipoVariavel('tupla', 'tupla');
1475
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
1476
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
1477
+ ]));
1478
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
1479
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
1480
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
1481
+ ]));
1482
+ this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
1483
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1484
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1485
+ ]));
1486
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
1487
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1488
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1489
+ ]));
1490
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
1491
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1492
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1493
+ ]));
1494
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
1495
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1496
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1497
+ ]));
1498
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
1499
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1500
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1501
+ ]));
1502
+ this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
1503
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1504
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1505
+ ]));
1506
+ this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
1507
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1508
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1509
+ ]));
1510
+ this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
1511
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1512
+ ]));
1513
+ this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
1514
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1515
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
1516
+ ]));
1517
+ this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1518
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1519
+ ]));
1520
+ this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1521
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1522
+ ]));
1523
+ this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
1524
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1525
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
1526
+ ]));
1527
+ this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
1528
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1529
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1530
+ ]));
1531
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
1532
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1533
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1534
+ ]));
1535
+ this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
1536
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1537
+ ]));
1538
+ this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
1539
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1540
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
1541
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
1542
+ ]));
1543
+ this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
1544
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
1545
+ ]));
1546
+ this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
1547
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1548
+ ]));
1549
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
1550
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1551
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
1552
+ ]));
1553
+ this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
1554
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
1555
+ ]));
1427
1556
  // TODO: Escrever algum tipo de validação aqui.
1428
1557
  for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
1429
1558
  for (const [nomeTipo, tipo] of Object.entries(tipos)) {
1430
- this.pilhaEscopos.definirTipoVariavel(nomeTipo, tipo);
1559
+ this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeTipo, tipo));
1431
1560
  }
1432
1561
  }
1433
1562
  }
@@ -1454,6 +1583,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1454
1583
  }
1455
1584
  if (this.performance) {
1456
1585
  const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
1586
+ // eslint-disable-next-line no-undef
1457
1587
  console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
1458
1588
  }
1459
1589
  return {