@designliquido/delegua 0.41.8 → 0.42.1

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 (66) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +28 -14
  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 +184 -46
  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 +1 -0
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  11. package/avaliador-sintatico/index.d.ts +1 -0
  12. package/avaliador-sintatico/index.d.ts.map +1 -1
  13. package/avaliador-sintatico/index.js +1 -0
  14. package/avaliador-sintatico/index.js.map +1 -1
  15. package/avaliador-sintatico/informacao-escopo.d.ts +2 -1
  16. package/avaliador-sintatico/informacao-escopo.d.ts.map +1 -1
  17. package/avaliador-sintatico/informacao-escopo.js.map +1 -1
  18. package/avaliador-sintatico/pilha-escopos.d.ts +3 -1
  19. package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
  20. package/avaliador-sintatico/pilha-escopos.js +6 -3
  21. package/avaliador-sintatico/pilha-escopos.js.map +1 -1
  22. package/bibliotecas/biblioteca-global.d.ts +7 -7
  23. package/bibliotecas/biblioteca-global.d.ts.map +1 -1
  24. package/bibliotecas/biblioteca-global.js +14 -8
  25. package/bibliotecas/biblioteca-global.js.map +1 -1
  26. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  27. package/bibliotecas/primitivas-dicionario.js +2 -0
  28. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  29. package/bibliotecas/primitivas-numero.d.ts.map +1 -1
  30. package/bibliotecas/primitivas-numero.js +9 -0
  31. package/bibliotecas/primitivas-numero.js.map +1 -1
  32. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  33. package/bibliotecas/primitivas-texto.js +28 -0
  34. package/bibliotecas/primitivas-texto.js.map +1 -1
  35. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  36. package/bibliotecas/primitivas-vetor.js +46 -4
  37. package/bibliotecas/primitivas-vetor.js.map +1 -1
  38. package/bin/package.json +2 -2
  39. package/informacao-variavel-ou-constante.d.ts +8 -0
  40. package/informacao-variavel-ou-constante.d.ts.map +1 -0
  41. package/informacao-variavel-ou-constante.js +16 -0
  42. package/informacao-variavel-ou-constante.js.map +1 -0
  43. package/interfaces/primitiva-interface.d.ts +2 -0
  44. package/interfaces/primitiva-interface.d.ts.map +1 -1
  45. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  46. package/lexador/dialetos/lexador-pitugues.js +39 -39
  47. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  48. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +56 -0
  49. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -0
  50. package/lexador/dialetos/palavras-reservadas/pitugues.js +63 -0
  51. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -0
  52. package/lexador/index.d.ts +1 -0
  53. package/lexador/index.d.ts.map +1 -1
  54. package/lexador/index.js +1 -0
  55. package/lexador/index.js.map +1 -1
  56. package/lexador/lexador.d.ts.map +1 -1
  57. package/lexador/lexador.js +28 -15
  58. package/lexador/lexador.js.map +1 -1
  59. package/package.json +2 -2
  60. package/tipos-de-simbolos/pitugues.d.ts +6 -0
  61. package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
  62. package/tipos-de-simbolos/pitugues.js +6 -0
  63. package/tipos-de-simbolos/pitugues.js.map +1 -1
  64. package/umd/delegua.js +768 -437
  65. package/bin/delegua +0 -3
  66. 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,22 +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['numero'] = 'número';
58
- this.primitivasConhecidas['número'] = 'número';
59
- 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');
60
62
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
61
63
  }
62
64
  verificarDefinicaoTipoAtual() {
@@ -188,7 +190,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
188
190
  case delegua_2.default.FUNÇÃO:
189
191
  const simboloFuncao = this.avancarEDevolverAnterior();
190
192
  const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
191
- this.pilhaEscopos.definirTipoVariavel(simboloFuncao.lexema, 'função');
193
+ this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
192
194
  return corpoDaFuncao;
193
195
  case delegua_2.default.IDENTIFICADOR:
194
196
  const simboloIdentificador = this.avancarEDevolverAnterior();
@@ -214,6 +216,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
214
216
  case delegua_2.default.ISTO:
215
217
  this.avancarEDevolverAnterior();
216
218
  return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
219
+ case delegua_2.default.LEIA:
220
+ return this.expressaoLeia();
217
221
  case delegua_2.default.NULO:
218
222
  this.avancarEDevolverAnterior();
219
223
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
@@ -308,11 +312,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
308
312
  chamar() {
309
313
  let expressao = this.primario();
310
314
  while (true) {
315
+ let tipoPrimitiva = undefined;
311
316
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
312
- expressao = this.finalizarChamada(expressao);
317
+ expressao = this.finalizarChamada(expressao, tipoPrimitiva);
313
318
  }
314
319
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
315
320
  const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
321
+ tipoPrimitiva = expressao.tipo;
316
322
  expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
317
323
  }
318
324
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
@@ -376,10 +382,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
376
382
  }
377
383
  return entidadeChamadaResolvida;
378
384
  }
379
- resolverEntidadeChamada(entidadeChamada) {
385
+ validarArgumentosEntidadeChamada(argumentosEntidadeChamada, argumentosUtilizados) {
386
+ if (argumentosEntidadeChamada.length === 0) {
387
+ return [];
388
+ }
389
+ const possiveisErros = [];
390
+ for (const [indice, argumentoEntidadeChamada] of argumentosEntidadeChamada.entries()) {
391
+ const argumentoUtilizado = argumentosUtilizados[indice];
392
+ if (argumentoUtilizado.tipo === null || argumentoUtilizado.tipo === undefined) {
393
+ continue;
394
+ }
395
+ const argumentoEntidadeChamadaVetor = argumentoEntidadeChamada.tipo.endsWith('[]');
396
+ const argumentoUtilizadoVetor = argumentoUtilizado.tipo.endsWith('[]');
397
+ if (argumentoEntidadeChamadaVetor !== argumentoUtilizadoVetor) {
398
+ possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
399
+ continue;
400
+ }
401
+ const argumentoEntidadeChamadaQualquer = argumentoEntidadeChamada.tipo.startsWith('qualquer');
402
+ if (argumentoEntidadeChamadaQualquer) {
403
+ continue;
404
+ }
405
+ if (argumentoUtilizado.tipo !== argumentoEntidadeChamada.tipo) {
406
+ possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
407
+ }
408
+ }
409
+ return possiveisErros;
410
+ }
411
+ /**
412
+ * Diversas verificações de resolução de entidade chamada, como resolver chamada da pilha ou usar referência, argumentos, etc.
413
+ * @param entidadeChamada O construto da entidade chamada.
414
+ * @param argumentos Os argumentos utilizados na chamada.
415
+ * @param tipoPrimitiva Se for uma primitiva, o tipo dela. Senão, `undefined`.
416
+ * @returns A entidade chamada resolvida, se as validações passarem.
417
+ */
418
+ resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
380
419
  if (entidadeChamada.constructor.name === 'Variavel') {
381
420
  const entidadeChamadaResolvidaVariavel = entidadeChamada;
382
- if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
421
+ if (tipoPrimitiva === undefined) {
422
+ // Provavelmente uma chamada a alguma função da biblioteca global.
423
+ const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
424
+ if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
425
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
426
+ if (erros.length > 0) {
427
+ 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`, '')}`);
428
+ }
429
+ return entidadeChamadaResolvidaVariavel;
430
+ }
431
+ }
432
+ if (tipoPrimitiva !== undefined && this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
433
+ var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
434
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
435
+ if (erros.length > 0) {
436
+ 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`, '')}`);
437
+ }
383
438
  return entidadeChamadaResolvidaVariavel;
384
439
  }
385
440
  if (entidadeChamadaResolvidaVariavel.simbolo.lexema in this.tiposDefinidosEmCodigo) {
@@ -396,7 +451,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
396
451
  }
397
452
  return entidadeChamada;
398
453
  }
399
- finalizarChamada(entidadeChamada) {
454
+ finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
400
455
  const argumentos = [];
401
456
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
402
457
  do {
@@ -409,7 +464,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
409
464
  }
410
465
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
411
466
  // Toda chamada precisa saber de antemão qual o tipo resolvido.
412
- const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada);
467
+ const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva);
413
468
  // TODO: Criar forma de validar tipos dos argumentos da entidade chamada.
414
469
  const construtoChamada = new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
415
470
  construtoChamada.tipo = 'qualquer';
@@ -558,7 +613,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
558
613
  * @returns Um objeto da classe `Leia`.
559
614
  */
560
615
  expressaoLeia() {
561
- const simboloLeia = this.simbolos[this.atual];
616
+ const simboloLeia = this.avancarEDevolverAnterior();
562
617
  this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
563
618
  const argumentos = [];
564
619
  if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
@@ -569,9 +624,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
569
624
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
570
625
  return new construtos_1.Leia(simboloLeia, argumentos);
571
626
  }
627
+ // TODO: Depreciar.
572
628
  expressao() {
573
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.LEIA))
574
- return this.expressaoLeia();
575
629
  return this.atribuir();
576
630
  }
577
631
  blocoEscopo() {
@@ -759,7 +813,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
759
813
  if (!tipoVetor.endsWith('[]')) {
760
814
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
761
815
  }
762
- this.pilhaEscopos.definirTipoVariavel(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2));
816
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
763
817
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
764
818
  const corpo = this.resolverDeclaracao();
765
819
  return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
@@ -998,7 +1052,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
998
1052
  default:
999
1053
  break;
1000
1054
  }
1001
- this.pilhaEscopos.definirTipoVariavel(simboloNomeVariavel.lexema, tipoInicializacao);
1055
+ this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloNomeVariavel.lexema, tipoInicializacao));
1002
1056
  const blocoCorpo = this.blocoEscopo();
1003
1057
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1004
1058
  }
@@ -1012,7 +1066,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1012
1066
  const inicializador = this.expressao();
1013
1067
  const retornos = [];
1014
1068
  for (let identificador of identificadores) {
1015
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1069
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
1016
1070
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1017
1071
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
1018
1072
  retornos.push(declaracaoVar);
@@ -1034,6 +1088,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1034
1088
  case 'AcessoMetodo':
1035
1089
  const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
1036
1090
  return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
1091
+ case 'AcessoMetodoOuPropriedade':
1092
+ // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1093
+ // e a chamada normalmente é feita para uma primitiva.
1094
+ // A inferência, portanto, ocorre pelo uso da primitiva.
1095
+ const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
1096
+ if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
1097
+ return this.primitivasConhecidas[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
1098
+ }
1099
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
1037
1100
  case 'AcessoPropriedade':
1038
1101
  const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
1039
1102
  return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
@@ -1063,6 +1126,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1063
1126
  case 'Noneto':
1064
1127
  case 'Deceto':
1065
1128
  return delegua_1.default.TUPLA;
1129
+ case "ImportarBiblioteca":
1130
+ case "ModuloDeclaracoes":
1131
+ return "módulo";
1066
1132
  default:
1067
1133
  return inicializador.tipo;
1068
1134
  }
@@ -1088,7 +1154,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1088
1154
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1089
1155
  // Inicialização de variáveis sem valor.
1090
1156
  for (let identificador of identificadores.values()) {
1091
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1157
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1092
1158
  retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
1093
1159
  }
1094
1160
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1105,7 +1171,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1105
1171
  for (let [indice, identificador] of identificadores.entries()) {
1106
1172
  // Se tipo ainda não foi definido, infere.
1107
1173
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1108
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1174
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1109
1175
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1110
1176
  }
1111
1177
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1123,7 +1189,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1123
1189
  const retornos = [];
1124
1190
  for (let identificador of identificadores) {
1125
1191
  // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
1126
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1192
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, 'qualquer'));
1127
1193
  const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1128
1194
  declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
1129
1195
  retornos.push(declaracaoConst);
@@ -1159,7 +1225,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1159
1225
  for (let [indice, identificador] of identificadores.entries()) {
1160
1226
  // Se tipo ainda não foi definido, infere.
1161
1227
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1162
- this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1228
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1163
1229
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1164
1230
  }
1165
1231
  this.pilhaDecoradores = [];
@@ -1180,9 +1246,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1180
1246
  this.pilhaDecoradores = [];
1181
1247
  // Se houver chamadas recursivas à função, precisamos definir um tipo
1182
1248
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1183
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1249
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, 'qualquer'));
1184
1250
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1185
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipo);
1251
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, corpoDaFuncao.tipo));
1186
1252
  const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipo, decoradores);
1187
1253
  this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
1188
1254
  return funcaoDeclaracao;
@@ -1208,7 +1274,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1208
1274
  parametro.tipoDado = tipoDadoParametro;
1209
1275
  this.avancarEDevolverAnterior();
1210
1276
  }
1211
- this.pilhaEscopos.definirTipoVariavel(parametro.nome.lexema, parametro.tipoDado || 'qualquer');
1277
+ this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
1212
1278
  parametros.push(parametro);
1213
1279
  if (parametro.abrangencia === 'multiplo')
1214
1280
  break;
@@ -1411,28 +1477,99 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1411
1477
  this.avancarEDevolverAnterior();
1412
1478
  }
1413
1479
  }
1480
+ /**
1481
+ * Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
1482
+ * TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
1483
+ */
1414
1484
  inicializarPilhaEscopos() {
1415
1485
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
1416
1486
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
1417
1487
  // Funções nativas de Delégua
1418
- this.pilhaEscopos.definirTipoVariavel('aleatorio', 'inteiro');
1419
- this.pilhaEscopos.definirTipoVariavel('aleatorioEntre', 'inteiro');
1420
- this.pilhaEscopos.definirTipoVariavel('filtrarPor', 'qualquer[]');
1421
- this.pilhaEscopos.definirTipoVariavel('inteiro', 'inteiro');
1422
- this.pilhaEscopos.definirTipoVariavel('mapear', 'qualquer[]');
1423
- this.pilhaEscopos.definirTipoVariavel('numero', 'número');
1424
- this.pilhaEscopos.definirTipoVariavel('número', 'número');
1425
- this.pilhaEscopos.definirTipoVariavel('paraCada', 'qualquer[]');
1426
- this.pilhaEscopos.definirTipoVariavel('primeiroEmCondicao', 'qualquer');
1427
- this.pilhaEscopos.definirTipoVariavel('real', 'número');
1428
- this.pilhaEscopos.definirTipoVariavel('tamanho', 'inteiro');
1429
- this.pilhaEscopos.definirTipoVariavel('texto', 'texto');
1430
- this.pilhaEscopos.definirTipoVariavel('todosEmCondicao', 'lógico');
1431
- this.pilhaEscopos.definirTipoVariavel('tupla', 'tupla');
1488
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
1489
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
1490
+ ]));
1491
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
1492
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
1493
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
1494
+ ]));
1495
+ this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
1496
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1497
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1498
+ ]));
1499
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
1500
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1501
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1502
+ ]));
1503
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
1504
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1505
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1506
+ ]));
1507
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
1508
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1509
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1510
+ ]));
1511
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
1512
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1513
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
1514
+ ]));
1515
+ this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
1516
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1517
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1518
+ ]));
1519
+ this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
1520
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1521
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1522
+ ]));
1523
+ this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
1524
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
1525
+ ]));
1526
+ this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
1527
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1528
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
1529
+ ]));
1530
+ this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1531
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1532
+ ]));
1533
+ this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
1534
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1535
+ ]));
1536
+ this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
1537
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1538
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
1539
+ ]));
1540
+ this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
1541
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1542
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1543
+ ]));
1544
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
1545
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1546
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
1547
+ ]));
1548
+ this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
1549
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1550
+ ]));
1551
+ this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
1552
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1553
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
1554
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
1555
+ ]));
1556
+ this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
1557
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
1558
+ ]));
1559
+ this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
1560
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
1561
+ ]));
1562
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
1563
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1564
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
1565
+ ]));
1566
+ this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
1567
+ new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
1568
+ ]));
1432
1569
  // TODO: Escrever algum tipo de validação aqui.
1433
1570
  for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
1434
1571
  for (const [nomeTipo, tipo] of Object.entries(tipos)) {
1435
- this.pilhaEscopos.definirTipoVariavel(nomeTipo, tipo);
1572
+ this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeTipo, tipo));
1436
1573
  }
1437
1574
  }
1438
1575
  }
@@ -1459,6 +1596,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1459
1596
  }
1460
1597
  if (this.performance) {
1461
1598
  const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
1599
+ // eslint-disable-next-line no-undef
1462
1600
  console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
1463
1601
  }
1464
1602
  return {