@designliquido/delegua 0.39.3 → 0.39.4

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 (44) hide show
  1. package/README.md +21 -9
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
  3. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico.js +93 -57
  5. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +1 -0
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +7 -4
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +1 -0
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +6 -5
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  16. package/bin/package.json +1 -1
  17. package/construtos/super.d.ts +2 -2
  18. package/construtos/super.d.ts.map +1 -1
  19. package/construtos/super.js +2 -2
  20. package/construtos/super.js.map +1 -1
  21. package/estruturas/delegua-funcao.d.ts +2 -0
  22. package/estruturas/delegua-funcao.d.ts.map +1 -1
  23. package/estruturas/delegua-funcao.js +5 -1
  24. package/estruturas/delegua-funcao.js.map +1 -1
  25. package/estruturas/descritor-tipo-classe.js +1 -1
  26. package/estruturas/descritor-tipo-classe.js.map +1 -1
  27. package/formatadores/formatador-delegua.d.ts.map +1 -1
  28. package/formatadores/formatador-delegua.js +1 -3
  29. package/formatadores/formatador-delegua.js.map +1 -1
  30. package/formatadores/formatador-pitugues.d.ts +62 -0
  31. package/formatadores/formatador-pitugues.d.ts.map +1 -0
  32. package/formatadores/formatador-pitugues.js +172 -0
  33. package/formatadores/formatador-pitugues.js.map +1 -0
  34. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  35. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -8
  36. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  37. package/interpretador/interpretador-base.d.ts +2 -8
  38. package/interpretador/interpretador-base.d.ts.map +1 -1
  39. package/interpretador/interpretador-base.js +10 -41
  40. package/interpretador/interpretador-base.js.map +1 -1
  41. package/package.json +1 -1
  42. package/tradutores/tradutor-assemblyscript.js +1 -1
  43. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  44. package/umd/delegua.js +127 -116
package/umd/delegua.js CHANGED
@@ -243,7 +243,6 @@ const construtos_1 = require("../construtos");
243
243
  const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
244
244
  const tuplas_1 = require("../construtos/tuplas");
245
245
  const declaracoes_1 = require("../declaracoes");
246
- const lexador_1 = require("../lexador");
247
246
  const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
248
247
  const inferenciador_1 = require("../inferenciador");
249
248
  const pilha_escopos_1 = require("./pilha-escopos");
@@ -430,18 +429,36 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
430
429
  return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
431
430
  case delegua_2.default.SUPER:
432
431
  const simboloSuper = this.avancarEDevolverAnterior();
433
- // Se o próximo símbolo for uma abertura de parênteses, significa que
434
- // é uma chamada ao construtor da classe ancestral (superclasse).
435
- // Se o próximo símbolo for um ponto, significa que é uma chamada
436
- // a um método da superclasse.
437
- switch (this.simbolos[this.atual].tipo) {
438
- case delegua_2.default.PARENTESE_ESQUERDO:
439
- return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_2.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
440
- default:
441
- this.consumir(delegua_2.default.PONTO, "Esperado '.' após 'super'.");
442
- const metodoSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
443
- return new construtos_1.Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
432
+ if (!this.superclasseAtual) {
433
+ throw this.erro(this.simbolos[this.atual], "'Super' usado fora de declaração de classe com herança.");
444
434
  }
435
+ return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
436
+ /* Se o próximo símbolo for uma abertura de parênteses, significa que
437
+ // é uma chamada ao construtor da classe ancestral (superclasse).
438
+ // Se o próximo símbolo for um ponto, significa que é uma chamada
439
+ // a um método da superclasse.
440
+ switch (this.simbolos[this.atual].tipo) {
441
+ case tiposDeSimbolos.PARENTESE_ESQUERDO:
442
+ return new Super(
443
+ this.hashArquivo,
444
+ simboloSuper,
445
+ new Simbolo(
446
+ tiposDeSimbolos.IDENTIFICADOR,
447
+ 'construtor',
448
+ null,
449
+ simboloSuper.linha,
450
+ this.hashArquivo
451
+ )
452
+ );
453
+ default:
454
+ this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
455
+ const metodoSuperclasse = this.consumir(
456
+ tiposDeSimbolos.IDENTIFICADOR,
457
+ 'Esperado nome do método da Superclasse.'
458
+ );
459
+ // TODO: Validar se o método existe no ancestral.
460
+ return new Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
461
+ } */
445
462
  case delegua_2.default.VERDADEIRO:
446
463
  this.avancarEDevolverAnterior();
447
464
  return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true, 'lógico');
@@ -549,6 +566,49 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
549
566
  }
550
567
  return expressao;
551
568
  }
569
+ /**
570
+ * `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
571
+ * construto antes de qualquer outra próxima etapa. Algumas validações adicionais também ocorrem aqui.
572
+ * @param {AcessoMetodoOuPropriedade} entidadeChamadaResolvida O construto original.
573
+ * @returns {Construto} O construto resolvido como um tipo mais específico.
574
+ * @see finalizarChamada
575
+ */
576
+ resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamadaResolvida) {
577
+ const construtoTipado = entidadeChamadaResolvida;
578
+ switch (entidadeChamadaResolvida.tipo) {
579
+ case delegua_1.default.DICIONARIO:
580
+ case delegua_1.default.DICIONÁRIO:
581
+ if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
582
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
583
+ }
584
+ const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
585
+ return new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
586
+ case delegua_1.default.INTEIRO:
587
+ case delegua_1.default.NUMERO:
588
+ case delegua_1.default.NÚMERO:
589
+ if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
590
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
591
+ }
592
+ const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
593
+ return new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
594
+ case delegua_1.default.TEXTO:
595
+ if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
596
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
597
+ }
598
+ const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
599
+ return new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
600
+ case delegua_1.default.VETOR:
601
+ case delegua_1.default.VETOR_NUMERO:
602
+ case delegua_1.default.VETOR_NÚMERO:
603
+ case delegua_1.default.VETOR_TEXTO:
604
+ if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
605
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
606
+ }
607
+ const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
608
+ return new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
609
+ }
610
+ return entidadeChamadaResolvida;
611
+ }
552
612
  finalizarChamada(entidadeChamada) {
553
613
  const argumentos = [];
554
614
  if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
@@ -564,44 +624,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
564
624
  // Toda chamada precisa saber de antemão qual o tipo resolvido.
565
625
  let entidadeChamadaResolvida = entidadeChamada;
566
626
  if (entidadeChamadaResolvida.constructor.name === 'AcessoMetodoOuPropriedade') {
567
- const construtoTipado = entidadeChamadaResolvida;
568
- switch (entidadeChamadaResolvida.tipo) {
569
- case delegua_1.default.DICIONARIO:
570
- case delegua_1.default.DICIONÁRIO:
571
- if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
572
- throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
573
- }
574
- const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
575
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
576
- break;
577
- case delegua_1.default.INTEIRO:
578
- case delegua_1.default.NUMERO:
579
- case delegua_1.default.NÚMERO:
580
- if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
581
- throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
582
- }
583
- const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
584
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
585
- break;
586
- case delegua_1.default.TEXTO:
587
- if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
588
- throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
589
- }
590
- const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
591
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
592
- break;
593
- case delegua_1.default.VETOR:
594
- case delegua_1.default.VETOR_NUMERO:
595
- case delegua_1.default.VETOR_NÚMERO:
596
- case delegua_1.default.VETOR_TEXTO:
597
- if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
598
- throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
599
- }
600
- const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
601
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
602
- break;
603
- }
627
+ entidadeChamadaResolvida = this.resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamadaResolvida);
604
628
  }
629
+ // TODO: Criar forma de validar tipos dos argumentos da entidade chamada.
605
630
  return new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
606
631
  }
607
632
  unario() {
@@ -727,14 +752,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
727
752
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
728
753
  const igual = this.simbolos[this.atual - 1];
729
754
  const valor = this.expressao();
730
- if (expressao instanceof construtos_1.Variavel) {
731
- return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
732
- }
733
- if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
734
- return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, expressao.objeto, expressao.simbolo, valor);
735
- }
736
- if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
737
- return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
755
+ switch (expressao.constructor.name) {
756
+ case 'Variavel':
757
+ return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
758
+ case 'AcessoMetodoOuPropriedade':
759
+ const expressaoAcessoMetodoOuPropriedade = expressao;
760
+ return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, expressaoAcessoMetodoOuPropriedade.objeto, expressaoAcessoMetodoOuPropriedade.simbolo, valor);
761
+ /* case 'Super':
762
+ const expressaoSuper = expressao as Super;
763
+ return new DefinirValor(
764
+ this.hashArquivo,
765
+ igual.linha,
766
+ expressaoSuper.
767
+ ); */
768
+ case 'AcessoIndiceVariavel':
769
+ const expressaoAcessoIndiceVariavel = expressao;
770
+ return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressaoAcessoIndiceVariavel.linha, expressaoAcessoIndiceVariavel.entidadeChamada, expressaoAcessoIndiceVariavel.indice, valor);
738
771
  }
739
772
  throw this.erro(igual, 'Tarefa de atribuição inválida');
740
773
  }
@@ -1480,6 +1513,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1480
1513
  let superClasse = null;
1481
1514
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1482
1515
  const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
1516
+ // TODO: Validar classes existentes?
1517
+ this.superclasseAtual = simboloSuperclasse.lexema;
1483
1518
  // TODO: Colocar tipo aqui?
1484
1519
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
1485
1520
  }
@@ -1516,6 +1551,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1516
1551
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
1517
1552
  const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
1518
1553
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
1554
+ this.superclasseAtual = undefined;
1519
1555
  return definicaoClasse;
1520
1556
  }
1521
1557
  /**
@@ -1630,7 +1666,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1630
1666
  }
1631
1667
  exports.AvaliadorSintatico = AvaliadorSintatico;
1632
1668
 
1633
- },{"../bibliotecas/primitivas-dicionario":18,"../bibliotecas/primitivas-numero":19,"../bibliotecas/primitivas-texto":20,"../bibliotecas/primitivas-vetor":21,"../construtos":44,"../construtos/tuplas":53,"../declaracoes":82,"../inferenciador":116,"../lexador":153,"../tipos-de-dados/delegua":161,"../tipos-de-simbolos/delegua":164,"./avaliador-sintatico-base":1,"./erro-avaliador-sintatico":7,"./informacao-escopo":9,"./pilha-escopos":12,"browser-process-hrtime":340}],3:[function(require,module,exports){
1669
+ },{"../bibliotecas/primitivas-dicionario":18,"../bibliotecas/primitivas-numero":19,"../bibliotecas/primitivas-texto":20,"../bibliotecas/primitivas-vetor":21,"../construtos":44,"../construtos/tuplas":53,"../declaracoes":82,"../inferenciador":116,"../tipos-de-dados/delegua":161,"../tipos-de-simbolos/delegua":164,"./avaliador-sintatico-base":1,"./erro-avaliador-sintatico":7,"./informacao-escopo":9,"./pilha-escopos":12,"browser-process-hrtime":340}],3:[function(require,module,exports){
1634
1670
  "use strict";
1635
1671
  var __importDefault = (this && this.__importDefault) || function (mod) {
1636
1672
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -1732,9 +1768,10 @@ class AvaliadorSintaticoEguaClassico {
1732
1768
  primario() {
1733
1769
  if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.SUPER)) {
1734
1770
  const simboloChave = this.simboloAnterior();
1735
- this.consumir(egua_classico_1.default.PONTO, "Esperado '.' após 'super'.");
1736
- const metodo = this.consumir(egua_classico_1.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
1737
- return new construtos_1.Super(this.hashArquivo, simboloChave, metodo);
1771
+ return new construtos_1.Super(this.hashArquivo, simboloChave, this.superclasseAtual);
1772
+ /* this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
1773
+ const metodo = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
1774
+ return new Super(this.hashArquivo, simboloChave, metodo); */
1738
1775
  }
1739
1776
  if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.COLCHETE_ESQUERDO)) {
1740
1777
  const valores = [];
@@ -2232,7 +2269,8 @@ class AvaliadorSintaticoEguaClassico {
2232
2269
  const nome = this.consumir(egua_classico_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
2233
2270
  let superClasse = null;
2234
2271
  if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.HERDA)) {
2235
- this.consumir(egua_classico_1.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
2272
+ const simboloSuperclasse = this.consumir(egua_classico_1.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
2273
+ this.superclasseAtual = simboloSuperclasse.lexema;
2236
2274
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
2237
2275
  }
2238
2276
  this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
@@ -2241,6 +2279,7 @@ class AvaliadorSintaticoEguaClassico {
2241
2279
  metodos.push(this.funcao('método'));
2242
2280
  }
2243
2281
  this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
2282
+ this.superclasseAtual = undefined;
2244
2283
  return new declaracoes_1.Classe(nome, superClasse, metodos);
2245
2284
  }
2246
2285
  resolverDeclaracaoForaDeBloco() {
@@ -2326,7 +2365,6 @@ class AvaliadorSintaticoPitugues {
2326
2365
  this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA);
2327
2366
  return retorno;
2328
2367
  }
2329
- //this.consumir(tiposDeSimbolos.IGUAL, "Esperado '=' após identificador em instrução 'var'.");
2330
2368
  const inicializadores = [];
2331
2369
  do {
2332
2370
  inicializadores.push(this.expressao());
@@ -2408,9 +2446,9 @@ class AvaliadorSintaticoPitugues {
2408
2446
  primario() {
2409
2447
  if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.SUPER)) {
2410
2448
  const simboloChave = this.simboloAnterior();
2411
- this.consumir(pitugues_1.default.PONTO, "Esperado '.' após 'super'.");
2412
- const metodo = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
2413
- return new construtos_1.Super(this.hashArquivo, simboloChave, metodo);
2449
+ /* this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
2450
+ const metodo = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome do método da Superclasse.'); */
2451
+ return new construtos_1.Super(this.hashArquivo, simboloChave, this.superclassseAtual);
2414
2452
  }
2415
2453
  if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.COLCHETE_ESQUERDO)) {
2416
2454
  const valores = [];
@@ -2981,7 +3019,8 @@ class AvaliadorSintaticoPitugues {
2981
3019
  const simbolo = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
2982
3020
  let superClasse = null;
2983
3021
  if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.HERDA)) {
2984
- this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3022
+ const simboloSuperclasse = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3023
+ this.superclassseAtual = simboloSuperclasse.lexema;
2985
3024
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
2986
3025
  }
2987
3026
  this.consumir(pitugues_1.default.DOIS_PONTOS, "Esperado ':' antes do escopo da classe.");
@@ -2990,6 +3029,7 @@ class AvaliadorSintaticoPitugues {
2990
3029
  this.verificarSeSimboloAtualEIgualA(pitugues_1.default.CONSTRUTOR, pitugues_1.default.FUNCAO, pitugues_1.default.FUNÇÃO)) {
2991
3030
  metodos.push(this.funcao('método', this.simbolos[this.atual - 1].tipo === pitugues_1.default.CONSTRUTOR));
2992
3031
  }
3032
+ this.superclassseAtual = undefined;
2993
3033
  return new declaracoes_1.Classe(simbolo, superClasse, metodos);
2994
3034
  }
2995
3035
  declaracaoFalhar() {
@@ -5013,11 +5053,11 @@ exports.QualTipo = QualTipo;
5013
5053
  Object.defineProperty(exports, "__esModule", { value: true });
5014
5054
  exports.Super = void 0;
5015
5055
  class Super {
5016
- constructor(hashArquivo, simboloChave, metodo) {
5056
+ constructor(hashArquivo, simboloChave, superclasse) {
5017
5057
  this.linha = Number(simboloChave.linha);
5018
5058
  this.hashArquivo = hashArquivo;
5019
5059
  this.simboloChave = simboloChave;
5020
- this.metodo = metodo;
5060
+ this.superclasse = superclasse;
5021
5061
  }
5022
5062
  async aceitar(visitante) {
5023
5063
  return Promise.resolve(visitante.visitarExpressaoSuper(this));
@@ -6210,7 +6250,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
6210
6250
  }
6211
6251
  return argumentosResolvidos;
6212
6252
  }
6213
- async chamar(visitante, argumentos) {
6253
+ resolverAmbiente(argumentos) {
6214
6254
  const ambiente = new espaco_variaveis_1.EspacoVariaveis();
6215
6255
  const parametros = this.declaracao.parametros || [];
6216
6256
  for (let i = 0; i < parametros.length; i++) {
@@ -6229,6 +6269,10 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
6229
6269
  ambiente.valores[nome] = argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
6230
6270
  }
6231
6271
  }
6272
+ return ambiente;
6273
+ }
6274
+ async chamar(visitante, argumentos) {
6275
+ const ambiente = this.resolverAmbiente(argumentos);
6232
6276
  if (this.instancia !== undefined) {
6233
6277
  ambiente.valores['isto'] = {
6234
6278
  valor: this.instancia,
@@ -6329,7 +6373,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
6329
6373
  * @returns {string} A representação da classe como texto.
6330
6374
  */
6331
6375
  paraTexto() {
6332
- let texto = `<classe ${this.simboloOriginal.lexema}`;
6376
+ let texto = `<DescritorTipoClasse ${this.simboloOriginal.lexema}`;
6333
6377
  for (let propriedade of this.propriedades) {
6334
6378
  texto += ` ${propriedade.nome.lexema}`;
6335
6379
  if (propriedade.tipo) {
@@ -7128,9 +7172,7 @@ class FormatadorDelegua {
7128
7172
  this.codigoFormatado += `${this.quebraLinha}`;
7129
7173
  }
7130
7174
  visitarExpressaoSuper(expressao) {
7131
- // TODO: `expressao.metodo` deveria ser um `Construto`, não um `Simbolo` aqui.
7132
- this.codigoFormatado += `super.${expressao.metodo.lexema}()`;
7133
- console.log(expressao);
7175
+ this.codigoFormatado += `super`;
7134
7176
  }
7135
7177
  visitarExpressaoSustar(declaracao) {
7136
7178
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}sustar${this.quebraLinha}`;
@@ -8239,20 +8281,6 @@ class InterpretadorBase {
8239
8281
  }
8240
8282
  return argumentos;
8241
8283
  }
8242
- /**
8243
- * Resolve paraâmetros da chamada de acordo com o tipo da entidade chamada.
8244
- * @param {Chamavel} entidadeChamada A entidade chamada.
8245
- * @returns Os parâmetros resolvidos.
8246
- */
8247
- resolverParametrosChamada(entidadeChamada) {
8248
- if (entidadeChamada instanceof estruturas_1.DeleguaFuncao) {
8249
- return entidadeChamada.declaracao.parametros;
8250
- }
8251
- if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
8252
- return entidadeChamada.metodos.construtor ? entidadeChamada.metodos.construtor.declaracao.parametros : [];
8253
- }
8254
- return [];
8255
- }
8256
8284
  /**
8257
8285
  * Executa uma chamada de função, método ou classe.
8258
8286
  * @param expressao A expressão chamada.
@@ -8274,10 +8302,6 @@ class InterpretadorBase {
8274
8302
  return await this.chamarMetodoPrimitiva(expressao, entidadeChamada);
8275
8303
  }
8276
8304
  const argumentos = await this.resolverArgumentosChamada(expressao);
8277
- // TODO: Aparentemente isso nunca é usado se o bloco de resolução de parâmetros,
8278
- // mais abaixo, também não é.
8279
- // Estudar remoção mais adiante.
8280
- const parametros = this.resolverParametrosChamada(entidadeChamada);
8281
8305
  const aridade = entidadeChamada.aridade ? entidadeChamada.aridade() : entidadeChamada.length;
8282
8306
  // Completar os parâmetros não preenchidos com nulos.
8283
8307
  if (argumentos.length < aridade) {
@@ -8285,22 +8309,7 @@ class InterpretadorBase {
8285
8309
  for (let i = 0; i < diferenca; i++) {
8286
8310
  argumentos.push(null);
8287
8311
  }
8288
- } /* else {
8289
- // TODO: Aparentemente isso aqui nunca funcionou.
8290
- // Avaliar de simplesmente apagar este código, e usar o que foi
8291
- // implementado em `DeleguaFuncao.chamar`.
8292
- if (
8293
- parametros &&
8294
- parametros.length > 0 &&
8295
- parametros[parametros.length - 1].abrangencia === 'multiplo'
8296
- ) {
8297
- let novosArgumentos = argumentos.slice(0, parametros.length - 1);
8298
- novosArgumentos = novosArgumentos.concat(
8299
- argumentos.slice(parametros.length - 1, argumentos.length)
8300
- );
8301
- argumentos = novosArgumentos;
8302
- }
8303
- } */
8312
+ }
8304
8313
  if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
8305
8314
  try {
8306
8315
  return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor') ? a.valor.valor : a === null || a === void 0 ? void 0 : a.valor), expressao.entidadeChamada.simbolo);
@@ -8320,6 +8329,14 @@ class InterpretadorBase {
8320
8329
  const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
8321
8330
  return retornoEntidadeChamada;
8322
8331
  }
8332
+ // Chamadas a `super()`.
8333
+ // Basicamente, chamar o construtor da superclasse.
8334
+ if (expressao.entidadeChamada instanceof construtos_1.Super) {
8335
+ const descritorSuperclasse = variavelEntidadeChamada.classe.superClasse;
8336
+ const metodoConstrutor = descritorSuperclasse.encontrarMetodo('construtor');
8337
+ await metodoConstrutor.chamar(this, argumentos);
8338
+ return null;
8339
+ }
8323
8340
  // A função chamada pode ser de uma biblioteca JavaScript.
8324
8341
  // Neste caso apenas testamos se o tipo é uma função.
8325
8342
  // TODO: Descobrir qual caso exatamente passa aqui.
@@ -8999,14 +9016,8 @@ class InterpretadorBase {
8999
9016
  return valores;
9000
9017
  }
9001
9018
  visitarExpressaoSuper(expressao) {
9002
- const superClasse = this.pilhaEscoposExecucao.obterVariavelPorNome('super');
9003
9019
  const objeto = this.pilhaEscoposExecucao.obterVariavelPorNome('isto');
9004
- const metodo = superClasse.valor.encontrarMetodo(expressao.metodo.lexema);
9005
- if (metodo === undefined) {
9006
- throw new excecoes_1.ErroEmTempoDeExecucao(expressao.metodo, 'Método chamado indefinido.', expressao.linha);
9007
- }
9008
- metodo.instancia = objeto.valor;
9009
- return metodo;
9020
+ return objeto.valor;
9010
9021
  }
9011
9022
  /**
9012
9023
  * Executa expressão de definição de variável.
@@ -25718,7 +25729,7 @@ class TradutorAssemblyScript {
25718
25729
  else if (tipoDe.valor instanceof construtos_1.Vetor)
25719
25730
  resultado += this.traduzirConstrutoVetor(tipoDe.valor);
25720
25731
  else
25721
- resultado += tipoDe.valor;
25732
+ resultado += this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor);
25722
25733
  return resultado;
25723
25734
  }
25724
25735
  traduzirConstrutoLogico(logico) {