@designliquido/delegua 0.53.2 → 0.54.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 (91) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts +17 -8
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js +187 -130
  4. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  5. package/avaliador-sintatico/comum.d.ts +2 -2
  6. package/avaliador-sintatico/comum.d.ts.map +1 -1
  7. package/avaliador-sintatico/comum.js +2 -2
  8. package/avaliador-sintatico/comum.js.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +2 -2
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +2 -2
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +65 -65
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts +3 -3
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +19 -19
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  19. package/avaliador-sintatico/elemento-montao-tipos.d.ts +11 -0
  20. package/avaliador-sintatico/elemento-montao-tipos.d.ts.map +1 -0
  21. package/avaliador-sintatico/elemento-montao-tipos.js +11 -0
  22. package/avaliador-sintatico/elemento-montao-tipos.js.map +1 -0
  23. package/avaliador-sintatico/informacao-escopo.d.ts +4 -3
  24. package/avaliador-sintatico/informacao-escopo.d.ts.map +1 -1
  25. package/avaliador-sintatico/informacao-escopo.js +1 -1
  26. package/avaliador-sintatico/informacao-escopo.js.map +1 -1
  27. package/avaliador-sintatico/montao-tipos.d.ts +33 -0
  28. package/avaliador-sintatico/montao-tipos.d.ts.map +1 -0
  29. package/avaliador-sintatico/montao-tipos.js +50 -0
  30. package/avaliador-sintatico/montao-tipos.js.map +1 -0
  31. package/avaliador-sintatico/pilha-escopos.d.ts +5 -3
  32. package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
  33. package/avaliador-sintatico/pilha-escopos.js +18 -4
  34. package/avaliador-sintatico/pilha-escopos.js.map +1 -1
  35. package/bibliotecas/primitivas-dicionario.js +3 -3
  36. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  37. package/bibliotecas/primitivas-numero.js +2 -2
  38. package/bibliotecas/primitivas-numero.js.map +1 -1
  39. package/bibliotecas/primitivas-texto.js +11 -11
  40. package/bibliotecas/primitivas-texto.js.map +1 -1
  41. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  42. package/bibliotecas/primitivas-vetor.js +19 -18
  43. package/bibliotecas/primitivas-vetor.js.map +1 -1
  44. package/bin/package.json +1 -1
  45. package/construtos/acesso-metodo-ou-propriedade.js +1 -1
  46. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  47. package/construtos/dicionario.d.ts +2 -2
  48. package/construtos/dicionario.d.ts.map +1 -1
  49. package/construtos/dicionario.js.map +1 -1
  50. package/depuracao/index.d.ts +0 -1
  51. package/depuracao/index.d.ts.map +1 -1
  52. package/depuracao/index.js +0 -6
  53. package/depuracao/index.js.map +1 -1
  54. package/geracao-identificadores/index.d.ts +9 -0
  55. package/geracao-identificadores/index.d.ts.map +1 -1
  56. package/geracao-identificadores/index.js +20 -0
  57. package/geracao-identificadores/index.js.map +1 -1
  58. package/index.d.ts +2 -1
  59. package/index.d.ts.map +1 -1
  60. package/index.js +1 -3
  61. package/index.js.map +1 -1
  62. package/informacao-elemento-sintatico.d.ts +11 -0
  63. package/informacao-elemento-sintatico.d.ts.map +1 -0
  64. package/informacao-elemento-sintatico.js +18 -0
  65. package/informacao-elemento-sintatico.js.map +1 -0
  66. package/interfaces/primitiva-interface.d.ts +2 -2
  67. package/interfaces/primitiva-interface.d.ts.map +1 -1
  68. package/interpretador/interpretador-base.d.ts +2 -2
  69. package/interpretador/interpretador-base.d.ts.map +1 -1
  70. package/interpretador/interpretador-base.js +3 -3
  71. package/interpretador/interpretador-base.js.map +1 -1
  72. package/interpretador/interpretador.d.ts +1 -1
  73. package/interpretador/interpretador.d.ts.map +1 -1
  74. package/interpretador/interpretador.js +34 -15
  75. package/interpretador/interpretador.js.map +1 -1
  76. package/package.json +1 -1
  77. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  78. package/tradutores/tradutor-javascript.js +4 -2
  79. package/tradutores/tradutor-javascript.js.map +1 -1
  80. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  81. package/tradutores/tradutor-reverso-javascript.js +2 -0
  82. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  83. package/umd/delegua.js +873 -750
  84. package/depuracao/cyrb53.d.ts +0 -10
  85. package/depuracao/cyrb53.d.ts.map +0 -1
  86. package/depuracao/cyrb53.js +0 -23
  87. package/depuracao/cyrb53.js.map +0 -1
  88. package/informacao-variavel-ou-constante.d.ts +0 -10
  89. package/informacao-variavel-ou-constante.d.ts.map +0 -1
  90. package/informacao-variavel-ou-constante.js +0 -18
  91. package/informacao-variavel-ou-constante.js.map +0 -1
@@ -13,14 +13,16 @@ 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
+ const informacao_elemento_sintatico_1 = require("../informacao-elemento-sintatico");
17
17
  const comum_1 = require("./comum");
18
+ const montao_tipos_1 = require("./montao-tipos");
18
19
  const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
19
20
  const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
20
21
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
21
22
  const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
22
23
  const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
23
24
  const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
25
+ const elemento_montao_tipos_1 = require("./elemento-montao-tipos");
24
26
  /**
25
27
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
26
28
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -31,11 +33,14 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
31
33
  *
32
34
  * Este é o avaliador sintático de Delégua que, assim como todos os demais dialetos baseados
33
35
  * neste núcleo, são uma derivação do avaliador sintático base. Aqui estão implementadas várias mecânicas
34
- * a mais relacionadas a tipagem e registros de bibliotecas externas. Por exemplo, `tiposDeFerramentasExternas`
35
- * é utilizada em [Liquido](https://github.com/DesignLiquido/liquido) para registro de tipos exclusivos
36
- * de Liquido, como classes de requisição e resposta. `primitivasConhecidas` é utilizada aqui para
37
- * registro de métodos relacionados a tipos, e também para as bibliotecas externas de Delégua registrarem
38
- * suas respectivas resoluções de tipos.
36
+ * a mais relacionadas a tipagem e registros de bibliotecas externas:
37
+ *
38
+ * - `tiposDeFerramentasExternas` é utilizada em [Liquido](https://github.com/DesignLiquido/liquido)
39
+ * para registro de tipos exclusivos de Liquido, como classes de requisição e resposta;
40
+ * - `primitivasConhecidas` é utilizada aqui para registro de métodos relacionados a tipos, e também
41
+ * para as bibliotecas externas de Delégua registrarem suas respectivas resoluções de tipos;
42
+ * - `montaoTipos` é uma implementação de montão muito semelhante ao montão do interpretador, para
43
+ * tipos complexos com N níveis de profundidade, como dicionários e objetos.
39
44
  */
40
45
  class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
41
46
  constructor(performance = false) {
@@ -48,11 +53,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
48
53
  this.tiposDefinidosEmCodigo = {};
49
54
  this.tiposDeFerramentasExternas = {};
50
55
  this.primitivasConhecidas = {};
56
+ this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
57
+ this.montaoTipos = new montao_tipos_1.MontaoTipos();
51
58
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'dicionário', primitivas_dicionario_1.default);
52
59
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'número', primitivas_numero_1.default);
53
60
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'texto', primitivas_texto_1.default);
54
61
  (0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'vetor', primitivas_vetor_1.default);
55
- this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
56
62
  }
57
63
  verificarDefinicaoTipoAtual() {
58
64
  const tipos = [...Object.values(delegua_1.default)];
@@ -272,7 +278,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
272
278
  case delegua_2.default.FUNÇÃO:
273
279
  const simboloFuncao = this.avancarEDevolverAnterior();
274
280
  const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
275
- this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
281
+ this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloFuncao.lexema, 'função'));
276
282
  return corpoDaFuncao;
277
283
  case delegua_2.default.IDENTIFICADOR:
278
284
  const simboloIdentificador = this.avancarEDevolverAnterior();
@@ -399,28 +405,43 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
399
405
  }
400
406
  throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
401
407
  }
402
- chamar() {
403
- let expressao = this.primario();
404
- let tipoPrimitiva = undefined;
405
- while (true) {
406
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
407
- expressao = this.finalizarChamada(expressao, tipoPrimitiva);
408
- }
409
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
408
+ resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
409
+ if (!this.simbolos[this.atual]) {
410
+ return expressaoAnterior;
411
+ }
412
+ switch (this.simbolos[this.atual].tipo) {
413
+ case delegua_2.default.PARENTESE_ESQUERDO:
414
+ this.avancarEDevolverAnterior();
415
+ const chamada = this.finalizarChamada(expressaoAnterior, tipoAnterior);
416
+ return this.resolverCadeiaChamadas(chamada);
417
+ case delegua_2.default.PONTO:
418
+ this.avancarEDevolverAnterior();
410
419
  const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
411
- tipoPrimitiva = expressao.tipo;
412
- expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
413
- }
414
- else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
420
+ let tipoInferido = expressaoAnterior.tipo;
421
+ // Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
422
+ if (expressaoAnterior.tipo === 'dicionário' && expressaoAnterior.constructor !== construtos_1.Dicionario) {
423
+ const nomeDicionario = expressaoAnterior.simbolo.lexema;
424
+ const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
425
+ const referenciaMontaoTipos = this.montaoTipos.obterReferencia(expressaoAnterior.hashArquivo, expressaoAnterior.linha, elementoDicionarioPilha.endereco);
426
+ if (nome.lexema in referenciaMontaoTipos.subElementos) {
427
+ tipoInferido = referenciaMontaoTipos.subElementos[nome.lexema].tipo;
428
+ }
429
+ }
430
+ const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
431
+ return this.resolverCadeiaChamadas(acesso, tipoInferido);
432
+ case delegua_2.default.COLCHETE_ESQUERDO:
433
+ this.avancarEDevolverAnterior();
415
434
  const indice = this.expressao();
416
435
  const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
417
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
418
- }
419
- else {
420
- break;
421
- }
436
+ const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento);
437
+ return this.resolverCadeiaChamadas(acessoVariavel);
438
+ default:
439
+ return expressaoAnterior;
422
440
  }
423
- return expressao;
441
+ }
442
+ chamar() {
443
+ let expressao = this.primario();
444
+ return this.resolverCadeiaChamadas(expressao);
424
445
  }
425
446
  /**
426
447
  * `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
@@ -527,23 +548,24 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
527
548
  * @returns A entidade chamada resolvida, se as validações passarem.
528
549
  */
529
550
  resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
530
- if (entidadeChamada.constructor.name === 'Variavel') {
551
+ if (entidadeChamada.constructor === construtos_1.Variavel) {
531
552
  const entidadeChamadaResolvidaVariavel = entidadeChamada;
532
- if (tipoPrimitiva === undefined) {
553
+ if (tipoPrimitiva === 'qualquer') {
533
554
  // Provavelmente uma chamada a alguma função da biblioteca global.
555
+ // Até então, é sempre do tipo `InformacaoElementoSintatico`.
534
556
  const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
535
557
  if (informacoesPossivelFuncaoBibliotecaGlobal) {
536
- const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
558
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.subElementos, argumentos);
537
559
  if (erros.length > 0) {
538
560
  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`), '')}`);
539
561
  }
540
562
  return entidadeChamadaResolvidaVariavel;
541
563
  }
542
564
  }
543
- if (tipoPrimitiva !== undefined &&
565
+ if (tipoPrimitiva !== 'qualquer' &&
544
566
  this.primitivasConhecidas[tipoPrimitiva].hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
545
567
  var informacoesPrimitiva = this.primitivasConhecidas[tipoPrimitiva][entidadeChamadaResolvidaVariavel.simbolo.lexema];
546
- const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
568
+ const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.subElementos, argumentos);
547
569
  if (erros.length > 0) {
548
570
  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`), '')}`);
549
571
  }
@@ -554,11 +576,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
554
576
  }
555
577
  const possivelReferencia = this.pilhaEscopos.obterReferenciaFuncao(entidadeChamadaResolvidaVariavel.simbolo.lexema);
556
578
  if (possivelReferencia !== null) {
557
- return new construtos_1.ReferenciaFuncao(entidadeChamada.hashArquivo, entidadeChamada.linha, entidadeChamadaResolvidaVariavel.simbolo, entidadeChamadaResolvidaVariavel.tipo, possivelReferencia.id);
579
+ return new construtos_1.ReferenciaFuncao(entidadeChamadaResolvidaVariavel.hashArquivo, entidadeChamadaResolvidaVariavel.linha, entidadeChamadaResolvidaVariavel.simbolo, entidadeChamadaResolvidaVariavel.tipo, possivelReferencia.id);
558
580
  }
559
- return new construtos_1.ArgumentoReferenciaFuncao(entidadeChamada.hashArquivo, entidadeChamada.linha, entidadeChamadaResolvidaVariavel.simbolo);
581
+ return new construtos_1.ArgumentoReferenciaFuncao(entidadeChamadaResolvidaVariavel.hashArquivo, entidadeChamadaResolvidaVariavel.linha, entidadeChamadaResolvidaVariavel.simbolo);
560
582
  }
561
- if (entidadeChamada.constructor.name === 'AcessoMetodoOuPropriedade') {
583
+ if (entidadeChamada.constructor === construtos_1.AcessoMetodoOuPropriedade) {
562
584
  return this.resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamada);
563
585
  }
564
586
  return entidadeChamada;
@@ -947,8 +969,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
947
969
  if (tipoDicionario !== 'dicionário') {
948
970
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é um dicionário. Tipo resolvido: ${tipoDicionario}.`);
949
971
  }
950
- this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelChave.lexema, 'qualquer'));
951
- this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelValor.lexema, 'qualquer'));
972
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
973
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
952
974
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
953
975
  const corpo = this.resolverDeclaracao();
954
976
  return {
@@ -980,7 +1002,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
980
1002
  if (tipoVetor.endsWith('[]')) {
981
1003
  tipoVariavelIteracao = tipoVetor.slice(0, -2);
982
1004
  }
983
- this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
1005
+ this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
984
1006
  // TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
985
1007
  const corpo = this.resolverDeclaracao();
986
1008
  return {
@@ -1245,7 +1267,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1245
1267
  default:
1246
1268
  break;
1247
1269
  }
1248
- this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloNomeVariavel.lexema, tipoInicializacao));
1270
+ this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloNomeVariavel.lexema, tipoInicializacao));
1249
1271
  const blocoCorpo = this.blocoEscopo();
1250
1272
  return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
1251
1273
  }
@@ -1259,7 +1281,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1259
1281
  const inicializador = this.expressao();
1260
1282
  const retornos = [];
1261
1283
  for (let identificador of identificadores) {
1262
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
1284
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
1263
1285
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1264
1286
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
1265
1287
  retornos.push(declaracaoVar);
@@ -1271,12 +1293,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1271
1293
  if (tipo !== 'qualquer') {
1272
1294
  return tipo;
1273
1295
  }
1274
- switch (inicializador.constructor.name) {
1275
- case 'AcessoIndiceVariavel':
1296
+ switch (inicializador.constructor) {
1297
+ case construtos_1.AcessoIndiceVariavel:
1276
1298
  const entidadeChamadaAcessoIndiceVariavel = inicializador
1277
1299
  .entidadeChamada;
1278
1300
  // Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
1279
- if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
1301
+ if (entidadeChamadaAcessoIndiceVariavel.constructor === construtos_1.AcessoIndiceVariavel) {
1280
1302
  return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
1281
1303
  }
1282
1304
  if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
@@ -1284,13 +1306,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1284
1306
  }
1285
1307
  // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
1286
1308
  return 'qualquer';
1287
- case 'Chamada':
1309
+ case construtos_1.Chamada:
1288
1310
  const entidadeChamadaChamada = inicializador.entidadeChamada;
1289
- switch (entidadeChamadaChamada.constructor.name) {
1290
- case 'AcessoMetodo':
1311
+ switch (entidadeChamadaChamada.constructor) {
1312
+ case construtos_1.AcessoMetodo:
1291
1313
  const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
1292
1314
  return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
1293
- case 'AcessoMetodoOuPropriedade':
1315
+ case construtos_1.AcessoMetodoOuPropriedade:
1294
1316
  // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1295
1317
  // e a chamada normalmente é feita para uma primitiva.
1296
1318
  // A inferência, portanto, ocorre pelo uso da primitiva.
@@ -1301,42 +1323,70 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1301
1323
  }
1302
1324
  }
1303
1325
  throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
1304
- case 'AcessoPropriedade':
1326
+ case construtos_1.AcessoPropriedade:
1305
1327
  const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
1306
1328
  return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
1307
- case 'ArgumentoReferenciaFuncao':
1329
+ case construtos_1.ArgumentoReferenciaFuncao:
1308
1330
  // TODO: Voltar aqui se necessário.
1309
1331
  return 'qualquer';
1310
- case 'ReferenciaFuncao':
1332
+ case construtos_1.ReferenciaFuncao:
1311
1333
  const entidadeChamadaReferenciaFuncao = entidadeChamadaChamada;
1312
1334
  return entidadeChamadaReferenciaFuncao.tipo;
1313
- case 'Variavel':
1335
+ case construtos_1.Variavel:
1314
1336
  const entidadeChamadaVariavel = entidadeChamadaChamada;
1315
1337
  return entidadeChamadaVariavel.tipo;
1316
1338
  }
1317
1339
  break;
1318
- case 'FuncaoConstruto':
1340
+ case construtos_1.FuncaoConstruto:
1319
1341
  const funcaoConstruto = inicializador;
1320
1342
  return `função<${funcaoConstruto.tipo}>`;
1321
- case 'Leia':
1343
+ case construtos_1.Leia:
1322
1344
  return 'texto';
1323
- case 'Dupla':
1324
- case 'Trio':
1325
- case 'Quarteto':
1326
- case 'Quinteto':
1327
- case 'Sexteto':
1328
- case 'Septeto':
1329
- case 'Octeto':
1330
- case 'Noneto':
1331
- case 'Deceto':
1345
+ case tuplas_1.Dupla:
1346
+ case tuplas_1.Trio:
1347
+ case tuplas_1.Quarteto:
1348
+ case tuplas_1.Quinteto:
1349
+ case tuplas_1.Sexteto:
1350
+ case tuplas_1.Septeto:
1351
+ case tuplas_1.Octeto:
1352
+ case tuplas_1.Noneto:
1353
+ case tuplas_1.Deceto:
1332
1354
  return delegua_1.default.TUPLA;
1333
- case 'ImportarBiblioteca':
1334
- case 'ModuloDeclaracoes':
1335
- return 'módulo';
1336
1355
  default:
1356
+ // Construtos mapeados em `delegua-node`.
1357
+ switch (inicializador.constructor.name) {
1358
+ case 'ImportarBiblioteca':
1359
+ case 'ModuloDeclaracoes':
1360
+ return 'módulo';
1361
+ }
1337
1362
  return inicializador.tipo;
1338
1363
  }
1339
1364
  }
1365
+ resolverValorConstruto(construto) {
1366
+ if (construto instanceof construtos_1.Literal) {
1367
+ return construto.valor;
1368
+ }
1369
+ throw this.erro({ hashArquivo: construto.hashArquivo, linha: construto.linha }, `Construto do tipo ${construto.constructor.name} não possui um mapeamento de valor.`);
1370
+ }
1371
+ resolverInformacaoElementoSintaticoDeDicionario(construto) {
1372
+ let retorno;
1373
+ if (construto instanceof construtos_1.Dicionario) {
1374
+ retorno = new elemento_montao_tipos_1.ElementoMontaoTipos('dicionário');
1375
+ const subElementos = {};
1376
+ for (var i = 0; i < construto.valores.length; i++) {
1377
+ const chaveCorrespondente = this.resolverValorConstruto(construto.chaves[i]);
1378
+ const valorCorrespondente = construto.valores[i];
1379
+ subElementos[chaveCorrespondente] = this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
1380
+ }
1381
+ retorno.subElementos = subElementos;
1382
+ const endereco = this.montaoTipos.adicionarReferencia(retorno);
1383
+ retorno.endereco = endereco;
1384
+ }
1385
+ else {
1386
+ retorno = new elemento_montao_tipos_1.ElementoMontaoTipos(construto.tipo);
1387
+ }
1388
+ return retorno;
1389
+ }
1340
1390
  /**
1341
1391
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
1342
1392
  * @returns Um Construto do tipo Var.
@@ -1361,7 +1411,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1361
1411
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
1362
1412
  // Inicialização de variáveis sem valor.
1363
1413
  for (let identificador of identificadores.values()) {
1364
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1414
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
1365
1415
  retorno.push(new declaracoes_1.Var(identificador, null, tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
1366
1416
  }
1367
1417
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1377,7 +1427,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1377
1427
  }
1378
1428
  for (let [indice, identificador] of identificadores.entries()) {
1379
1429
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1380
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1430
+ if (tipo !== 'dicionário') {
1431
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
1432
+ }
1433
+ else {
1434
+ const inicializadorDicionario = inicializadores[indice];
1435
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, this.resolverInformacaoElementoSintaticoDeDicionario(inicializadorDicionario));
1436
+ }
1381
1437
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
1382
1438
  }
1383
1439
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -1395,7 +1451,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1395
1451
  const retornos = [];
1396
1452
  for (let identificador of identificadores) {
1397
1453
  // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
1398
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, 'qualquer'));
1454
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, 'qualquer'));
1399
1455
  const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1400
1456
  declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
1401
1457
  retornos.push(declaracaoConst);
@@ -1434,7 +1490,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1434
1490
  for (let [indice, identificador] of identificadores.entries()) {
1435
1491
  // Se tipo ainda não foi definido, infere.
1436
1492
  tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1437
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
1493
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
1438
1494
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
1439
1495
  }
1440
1496
  this.pilhaDecoradores = [];
@@ -1455,10 +1511,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1455
1511
  this.pilhaDecoradores = [];
1456
1512
  // Se houver chamadas recursivas à função, precisamos definir um tipo
1457
1513
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1458
- this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, 'qualquer'));
1514
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, 'qualquer'));
1459
1515
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1460
1516
  const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
1461
- this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, tipoDaFuncao));
1517
+ this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, tipoDaFuncao));
1462
1518
  const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao, decoradores);
1463
1519
  this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
1464
1520
  return funcaoDeclaracao;
@@ -1484,7 +1540,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1484
1540
  parametro.tipoDado = tipoDadoParametro;
1485
1541
  this.avancarEDevolverAnterior();
1486
1542
  }
1487
- this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
1543
+ this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
1488
1544
  parametros.push(parametro);
1489
1545
  if (parametro.abrangencia === 'multiplo')
1490
1546
  break;
@@ -1658,89 +1714,89 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1658
1714
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
1659
1715
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
1660
1716
  // Funções nativas de Delégua
1661
- this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'número'));
1662
- this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'número', true, [
1663
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
1664
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
1717
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
1718
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
1719
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
1720
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
1665
1721
  ]));
1666
- this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', true, [
1667
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1668
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1722
+ this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('algum', 'lógico', true, [
1723
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1724
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
1669
1725
  ]));
1670
- this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', true, [
1671
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1672
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1726
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar', 'qualquer', true, [
1727
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1728
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
1673
1729
  ]));
1674
- this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', true, [
1675
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1676
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1730
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarIndice', 'inteiro', true, [
1731
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1732
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
1677
1733
  ]));
1678
- this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', true, [
1679
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1680
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1734
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
1735
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1736
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
1681
1737
  ]));
1682
- this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', true, [
1683
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1684
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
1738
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
1739
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1740
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
1685
1741
  ]));
1686
- this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', true, [
1687
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1688
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1742
+ this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
1743
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1744
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
1689
1745
  ]));
1690
- this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', true, [
1691
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1692
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
1746
+ this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('incluido', 'lógico', true, [
1747
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1748
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
1693
1749
  ]));
1694
- this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', true, [
1695
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
1750
+ this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('inteiro', 'inteiro', true, [
1751
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
1696
1752
  ]));
1697
- this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', true, [
1698
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1699
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
1753
+ this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('mapear', 'qualquer[]', true, [
1754
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1755
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoMapeamento', 'função'),
1700
1756
  ]));
1701
- this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', true, [
1702
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1757
+ this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
1758
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
1703
1759
  ]));
1704
- this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', true, [
1705
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1760
+ this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
1761
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
1706
1762
  ]));
1707
- this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', true, [
1708
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1709
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
1763
+ this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('ordenar', 'qualquer[]', true, [
1764
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1765
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoOrdenacao', 'função'),
1710
1766
  ]));
1711
- this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', true, [
1712
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1713
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1767
+ this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('paraCada', 'qualquer[]', true, [
1768
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1769
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
1714
1770
  ]));
1715
- this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', true, [
1716
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1717
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
1771
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondicao', 'qualquer', true, [
1772
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1773
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
1718
1774
  ]));
1719
- this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', true, [
1720
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1775
+ this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('real', 'número', true, [
1776
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
1721
1777
  ]));
1722
- this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', true, [
1723
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1724
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
1725
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
1778
+ this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('reduzir', 'qualquer', true, [
1779
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1780
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoReducao', 'função'),
1781
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorInicial', 'qualquer'),
1726
1782
  ]));
1727
- this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', true, [
1728
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
1783
+ this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tamanho', 'inteiro', true, [
1784
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('objeto', 'qualquer'),
1729
1785
  ]));
1730
- this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', true, [
1731
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
1786
+ this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('texto', 'texto', true, [
1787
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
1732
1788
  ]));
1733
- this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', true, [
1734
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1735
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
1789
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
1790
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1791
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
1736
1792
  ]));
1737
- this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', true, [
1738
- new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
1793
+ this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
1794
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
1739
1795
  ]));
1740
1796
  // TODO: Escrever algum tipo de validação aqui.
1741
1797
  for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
1742
1798
  for (const [nomeTipo, tipo] of Object.entries(tipos)) {
1743
- this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeTipo, tipo));
1799
+ this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeTipo, tipo));
1744
1800
  }
1745
1801
  }
1746
1802
  }
@@ -1753,6 +1809,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1753
1809
  this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
1754
1810
  this.pilhaDecoradores = [];
1755
1811
  this.tiposDefinidosEmCodigo = {};
1812
+ this.montaoTipos = new montao_tipos_1.MontaoTipos();
1756
1813
  this.inicializarPilhaEscopos();
1757
1814
  let declaracoes = [];
1758
1815
  while (!this.estaNoFinal()) {