@designliquido/delegua 1.16.3 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +2 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +87 -12
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +4 -4
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +30 -20
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/ajuda-como-construto.d.ts +2 -2
- package/construtos/ajuda-como-construto.d.ts.map +1 -1
- package/construtos/ajuda-como-construto.js.map +1 -1
- package/declaracoes/se.d.ts +4 -7
- package/declaracoes/se.d.ts.map +1 -1
- package/declaracoes/se.js.map +1 -1
- package/declaracoes/var.d.ts +2 -2
- package/declaracoes/var.d.ts.map +1 -1
- package/declaracoes/var.js.map +1 -1
- package/interfaces/declaracoes/caminho-se-senao-interface.d.ts +7 -0
- package/interfaces/declaracoes/caminho-se-senao-interface.d.ts.map +1 -0
- package/interfaces/declaracoes/caminho-se-senao-interface.js +3 -0
- package/interfaces/declaracoes/caminho-se-senao-interface.js.map +1 -0
- package/interfaces/declaracoes/index.d.ts +2 -0
- package/interfaces/declaracoes/index.d.ts.map +1 -0
- package/interfaces/declaracoes/index.js +18 -0
- package/interfaces/declaracoes/index.js.map +1 -0
- package/interfaces/interpretador-interface.d.ts +1 -1
- package/interfaces/interpretador-interface.d.ts.map +1 -1
- package/interpretador/argumento-interface.d.ts +1 -1
- package/interpretador/argumento-interface.d.ts.map +1 -1
- package/interpretador/estruturas/chamavel.d.ts +1 -1
- package/interpretador/estruturas/chamavel.d.ts.map +1 -1
- package/interpretador/estruturas/chamavel.js +3 -0
- package/interpretador/estruturas/chamavel.js.map +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts +2 -2
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +2 -2
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/estruturas/funcao-padrao.d.ts +2 -2
- package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
- package/interpretador/estruturas/funcao-padrao.js +4 -2
- package/interpretador/estruturas/funcao-padrao.js.map +1 -1
- package/interpretador/estruturas/metodo-polimorfico.d.ts +1 -1
- package/interpretador/estruturas/metodo-polimorfico.d.ts.map +1 -1
- package/interpretador/estruturas/metodo-polimorfico.js +2 -2
- package/interpretador/estruturas/metodo-polimorfico.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +18 -11
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +100 -230
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +2 -6
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +126 -11
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +20 -1
- package/lexador/lexador.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +2 -86
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/delegua.d.ts +1 -0
- package/tipos-de-simbolos/delegua.d.ts.map +1 -1
- package/tipos-de-simbolos/delegua.js +1 -0
- package/tipos-de-simbolos/delegua.js.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.js +1 -1
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/umd/delegua.js +296 -357
|
@@ -30,14 +30,16 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
|
|
|
30
30
|
* recomendado para uso em execuções que ocorrem no navegador de internet.
|
|
31
31
|
*/
|
|
32
32
|
class InterpretadorBase {
|
|
33
|
-
constructor(diretorioBase, performance = false, funcaoDeRetorno =
|
|
33
|
+
constructor(diretorioBase, performance = false, funcaoDeRetorno = undefined, funcaoDeRetornoMesmaLinha = undefined) {
|
|
34
34
|
this.resultadoInterpretador = [];
|
|
35
|
+
this.linhaDeclaracaoAtual = -1;
|
|
36
|
+
this.hashArquivoDeclaracaoAtual = -1;
|
|
35
37
|
this.classeAtualEmExecucao = null;
|
|
36
|
-
this.funcaoDeRetorno =
|
|
37
|
-
this.funcaoDeRetornoMesmaLinha =
|
|
38
|
-
this.interfaceDeEntrada =
|
|
39
|
-
this.interfaceEntradaSaida =
|
|
40
|
-
this.funcaoVerificarIteracao =
|
|
38
|
+
this.funcaoDeRetorno = undefined;
|
|
39
|
+
this.funcaoDeRetornoMesmaLinha = undefined;
|
|
40
|
+
this.interfaceDeEntrada = undefined; // Originalmente é `readline.Interface`
|
|
41
|
+
this.interfaceEntradaSaida = undefined;
|
|
42
|
+
this.funcaoVerificarIteracao = undefined;
|
|
41
43
|
this.emDeclaracaoTente = false;
|
|
42
44
|
// typeName → methodName → DeleguaFuncao
|
|
43
45
|
this.extensoesGlobais = new Map();
|
|
@@ -60,8 +62,12 @@ class InterpretadorBase {
|
|
|
60
62
|
this.diretorioBase = diretorioBase;
|
|
61
63
|
this.performance = performance;
|
|
62
64
|
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
65
|
+
const _process = globalThis.process;
|
|
63
66
|
this.funcaoDeRetornoMesmaLinha =
|
|
64
|
-
funcaoDeRetornoMesmaLinha ||
|
|
67
|
+
funcaoDeRetornoMesmaLinha ||
|
|
68
|
+
(_process?.stdout?.write
|
|
69
|
+
? _process.stdout.write.bind(_process.stdout)
|
|
70
|
+
: (texto) => console.log(texto));
|
|
65
71
|
this.erros = [];
|
|
66
72
|
this.declaracoes = [];
|
|
67
73
|
this.resultadoInterpretador = [];
|
|
@@ -92,8 +98,9 @@ class InterpretadorBase {
|
|
|
92
98
|
async cederControle(iteracoes) {
|
|
93
99
|
if (iteracoes % this.iteracoesParaCederControle === 0) {
|
|
94
100
|
await new Promise((resolve) => {
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
const _setImmediate = globalThis.setImmediate;
|
|
102
|
+
if (_setImmediate) {
|
|
103
|
+
_setImmediate(resolve);
|
|
97
104
|
}
|
|
98
105
|
else {
|
|
99
106
|
setTimeout(resolve, 0);
|
|
@@ -248,10 +255,10 @@ class InterpretadorBase {
|
|
|
248
255
|
const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
|
|
249
256
|
return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
|
|
250
257
|
}
|
|
251
|
-
async visitarExpressaoAtribuicaoPorIndicesMatriz(
|
|
258
|
+
async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
|
|
252
259
|
throw new Error('Método não implementado.');
|
|
253
260
|
}
|
|
254
|
-
async visitarExpressaoAcessoElementoMatriz(
|
|
261
|
+
async visitarExpressaoAcessoElementoMatriz(_) {
|
|
255
262
|
throw new Error('Método não implementado.');
|
|
256
263
|
}
|
|
257
264
|
textoParaRegex(texto) {
|
|
@@ -266,14 +273,14 @@ class InterpretadorBase {
|
|
|
266
273
|
visitarExpressaoExpressaoRegular(expressao) {
|
|
267
274
|
return Promise.resolve(this.textoParaRegex(expressao.valor));
|
|
268
275
|
}
|
|
269
|
-
visitarExpressaoTipoDe(
|
|
276
|
+
visitarExpressaoTipoDe(_) {
|
|
270
277
|
throw new Error('Método não implementado.');
|
|
271
278
|
}
|
|
272
279
|
async visitarExpressaoFalhar(expressao) {
|
|
273
280
|
const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
|
|
274
281
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
|
|
275
282
|
}
|
|
276
|
-
async visitarExpressaoFimPara(
|
|
283
|
+
async visitarExpressaoFimPara(_) {
|
|
277
284
|
throw new Error('Método não implementado.');
|
|
278
285
|
}
|
|
279
286
|
async visitarExpressaoReferenciaFuncao(expressao) {
|
|
@@ -342,6 +349,9 @@ class InterpretadorBase {
|
|
|
342
349
|
*/
|
|
343
350
|
async resolverInterpolacoes(textoOriginal, linha) {
|
|
344
351
|
const variaveis = textoOriginal.match(this.regexInterpolacao);
|
|
352
|
+
if (!variaveis) {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
345
355
|
return await Promise.all(variaveis.map(async (s) => {
|
|
346
356
|
const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
|
|
347
357
|
const microLexador = this.microLexador.mapear(expressaoInterpolacao);
|
|
@@ -556,6 +566,9 @@ class InterpretadorBase {
|
|
|
556
566
|
}
|
|
557
567
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
558
568
|
}
|
|
569
|
+
converterParaBigInt(valor) {
|
|
570
|
+
return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
|
|
571
|
+
}
|
|
559
572
|
async visitarExpressaoBinaria(expressao) {
|
|
560
573
|
const esquerda = await this.avaliar(expressao.esquerda);
|
|
561
574
|
const direita = await this.avaliar(expressao.direita);
|
|
@@ -567,7 +580,7 @@ class InterpretadorBase {
|
|
|
567
580
|
const nomeOperador = 'operador' + expressao.operador.lexema;
|
|
568
581
|
const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
|
|
569
582
|
if (metodoOperador) {
|
|
570
|
-
const
|
|
583
|
+
const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
|
|
571
584
|
const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
|
|
572
585
|
? direita
|
|
573
586
|
: {
|
|
@@ -575,7 +588,7 @@ class InterpretadorBase {
|
|
|
575
588
|
valor: valorDireito,
|
|
576
589
|
imutavel: false,
|
|
577
590
|
};
|
|
578
|
-
return await
|
|
591
|
+
return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
|
|
579
592
|
}
|
|
580
593
|
}
|
|
581
594
|
const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
|
|
@@ -589,13 +602,7 @@ class InterpretadorBase {
|
|
|
589
602
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
590
603
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
591
604
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
592
|
-
|
|
593
|
-
? valorEsquerdo
|
|
594
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
595
|
-
const dir = typeof valorDireito === 'bigint'
|
|
596
|
-
? valorDireito
|
|
597
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
598
|
-
return esq ** dir;
|
|
605
|
+
return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
|
|
599
606
|
}
|
|
600
607
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
601
608
|
return resultadoExponenciacao;
|
|
@@ -622,13 +629,7 @@ class InterpretadorBase {
|
|
|
622
629
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
623
630
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
624
631
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
625
|
-
|
|
626
|
-
? valorEsquerdo
|
|
627
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
628
|
-
const dir = typeof valorDireito === 'bigint'
|
|
629
|
-
? valorDireito
|
|
630
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
631
|
-
return esq - dir;
|
|
632
|
+
return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
|
|
632
633
|
}
|
|
633
634
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
634
635
|
case delegua_1.default.ADICAO:
|
|
@@ -639,13 +640,13 @@ class InterpretadorBase {
|
|
|
639
640
|
}
|
|
640
641
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
641
642
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
642
|
-
const
|
|
643
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
643
644
|
? valorEsquerdo
|
|
644
645
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
645
|
-
const
|
|
646
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
646
647
|
? valorDireito
|
|
647
648
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
648
|
-
return
|
|
649
|
+
return valorResolvidoEsquerdo + valorResolvidoDireito;
|
|
649
650
|
}
|
|
650
651
|
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
651
652
|
this.tiposNumericos.includes(tipoDireito)) {
|
|
@@ -675,13 +676,13 @@ class InterpretadorBase {
|
|
|
675
676
|
}
|
|
676
677
|
// Retorna BigInt se qualquer operando for BigInt
|
|
677
678
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
678
|
-
const
|
|
679
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
679
680
|
? valorEsquerdo
|
|
680
681
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
681
|
-
const
|
|
682
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
682
683
|
? valorDireito
|
|
683
684
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
684
|
-
return
|
|
685
|
+
return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
|
|
685
686
|
}
|
|
686
687
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
687
688
|
case delegua_1.default.MULTIPLICACAO:
|
|
@@ -690,13 +691,13 @@ class InterpretadorBase {
|
|
|
690
691
|
if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
|
|
691
692
|
tipoEsquerdo !== delegua_2.default.TEXTO &&
|
|
692
693
|
tipoDireito !== delegua_2.default.TEXTO) {
|
|
693
|
-
const
|
|
694
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
694
695
|
? valorEsquerdo
|
|
695
696
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
696
|
-
const
|
|
697
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
697
698
|
? valorDireito
|
|
698
699
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
699
|
-
return
|
|
700
|
+
return valorResolvidoEsquerdo * valorResolvidoDireito;
|
|
700
701
|
}
|
|
701
702
|
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
702
703
|
tipoDireito === delegua_2.default.TEXTO) {
|
|
@@ -743,13 +744,7 @@ class InterpretadorBase {
|
|
|
743
744
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
744
745
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
745
746
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
746
|
-
|
|
747
|
-
? valorEsquerdo
|
|
748
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
749
|
-
const dir = typeof valorDireito === 'bigint'
|
|
750
|
-
? valorDireito
|
|
751
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
752
|
-
return esq & dir;
|
|
747
|
+
return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
|
|
753
748
|
}
|
|
754
749
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
755
750
|
case delegua_1.default.CIRCUMFLEXO:
|
|
@@ -759,13 +754,7 @@ class InterpretadorBase {
|
|
|
759
754
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
760
755
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
761
756
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
762
|
-
|
|
763
|
-
? valorEsquerdo
|
|
764
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
765
|
-
const dir = typeof valorDireito === 'bigint'
|
|
766
|
-
? valorDireito
|
|
767
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
768
|
-
return esq ^ dir;
|
|
757
|
+
return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
|
|
769
758
|
}
|
|
770
759
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
771
760
|
case delegua_1.default.BIT_OR:
|
|
@@ -775,45 +764,21 @@ class InterpretadorBase {
|
|
|
775
764
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
776
765
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
777
766
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
778
|
-
|
|
779
|
-
? valorEsquerdo
|
|
780
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
781
|
-
const dir = typeof valorDireito === 'bigint'
|
|
782
|
-
? valorDireito
|
|
783
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
784
|
-
return esq | dir;
|
|
767
|
+
return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
|
|
785
768
|
}
|
|
786
769
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
787
770
|
case delegua_1.default.MENOR_MENOR:
|
|
788
771
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
789
772
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
typeof valorDireito === 'bigint' ||
|
|
793
|
-
tamanhoDeslocamentoEsquerda >= 32) {
|
|
794
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
795
|
-
? valorEsquerdo
|
|
796
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
797
|
-
const dir = typeof valorDireito === 'bigint'
|
|
798
|
-
? valorDireito
|
|
799
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
800
|
-
return esq << dir;
|
|
773
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
774
|
+
return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
|
|
801
775
|
}
|
|
802
776
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
803
777
|
case delegua_1.default.MAIOR_MAIOR:
|
|
804
778
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
805
779
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
typeof valorDireito === 'bigint' ||
|
|
809
|
-
tamanhoDeslocamentoDireita >= 32) {
|
|
810
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
811
|
-
? valorEsquerdo
|
|
812
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
813
|
-
const dir = typeof valorDireito === 'bigint'
|
|
814
|
-
? valorDireito
|
|
815
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
816
|
-
return esq >> dir;
|
|
780
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
781
|
+
return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
|
|
817
782
|
}
|
|
818
783
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
819
784
|
case delegua_1.default.DIFERENTE:
|
|
@@ -846,7 +811,7 @@ class InterpretadorBase {
|
|
|
846
811
|
: undefined;
|
|
847
812
|
let valor = await this.avaliar(variavelArgumento);
|
|
848
813
|
argumentos.push({
|
|
849
|
-
nome: nomeArgumento,
|
|
814
|
+
nome: nomeArgumento ?? null,
|
|
850
815
|
valor,
|
|
851
816
|
});
|
|
852
817
|
}
|
|
@@ -915,8 +880,8 @@ class InterpretadorBase {
|
|
|
915
880
|
// mesmo que esteja tudo certo com `DeleguaFuncao`,
|
|
916
881
|
// então precisamos testar o nome do construtor também.
|
|
917
882
|
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
918
|
-
entidadeChamada.constructor
|
|
919
|
-
entidadeChamada.constructor
|
|
883
|
+
entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
|
|
884
|
+
entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
|
|
920
885
|
const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
|
|
921
886
|
return retornoEntidadeChamada;
|
|
922
887
|
}
|
|
@@ -962,10 +927,6 @@ class InterpretadorBase {
|
|
|
962
927
|
indice = this.resolverValor(await this.avaliar(expressao.indice));
|
|
963
928
|
}
|
|
964
929
|
switch (expressao.alvo.constructor) {
|
|
965
|
-
case construtos_1.Variavel:
|
|
966
|
-
const alvoVariavel = expressao.alvo;
|
|
967
|
-
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
968
|
-
break;
|
|
969
930
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
970
931
|
// Nunca será método aqui: apenas propriedade.
|
|
971
932
|
const alvoPropriedade = expressao.alvo;
|
|
@@ -977,8 +938,12 @@ class InterpretadorBase {
|
|
|
977
938
|
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
978
939
|
}
|
|
979
940
|
break;
|
|
941
|
+
case construtos_1.Variavel:
|
|
942
|
+
const alvoVariavel = expressao.alvo;
|
|
943
|
+
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
944
|
+
break;
|
|
980
945
|
default:
|
|
981
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(
|
|
946
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
|
|
982
947
|
}
|
|
983
948
|
return valorResolvido;
|
|
984
949
|
}
|
|
@@ -1070,10 +1035,10 @@ class InterpretadorBase {
|
|
|
1070
1035
|
const declaracaoInicializador = Array.isArray(declaracao.inicializador)
|
|
1071
1036
|
? declaracao.inicializador[0]
|
|
1072
1037
|
: declaracao.inicializador;
|
|
1073
|
-
if (declaracaoInicializador !== null) {
|
|
1038
|
+
if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
|
|
1074
1039
|
await this.avaliar(declaracaoInicializador);
|
|
1075
1040
|
}
|
|
1076
|
-
let retornoExecucao;
|
|
1041
|
+
let retornoExecucao = undefined;
|
|
1077
1042
|
let iteracoes = 0;
|
|
1078
1043
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
|
|
1079
1044
|
if (declaracao.condicao !== null &&
|
|
@@ -1087,7 +1052,7 @@ class InterpretadorBase {
|
|
|
1087
1052
|
return null;
|
|
1088
1053
|
}
|
|
1089
1054
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1090
|
-
retornoExecucao =
|
|
1055
|
+
retornoExecucao = undefined;
|
|
1091
1056
|
}
|
|
1092
1057
|
}
|
|
1093
1058
|
catch (erro) {
|
|
@@ -1098,15 +1063,19 @@ class InterpretadorBase {
|
|
|
1098
1063
|
});
|
|
1099
1064
|
return Promise.reject(erro);
|
|
1100
1065
|
}
|
|
1101
|
-
if (declaracao.incrementar
|
|
1066
|
+
if (declaracao.incrementar) {
|
|
1102
1067
|
await this.avaliar(declaracao.incrementar);
|
|
1103
1068
|
}
|
|
1104
1069
|
}
|
|
1105
1070
|
return retornoExecucao;
|
|
1106
1071
|
}
|
|
1107
|
-
|
|
1072
|
+
/**
|
|
1073
|
+
* Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
|
|
1074
|
+
* @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
|
|
1075
|
+
* @returns {Promise<any>} O resultado da execução da declaração.
|
|
1076
|
+
*/
|
|
1108
1077
|
async visitarDeclaracaoParaCada(declaracao) {
|
|
1109
|
-
let retornoExecucao;
|
|
1078
|
+
let retornoExecucao = undefined;
|
|
1110
1079
|
// Posição atual precisa ser reiniciada, pois pode estar dentro de outro
|
|
1111
1080
|
// laço de repetição.
|
|
1112
1081
|
declaracao.posicaoAtual = 0;
|
|
@@ -1144,7 +1113,7 @@ class InterpretadorBase {
|
|
|
1144
1113
|
return null;
|
|
1145
1114
|
}
|
|
1146
1115
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1147
|
-
retornoExecucao =
|
|
1116
|
+
retornoExecucao = undefined;
|
|
1148
1117
|
}
|
|
1149
1118
|
declaracao.posicaoAtual++;
|
|
1150
1119
|
}
|
|
@@ -1170,19 +1139,20 @@ class InterpretadorBase {
|
|
|
1170
1139
|
if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
|
|
1171
1140
|
return await this.executar(declaracao.caminhoEntao);
|
|
1172
1141
|
}
|
|
1173
|
-
|
|
1174
|
-
|
|
1142
|
+
const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
|
|
1143
|
+
for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
|
|
1144
|
+
const atual = declaracaoCaminhosSeSenao[i];
|
|
1175
1145
|
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
1176
1146
|
return await this.executar(atual.caminho);
|
|
1177
1147
|
}
|
|
1178
1148
|
}
|
|
1179
|
-
if (declaracao.caminhoSenao
|
|
1149
|
+
if (declaracao.caminhoSenao) {
|
|
1180
1150
|
return await this.executar(declaracao.caminhoSenao);
|
|
1181
1151
|
}
|
|
1182
1152
|
return null;
|
|
1183
1153
|
}
|
|
1184
1154
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
1185
|
-
let retornoExecucao;
|
|
1155
|
+
let retornoExecucao = undefined;
|
|
1186
1156
|
let iteracoes = 0;
|
|
1187
1157
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
|
|
1188
1158
|
this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
@@ -1193,7 +1163,7 @@ class InterpretadorBase {
|
|
|
1193
1163
|
return null;
|
|
1194
1164
|
}
|
|
1195
1165
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1196
|
-
retornoExecucao =
|
|
1166
|
+
retornoExecucao = undefined;
|
|
1197
1167
|
}
|
|
1198
1168
|
}
|
|
1199
1169
|
catch (erro) {
|
|
@@ -1248,17 +1218,17 @@ class InterpretadorBase {
|
|
|
1248
1218
|
}
|
|
1249
1219
|
}
|
|
1250
1220
|
async visitarDeclaracaoFazer(declaracao) {
|
|
1251
|
-
let retornoExecucao;
|
|
1221
|
+
let retornoExecucao = undefined;
|
|
1252
1222
|
let iteracoes = 0;
|
|
1253
1223
|
do {
|
|
1254
1224
|
try {
|
|
1255
1225
|
await this.cederControle(++iteracoes);
|
|
1256
1226
|
retornoExecucao = await this.executar(declaracao.caminhoFazer);
|
|
1257
1227
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
|
|
1258
|
-
return
|
|
1228
|
+
return undefined;
|
|
1259
1229
|
}
|
|
1260
1230
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1261
|
-
retornoExecucao =
|
|
1231
|
+
retornoExecucao = undefined;
|
|
1262
1232
|
}
|
|
1263
1233
|
}
|
|
1264
1234
|
catch (erro) {
|
|
@@ -1300,7 +1270,7 @@ class InterpretadorBase {
|
|
|
1300
1270
|
}
|
|
1301
1271
|
}
|
|
1302
1272
|
finally {
|
|
1303
|
-
if (declaracao.caminhoFinalmente
|
|
1273
|
+
if (declaracao.caminhoFinalmente)
|
|
1304
1274
|
valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
|
|
1305
1275
|
this.emDeclaracaoTente = false;
|
|
1306
1276
|
}
|
|
@@ -1332,7 +1302,7 @@ class InterpretadorBase {
|
|
|
1332
1302
|
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
1333
1303
|
try {
|
|
1334
1304
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1335
|
-
this.funcaoDeRetornoMesmaLinha(formatoTexto);
|
|
1305
|
+
this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
|
|
1336
1306
|
return {
|
|
1337
1307
|
tipo: 'vazio',
|
|
1338
1308
|
tipoExplicito: false,
|
|
@@ -1355,7 +1325,7 @@ class InterpretadorBase {
|
|
|
1355
1325
|
async visitarDeclaracaoEscreva(declaracao) {
|
|
1356
1326
|
try {
|
|
1357
1327
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1358
|
-
this.funcaoDeRetorno(formatoTexto);
|
|
1328
|
+
this.funcaoDeRetorno?.(formatoTexto);
|
|
1359
1329
|
return {
|
|
1360
1330
|
tipo: 'vazio',
|
|
1361
1331
|
tipoExplicito: false,
|
|
@@ -1399,7 +1369,7 @@ class InterpretadorBase {
|
|
|
1399
1369
|
}
|
|
1400
1370
|
async avaliacaoDeclaracaoVarOuConst(declaracao) {
|
|
1401
1371
|
let valorOuOutraVariavel = null;
|
|
1402
|
-
if (declaracao.inicializador
|
|
1372
|
+
if (declaracao.inicializador != null) {
|
|
1403
1373
|
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
1404
1374
|
}
|
|
1405
1375
|
let valorFinal = null;
|
|
@@ -1428,16 +1398,16 @@ class InterpretadorBase {
|
|
|
1428
1398
|
*/
|
|
1429
1399
|
async visitarDeclaracaoConstMultiplo(declaracao) {
|
|
1430
1400
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1431
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1401
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1432
1402
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1433
1403
|
this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1434
1404
|
}
|
|
1435
1405
|
return null;
|
|
1436
1406
|
}
|
|
1437
|
-
visitarExpressaoContinua(
|
|
1407
|
+
visitarExpressaoContinua(_) {
|
|
1438
1408
|
return new quebras_1.ContinuarQuebra();
|
|
1439
1409
|
}
|
|
1440
|
-
visitarExpressaoSustar(
|
|
1410
|
+
visitarExpressaoSustar(_) {
|
|
1441
1411
|
return new quebras_1.SustarQuebra();
|
|
1442
1412
|
}
|
|
1443
1413
|
async visitarExpressaoRetornar(declaracao) {
|
|
@@ -1617,133 +1587,29 @@ class InterpretadorBase {
|
|
|
1617
1587
|
if (superClassesResolvidas.length > 0) {
|
|
1618
1588
|
this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
|
|
1619
1589
|
}
|
|
1590
|
+
const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
|
|
1591
|
+
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1592
|
+
// Por enquanto, tudo bem deixar isso aqui.
|
|
1593
|
+
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1594
|
+
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1595
|
+
return descritorTipoClasse;
|
|
1596
|
+
}
|
|
1597
|
+
resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
|
|
1620
1598
|
const metodos = {};
|
|
1621
|
-
const
|
|
1622
|
-
const obtenedores = {};
|
|
1623
|
-
const definidores = {};
|
|
1624
|
-
const obtenedoresEstaticos = {};
|
|
1625
|
-
const definidoresEstaticos = {};
|
|
1626
|
-
const metodosAbstratos = [];
|
|
1627
|
-
const acessoMetodos = {};
|
|
1628
|
-
const acessoPropriedades = {};
|
|
1629
|
-
const definirMetodos = declaracao.metodos;
|
|
1630
|
-
for (let i = 0; i < declaracao.metodos.length; i++) {
|
|
1631
|
-
const metodoAtual = definirMetodos[i];
|
|
1599
|
+
for (const metodoAtual of declaracao.metodos) {
|
|
1632
1600
|
const nomeMetodo = metodoAtual.simbolo.lexema;
|
|
1633
|
-
// Registrar nível de acesso do método.
|
|
1634
|
-
if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
|
|
1635
|
-
acessoMetodos[nomeMetodo] = metodoAtual.acesso;
|
|
1636
|
-
}
|
|
1637
|
-
// Métodos abstratos: registrar apenas o nome, não criar função executável.
|
|
1638
|
-
if (metodoAtual.abstrato) {
|
|
1639
|
-
metodosAbstratos.push(nomeMetodo);
|
|
1640
|
-
continue;
|
|
1641
|
-
}
|
|
1642
1601
|
const eInicializador = nomeMetodo === 'construtor';
|
|
1643
1602
|
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
|
|
1644
1603
|
funcao.documentacao = metodoAtual.documentacao;
|
|
1645
|
-
|
|
1646
|
-
const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
|
|
1647
|
-
if (metodoAtual.eObtenedor) {
|
|
1648
|
-
if (ehEstatico) {
|
|
1649
|
-
obtenedoresEstaticos[nomeMetodo] = funcao;
|
|
1650
|
-
}
|
|
1651
|
-
else {
|
|
1652
|
-
obtenedores[nomeMetodo] = funcao;
|
|
1653
|
-
}
|
|
1654
|
-
continue;
|
|
1655
|
-
}
|
|
1656
|
-
if (metodoAtual.eDefinidor) {
|
|
1657
|
-
if (ehEstatico) {
|
|
1658
|
-
definidoresEstaticos[nomeMetodo] = funcao;
|
|
1659
|
-
}
|
|
1660
|
-
else {
|
|
1661
|
-
definidores[nomeMetodo] = funcao;
|
|
1662
|
-
}
|
|
1663
|
-
continue;
|
|
1664
|
-
}
|
|
1665
|
-
const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
|
|
1666
|
-
if (destino[nomeMetodo]) {
|
|
1667
|
-
if (!Array.isArray(destino[nomeMetodo])) {
|
|
1668
|
-
destino[nomeMetodo] = [destino[nomeMetodo]];
|
|
1669
|
-
}
|
|
1670
|
-
destino[nomeMetodo].push(funcao);
|
|
1671
|
-
}
|
|
1672
|
-
else {
|
|
1673
|
-
destino[nomeMetodo] = funcao;
|
|
1674
|
-
}
|
|
1675
|
-
}
|
|
1676
|
-
// Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
|
|
1677
|
-
// Numa classe estática, todas as propriedades são tratadas como estáticas.
|
|
1678
|
-
const membrosEstaticos = {};
|
|
1679
|
-
for (const prop of declaracao.propriedades) {
|
|
1680
|
-
if (prop.estatico || declaracao.classeEstatica) {
|
|
1681
|
-
membrosEstaticos[prop.nome.lexema] = undefined;
|
|
1682
|
-
}
|
|
1683
|
-
if (prop.acesso && prop.acesso !== 'publico') {
|
|
1684
|
-
acessoPropriedades[prop.nome.lexema] = prop.acesso;
|
|
1685
|
-
}
|
|
1604
|
+
metodos[nomeMetodo] = funcao;
|
|
1686
1605
|
}
|
|
1687
1606
|
const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
|
|
1688
|
-
descritorTipoClasse.metodosEstaticos = metodosEstaticos;
|
|
1689
|
-
descritorTipoClasse.membrosEstaticos = membrosEstaticos;
|
|
1690
|
-
descritorTipoClasse.obtenedores = obtenedores;
|
|
1691
|
-
descritorTipoClasse.definidores = definidores;
|
|
1692
|
-
descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
|
|
1693
|
-
descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
|
|
1694
|
-
descritorTipoClasse.abstrata = declaracao.abstrata;
|
|
1695
|
-
descritorTipoClasse.estrangeira = declaracao.estrangeira;
|
|
1696
|
-
descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
|
|
1697
|
-
descritorTipoClasse.metodosAbstratos = metodosAbstratos;
|
|
1698
|
-
descritorTipoClasse.acessoMetodos = acessoMetodos;
|
|
1699
|
-
descritorTipoClasse.acessoPropriedades = acessoPropriedades;
|
|
1700
|
-
// Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
|
|
1701
|
-
// Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
|
|
1702
|
-
// atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
|
|
1703
1607
|
if (descritorTipoClasse.superClasses.length === 0 &&
|
|
1704
1608
|
estruturas_1.OBJETO_BASE &&
|
|
1705
1609
|
descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
|
|
1706
1610
|
descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
|
|
1707
1611
|
}
|
|
1708
|
-
// Calcular o OReM (linearização C3) após os pais estarem definidos.
|
|
1709
1612
|
descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
|
|
1710
|
-
// Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
|
|
1711
|
-
for (const misturável of mesclaResolvidas) {
|
|
1712
|
-
for (const [nome, funcao] of Object.entries(misturável.metodos)) {
|
|
1713
|
-
if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
|
|
1714
|
-
descritorTipoClasse.metodos[nome] = funcao;
|
|
1715
|
-
}
|
|
1716
|
-
}
|
|
1717
|
-
for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
|
|
1718
|
-
if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
|
|
1719
|
-
descritorTipoClasse.obtenedores[nome] = funcao;
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
for (const [nome, funcao] of Object.entries(misturável.definidores)) {
|
|
1723
|
-
if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
|
|
1724
|
-
descritorTipoClasse.definidores[nome] = funcao;
|
|
1725
|
-
}
|
|
1726
|
-
}
|
|
1727
|
-
for (const prop of misturável.propriedades) {
|
|
1728
|
-
const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
|
|
1729
|
-
if (!jaDeclarada) {
|
|
1730
|
-
descritorTipoClasse.propriedades.push(prop);
|
|
1731
|
-
}
|
|
1732
|
-
}
|
|
1733
|
-
}
|
|
1734
|
-
// Verifica se a subclasse concreta implementa todos os métodos abstratos
|
|
1735
|
-
// da(s) superclasse(s) abstrata(s).
|
|
1736
|
-
if (!declaracao.abstrata && !declaracao.estrangeira) {
|
|
1737
|
-
for (const superClasse of superClassesResolvidas) {
|
|
1738
|
-
if (superClasse.abstrata || superClasse.estrangeira) {
|
|
1739
|
-
superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
|
|
1740
|
-
}
|
|
1741
|
-
}
|
|
1742
|
-
}
|
|
1743
|
-
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1744
|
-
// Por enquanto, tudo bem deixar isso aqui.
|
|
1745
|
-
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1746
|
-
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1747
1613
|
return descritorTipoClasse;
|
|
1748
1614
|
}
|
|
1749
1615
|
/**
|
|
@@ -1790,7 +1656,8 @@ class InterpretadorBase {
|
|
|
1790
1656
|
if (!this.extensoesGlobais.has(tipoNome)) {
|
|
1791
1657
|
this.extensoesGlobais.set(tipoNome, new Map());
|
|
1792
1658
|
}
|
|
1793
|
-
this.extensoesGlobais.get(tipoNome)
|
|
1659
|
+
const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
|
|
1660
|
+
extensaoGlobal?.set(nomeMetodo, funcao);
|
|
1794
1661
|
}
|
|
1795
1662
|
else {
|
|
1796
1663
|
const hash = declaracao.hashArquivo;
|
|
@@ -1798,10 +1665,13 @@ class InterpretadorBase {
|
|
|
1798
1665
|
this.extensoesModulo.set(hash, new Map());
|
|
1799
1666
|
}
|
|
1800
1667
|
const mapa = this.extensoesModulo.get(hash);
|
|
1668
|
+
if (!mapa) {
|
|
1669
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
|
|
1670
|
+
}
|
|
1801
1671
|
if (!mapa.has(tipoNome)) {
|
|
1802
|
-
mapa
|
|
1672
|
+
mapa?.set(tipoNome, new Map());
|
|
1803
1673
|
}
|
|
1804
|
-
mapa.get(tipoNome)
|
|
1674
|
+
mapa.get(tipoNome)?.set(nomeMetodo, funcao);
|
|
1805
1675
|
}
|
|
1806
1676
|
}
|
|
1807
1677
|
}
|
|
@@ -1904,7 +1774,7 @@ class InterpretadorBase {
|
|
|
1904
1774
|
dicionario[chaveLogico] = this.resolverValor(promises[1]);
|
|
1905
1775
|
continue;
|
|
1906
1776
|
}
|
|
1907
|
-
dicionario[promises[0]] = this.resolverValor(promises[1]);
|
|
1777
|
+
dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
|
|
1908
1778
|
}
|
|
1909
1779
|
}
|
|
1910
1780
|
return dicionario;
|
|
@@ -1947,7 +1817,7 @@ class InterpretadorBase {
|
|
|
1947
1817
|
*/
|
|
1948
1818
|
async visitarDeclaracaoVarMultiplo(declaracao) {
|
|
1949
1819
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1950
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1820
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1951
1821
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1952
1822
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1953
1823
|
}
|