@designliquido/delegua 0.39.2 → 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.
- package/README.md +21 -9
- package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +93 -57
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +1 -0
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +7 -4
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +1 -0
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +6 -5
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/super.d.ts +2 -2
- package/construtos/super.d.ts.map +1 -1
- package/construtos/super.js +2 -2
- package/construtos/super.js.map +1 -1
- package/estruturas/delegua-funcao.d.ts +2 -0
- package/estruturas/delegua-funcao.d.ts.map +1 -1
- package/estruturas/delegua-funcao.js +5 -1
- package/estruturas/delegua-funcao.js.map +1 -1
- package/estruturas/descritor-tipo-classe.js +1 -1
- package/estruturas/descritor-tipo-classe.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +1 -3
- package/formatadores/formatador-delegua.js.map +1 -1
- package/formatadores/formatador-pitugues.d.ts +62 -0
- package/formatadores/formatador-pitugues.d.ts.map +1 -0
- package/formatadores/formatador-pitugues.js +172 -0
- package/formatadores/formatador-pitugues.js.map +1 -0
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -8
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +2 -8
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +10 -41
- package/interpretador/interpretador-base.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-assembly-x64.js +13 -13
- package/tradutores/tradutor-assemblyscript.js +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts +8 -6
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +121 -64
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +1 -1
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +249 -181
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
|
-
|
|
434
|
-
|
|
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
|
-
|
|
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
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
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,"../
|
|
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
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
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(
|
|
2412
|
-
const metodo = this.consumir(
|
|
2413
|
-
return new construtos_1.Super(this.hashArquivo, simboloChave,
|
|
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,
|
|
5056
|
+
constructor(hashArquivo, simboloChave, superclasse) {
|
|
5017
5057
|
this.linha = Number(simboloChave.linha);
|
|
5018
5058
|
this.hashArquivo = hashArquivo;
|
|
5019
5059
|
this.simboloChave = simboloChave;
|
|
5020
|
-
this.
|
|
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
|
-
|
|
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 = `<
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
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) {
|
|
@@ -25952,40 +25963,46 @@ class TradutorJavaScript {
|
|
|
25952
25963
|
return '-';
|
|
25953
25964
|
}
|
|
25954
25965
|
}
|
|
25955
|
-
|
|
25956
|
-
|
|
25966
|
+
traduzirFuncaoOuMetodo(nomeMetodo, objetoResolvido, argumentos) {
|
|
25967
|
+
const argumentosResolvidos = [];
|
|
25968
|
+
for (const argumento of argumentos) {
|
|
25969
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
25970
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
25971
|
+
}
|
|
25972
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => atual += proximo + ', ', "");
|
|
25973
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
25974
|
+
switch (nomeMetodo) {
|
|
25957
25975
|
case 'adicionar':
|
|
25958
25976
|
case 'empilhar':
|
|
25959
|
-
return
|
|
25960
|
-
case 'concatenar':
|
|
25961
|
-
return 'concat';
|
|
25977
|
+
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
25962
25978
|
case 'fatiar':
|
|
25963
|
-
return
|
|
25979
|
+
return `${objetoResolvido}.slice(${argumentos[0]}, ${argumentos[1]})`;
|
|
25964
25980
|
case 'inclui':
|
|
25965
|
-
return
|
|
25981
|
+
return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
|
|
25966
25982
|
case 'inverter':
|
|
25967
|
-
return
|
|
25983
|
+
return `${objetoResolvido}.toReversed()`;
|
|
25968
25984
|
case 'juntar':
|
|
25969
|
-
return
|
|
25970
|
-
case 'ordenar':
|
|
25971
|
-
return 'sort';
|
|
25972
|
-
case 'removerprimeiro':
|
|
25973
|
-
return 'shift';
|
|
25974
|
-
case 'removerultimo':
|
|
25975
|
-
return 'pop';
|
|
25976
|
-
case 'tamanho':
|
|
25977
|
-
return 'length';
|
|
25985
|
+
return `${argumentosResolvidos[0]}.join(${objetoResolvido})`;
|
|
25978
25986
|
case 'maiusculo':
|
|
25979
|
-
return
|
|
25987
|
+
return `${objetoResolvido}.toUpperCase()`;
|
|
25988
|
+
case 'mapear':
|
|
25989
|
+
return `${objetoResolvido}.map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
25980
25990
|
case 'minusculo':
|
|
25981
|
-
return
|
|
25982
|
-
case '
|
|
25983
|
-
return
|
|
25984
|
-
case '
|
|
25985
|
-
return
|
|
25986
|
-
|
|
25987
|
-
return
|
|
25991
|
+
return `${objetoResolvido}.toLowerCase()`;
|
|
25992
|
+
case 'ordenar':
|
|
25993
|
+
return `${objetoResolvido}.sort()`;
|
|
25994
|
+
case 'remover':
|
|
25995
|
+
return `delete ${objetoResolvido}[${argumentosResolvidos[0]}]`;
|
|
25996
|
+
case 'removerPrimeiro':
|
|
25997
|
+
return `${objetoResolvido}.shift()`;
|
|
25998
|
+
case 'removerUltimo':
|
|
25999
|
+
return `${objetoResolvido}.pop()`;
|
|
26000
|
+
case 'somar':
|
|
26001
|
+
return `${objetoResolvido}.reduce((acumulador, valorAtual) => acumulador + valorAtual, 0)`;
|
|
26002
|
+
case 'tamanho':
|
|
26003
|
+
return `${objetoResolvido}.length`;
|
|
25988
26004
|
}
|
|
26005
|
+
return `${objetoResolvido}.${nomeMetodo}(${textoArgumentos}))`;
|
|
25989
26006
|
}
|
|
25990
26007
|
traduzirConstrutoAgrupamento(agrupamento) {
|
|
25991
26008
|
return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
|
|
@@ -26022,28 +26039,8 @@ class TradutorJavaScript {
|
|
|
26022
26039
|
}
|
|
26023
26040
|
traduzirConstrutoChamada(chamada) {
|
|
26024
26041
|
let resultado = '';
|
|
26025
|
-
const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada)}`;
|
|
26026
|
-
|
|
26027
|
-
if (instanciaClasse) {
|
|
26028
|
-
const classe = this.declaracoesDeClasses.find((declaracao) => { var _a; return ((_a = declaracao === null || declaracao === void 0 ? void 0 : declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) === retorno; });
|
|
26029
|
-
if (classe.simbolo.lexema === retorno)
|
|
26030
|
-
resultado += `new ${retorno}`;
|
|
26031
|
-
}
|
|
26032
|
-
else {
|
|
26033
|
-
resultado += retorno;
|
|
26034
|
-
}
|
|
26035
|
-
if (!retorno.endsWith('length')) {
|
|
26036
|
-
resultado += '(';
|
|
26037
|
-
}
|
|
26038
|
-
for (let parametro of chamada.argumentos) {
|
|
26039
|
-
resultado += this.dicionarioConstrutos[parametro.constructor.name](parametro) + ', ';
|
|
26040
|
-
}
|
|
26041
|
-
if (chamada.argumentos.length > 0) {
|
|
26042
|
-
resultado = resultado.slice(0, -2);
|
|
26043
|
-
}
|
|
26044
|
-
if (!retorno.endsWith('length')) {
|
|
26045
|
-
resultado += ')';
|
|
26046
|
-
}
|
|
26042
|
+
const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
|
|
26043
|
+
resultado += retorno;
|
|
26047
26044
|
return resultado;
|
|
26048
26045
|
}
|
|
26049
26046
|
traduzirConstrutoComentario(comentario) {
|
|
@@ -26093,8 +26090,28 @@ class TradutorJavaScript {
|
|
|
26093
26090
|
}
|
|
26094
26091
|
return literal.valor;
|
|
26095
26092
|
}
|
|
26096
|
-
traduzirConstrutoVariavel(variavel) {
|
|
26097
|
-
|
|
26093
|
+
traduzirConstrutoVariavel(variavel, argumentos) {
|
|
26094
|
+
const argumentosResolvidos = [];
|
|
26095
|
+
const argumentosValidados = argumentos || [];
|
|
26096
|
+
for (const argumento of argumentosValidados) {
|
|
26097
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
26098
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
26099
|
+
}
|
|
26100
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => atual += proximo + ', ', "");
|
|
26101
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
26102
|
+
switch (variavel.simbolo.lexema) {
|
|
26103
|
+
case 'texto':
|
|
26104
|
+
return `String(${textoArgumentos})`;
|
|
26105
|
+
default:
|
|
26106
|
+
const buscaClasseCorrespondente = this.declaracoesDeClasses.filter(d => d.simbolo.lexema === variavel.simbolo.lexema);
|
|
26107
|
+
if (buscaClasseCorrespondente.length === 0 && argumentosValidados.length === 0) {
|
|
26108
|
+
return `${variavel.simbolo.lexema}`;
|
|
26109
|
+
}
|
|
26110
|
+
if (buscaClasseCorrespondente.length > 0) {
|
|
26111
|
+
return `new ${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
26112
|
+
}
|
|
26113
|
+
return `${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
26114
|
+
}
|
|
26098
26115
|
}
|
|
26099
26116
|
logicaComumBlocoEscopo(declaracoes) {
|
|
26100
26117
|
let resultado = '{\n';
|
|
@@ -26361,28 +26378,72 @@ class TradutorJavaScript {
|
|
|
26361
26378
|
}
|
|
26362
26379
|
return resultado;
|
|
26363
26380
|
}
|
|
26364
|
-
|
|
26365
|
-
|
|
26366
|
-
|
|
26367
|
-
|
|
26381
|
+
// TODO: Talvez terminar (ou remover, sei lá).
|
|
26382
|
+
traduzirFuncaoAnonimaParaLambda(argumento) {
|
|
26383
|
+
return "";
|
|
26384
|
+
}
|
|
26385
|
+
traduzirAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
|
|
26386
|
+
const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
|
|
26387
|
+
const argumentosResolvidos = [];
|
|
26388
|
+
for (const argumento of argumentos) {
|
|
26389
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
26390
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
26391
|
+
}
|
|
26392
|
+
switch (nomeMetodo) {
|
|
26393
|
+
case 'adicionar':
|
|
26394
|
+
case 'empilhar':
|
|
26395
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => atual += proximo + ', ', "");
|
|
26396
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
26397
|
+
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
26398
|
+
case 'fatiar':
|
|
26399
|
+
return `${objetoResolvido}[${argumentos[0]}:${argumentos[1]}]`;
|
|
26400
|
+
case 'inclui':
|
|
26401
|
+
return `${argumentos[0]} in ${objetoResolvido}`;
|
|
26402
|
+
case 'inverter':
|
|
26403
|
+
return `reversed(${objetoResolvido})`;
|
|
26404
|
+
case 'juntar':
|
|
26405
|
+
return `${argumentos[0]}.join(${objetoResolvido})`;
|
|
26406
|
+
case 'mapear':
|
|
26407
|
+
return `list(map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])}), ${objetoResolvido})`;
|
|
26408
|
+
case 'ordenar':
|
|
26409
|
+
return `${objetoResolvido}.sort()`;
|
|
26410
|
+
case 'remover':
|
|
26411
|
+
return `del ${objetoResolvido}[${argumentos[0]}]`;
|
|
26412
|
+
case 'removerPrimeiro':
|
|
26413
|
+
return `del ${objetoResolvido}[0]`;
|
|
26414
|
+
case 'removerUltimo':
|
|
26415
|
+
return `del ${objetoResolvido}[-1]`;
|
|
26416
|
+
case 'somar':
|
|
26417
|
+
return `sum(${objetoResolvido})`;
|
|
26418
|
+
case 'tamanho':
|
|
26419
|
+
return `len(${objetoResolvido})`;
|
|
26368
26420
|
}
|
|
26369
|
-
|
|
26370
|
-
|
|
26421
|
+
}
|
|
26422
|
+
traduzirConstrutoAcessoMetodo(acessoMetodo, argumentos) {
|
|
26423
|
+
switch (acessoMetodo.objeto.constructor.name) {
|
|
26424
|
+
case 'Isto':
|
|
26425
|
+
return `this.${acessoMetodo.nomeMetodo}`;
|
|
26426
|
+
case 'Variavel':
|
|
26427
|
+
let objetoVariavel = acessoMetodo.objeto;
|
|
26428
|
+
return this.traduzirFuncaoOuMetodo(acessoMetodo.nomeMetodo, objetoVariavel.simbolo.lexema, argumentos);
|
|
26429
|
+
case 'Vetor':
|
|
26430
|
+
return this.traduzirAcessoMetodoVetor(acessoMetodo.objeto, acessoMetodo.nomeMetodo, argumentos);
|
|
26431
|
+
default:
|
|
26432
|
+
const objetoResolvido = this.dicionarioConstrutos[acessoMetodo.objeto.constructor.name](acessoMetodo.objeto);
|
|
26433
|
+
return `${objetoResolvido}.${acessoMetodo.nomeMetodo}`;
|
|
26371
26434
|
}
|
|
26372
|
-
const objetoResolvido = this.dicionarioConstrutos[acessoMetodo.objeto.constructor.name](acessoMetodo.objeto);
|
|
26373
|
-
return `${objetoResolvido}.${acessoMetodo.nomeMetodo}`;
|
|
26374
26435
|
}
|
|
26375
|
-
traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo) {
|
|
26436
|
+
traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo, argumentos) {
|
|
26376
26437
|
if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
|
|
26377
26438
|
let objetoVariavel = acessoMetodo.objeto;
|
|
26378
|
-
return `${
|
|
26439
|
+
return `${this.traduzirFuncaoOuMetodo(acessoMetodo.simbolo.lexema, objetoVariavel.simbolo.lexema, argumentos)}`;
|
|
26379
26440
|
}
|
|
26380
26441
|
return `this.${acessoMetodo.simbolo.lexema}`;
|
|
26381
26442
|
}
|
|
26382
|
-
traduzirConstrutoAcessoPropriedade(acessoMetodo) {
|
|
26443
|
+
traduzirConstrutoAcessoPropriedade(acessoMetodo, argumentos) {
|
|
26383
26444
|
if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
|
|
26384
26445
|
let objetoVariavel = acessoMetodo.objeto;
|
|
26385
|
-
return `${objetoVariavel.simbolo.lexema
|
|
26446
|
+
return `${this.traduzirFuncaoOuMetodo(objetoVariavel.simbolo.lexema, acessoMetodo.nomePropriedade, argumentos)}`;
|
|
26386
26447
|
}
|
|
26387
26448
|
return `this.${acessoMetodo.nomePropriedade}`;
|
|
26388
26449
|
}
|
|
@@ -26443,13 +26504,20 @@ class TradutorJavaScript {
|
|
|
26443
26504
|
traduzirConstrutoTipoDe(tipoDe) {
|
|
26444
26505
|
let resultado = 'typeof ';
|
|
26445
26506
|
if (!tipoDe.valor)
|
|
26446
|
-
resultado += tipoDe.valor;
|
|
26507
|
+
resultado += tipoDe.valor; // Qual o sentido disso?
|
|
26447
26508
|
else if (typeof tipoDe.valor === 'string')
|
|
26448
26509
|
resultado += `'${tipoDe.valor}'`;
|
|
26449
26510
|
else if (typeof tipoDe.valor === 'number')
|
|
26450
26511
|
resultado += tipoDe.valor;
|
|
26451
|
-
else
|
|
26452
|
-
|
|
26512
|
+
else {
|
|
26513
|
+
// Talvez isso seja uma péssima ideia.
|
|
26514
|
+
// Pensar em algo melhor.
|
|
26515
|
+
let alvoTipoDe = String(this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor));
|
|
26516
|
+
if (alvoTipoDe.startsWith('new')) {
|
|
26517
|
+
alvoTipoDe = alvoTipoDe.slice(4, -2);
|
|
26518
|
+
}
|
|
26519
|
+
resultado += `${alvoTipoDe}`;
|
|
26520
|
+
}
|
|
26453
26521
|
return resultado;
|
|
26454
26522
|
}
|
|
26455
26523
|
traduzirDeclaracaoFalhar(falhar) {
|
|
@@ -26703,6 +26771,7 @@ class TradutorPython {
|
|
|
26703
26771
|
const indice = this.dicionarioConstrutos[acessoIndiceVariavel.indice.constructor.name](acessoIndiceVariavel.indice);
|
|
26704
26772
|
return `${entidade}[${indice}]`;
|
|
26705
26773
|
}
|
|
26774
|
+
// TODO: Talvez terminar (ou remover, sei lá).
|
|
26706
26775
|
traduzirFuncaoAnonimaParaLambda(argumento) {
|
|
26707
26776
|
return "";
|
|
26708
26777
|
}
|
|
@@ -26895,7 +26964,6 @@ class TradutorPython {
|
|
|
26895
26964
|
return `${variavel.simbolo.lexema}`;
|
|
26896
26965
|
}
|
|
26897
26966
|
return `${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
26898
|
-
// return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
|
|
26899
26967
|
}
|
|
26900
26968
|
}
|
|
26901
26969
|
traduzirConstrutoVetor(vetor) {
|