@designliquido/delegua 1.16.3 → 1.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +55 -20
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +68 -11
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +433 -62
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +9 -0
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +30 -0
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +31 -0
- package/bibliotecas/primitivas-dicionario.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/estilizador/quebrador-linha.d.ts.map +1 -1
- package/estilizador/quebrador-linha.js +13 -0
- package/estilizador/quebrador-linha.js.map +1 -1
- package/estilizador/regras/index.d.ts +1 -0
- package/estilizador/regras/index.d.ts.map +1 -1
- package/estilizador/regras/index.js +1 -0
- package/estilizador/regras/index.js.map +1 -1
- package/estilizador/regras/regra-convencao-nomenclatura.d.ts +3 -0
- package/estilizador/regras/regra-convencao-nomenclatura.d.ts.map +1 -1
- package/estilizador/regras/regra-convencao-nomenclatura.js +34 -14
- package/estilizador/regras/regra-convencao-nomenclatura.js.map +1 -1
- package/estilizador/regras/regra-explicitar-tipos-parametros.d.ts +16 -0
- package/estilizador/regras/regra-explicitar-tipos-parametros.d.ts.map +1 -0
- package/estilizador/regras/regra-explicitar-tipos-parametros.js +50 -0
- package/estilizador/regras/regra-explicitar-tipos-parametros.js.map +1 -0
- package/formatadores/formatador-delegua.d.ts +1 -0
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +9 -3
- package/formatadores/formatador-delegua.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/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +60 -107
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +435 -336
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.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 +116 -232
- 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/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.js +71 -19
- package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +34 -6
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts.map +1 -1
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.js +44 -6
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.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/tipos-de-simbolos/portugol-ipt.d.ts +43 -19
- package/tipos-de-simbolos/portugol-ipt.d.ts.map +1 -1
- package/tipos-de-simbolos/portugol-ipt.js +59 -19
- package/tipos-de-simbolos/portugol-ipt.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/tradutores/tradutor-portugol-ipt.d.ts +34 -12
- package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
- package/tradutores/tradutor-portugol-ipt.js +309 -19
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/umd/delegua.js +1748 -857
|
@@ -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);
|
|
@@ -127,10 +134,14 @@ class InterpretadorBase {
|
|
|
127
134
|
return this.resolverNomeObjectoAcessado((objetoAcessado as AcessoIndiceVariavel).entidadeChamada); */
|
|
128
135
|
case construtos_1.Chamada:
|
|
129
136
|
return this.resolverNomeObjectoAcessado(objetoAcessado.entidadeChamada);
|
|
137
|
+
case construtos_1.Agrupamento:
|
|
138
|
+
return this.resolverNomeObjectoAcessado(objetoAcessado.expressao);
|
|
130
139
|
case construtos_1.Constante:
|
|
131
140
|
return objetoAcessado.simbolo.lexema;
|
|
141
|
+
case construtos_1.AcessoMetodo:
|
|
132
142
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
133
143
|
case construtos_1.AcessoIndiceVariavel:
|
|
144
|
+
case construtos_1.Binario:
|
|
134
145
|
case construtos_1.Dicionario:
|
|
135
146
|
case construtos_1.Leia:
|
|
136
147
|
case construtos_1.Literal:
|
|
@@ -248,10 +259,10 @@ class InterpretadorBase {
|
|
|
248
259
|
const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
|
|
249
260
|
return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
|
|
250
261
|
}
|
|
251
|
-
async visitarExpressaoAtribuicaoPorIndicesMatriz(
|
|
262
|
+
async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
|
|
252
263
|
throw new Error('Método não implementado.');
|
|
253
264
|
}
|
|
254
|
-
async visitarExpressaoAcessoElementoMatriz(
|
|
265
|
+
async visitarExpressaoAcessoElementoMatriz(_) {
|
|
255
266
|
throw new Error('Método não implementado.');
|
|
256
267
|
}
|
|
257
268
|
textoParaRegex(texto) {
|
|
@@ -266,14 +277,14 @@ class InterpretadorBase {
|
|
|
266
277
|
visitarExpressaoExpressaoRegular(expressao) {
|
|
267
278
|
return Promise.resolve(this.textoParaRegex(expressao.valor));
|
|
268
279
|
}
|
|
269
|
-
visitarExpressaoTipoDe(
|
|
280
|
+
visitarExpressaoTipoDe(_) {
|
|
270
281
|
throw new Error('Método não implementado.');
|
|
271
282
|
}
|
|
272
283
|
async visitarExpressaoFalhar(expressao) {
|
|
273
284
|
const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
|
|
274
285
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
|
|
275
286
|
}
|
|
276
|
-
async visitarExpressaoFimPara(
|
|
287
|
+
async visitarExpressaoFimPara(_) {
|
|
277
288
|
throw new Error('Método não implementado.');
|
|
278
289
|
}
|
|
279
290
|
async visitarExpressaoReferenciaFuncao(expressao) {
|
|
@@ -342,6 +353,9 @@ class InterpretadorBase {
|
|
|
342
353
|
*/
|
|
343
354
|
async resolverInterpolacoes(textoOriginal, linha) {
|
|
344
355
|
const variaveis = textoOriginal.match(this.regexInterpolacao);
|
|
356
|
+
if (!variaveis) {
|
|
357
|
+
return [];
|
|
358
|
+
}
|
|
345
359
|
return await Promise.all(variaveis.map(async (s) => {
|
|
346
360
|
const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
|
|
347
361
|
const microLexador = this.microLexador.mapear(expressaoInterpolacao);
|
|
@@ -556,6 +570,9 @@ class InterpretadorBase {
|
|
|
556
570
|
}
|
|
557
571
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
558
572
|
}
|
|
573
|
+
converterParaBigInt(valor) {
|
|
574
|
+
return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
|
|
575
|
+
}
|
|
559
576
|
async visitarExpressaoBinaria(expressao) {
|
|
560
577
|
const esquerda = await this.avaliar(expressao.esquerda);
|
|
561
578
|
const direita = await this.avaliar(expressao.direita);
|
|
@@ -567,7 +584,7 @@ class InterpretadorBase {
|
|
|
567
584
|
const nomeOperador = 'operador' + expressao.operador.lexema;
|
|
568
585
|
const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
|
|
569
586
|
if (metodoOperador) {
|
|
570
|
-
const
|
|
587
|
+
const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
|
|
571
588
|
const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
|
|
572
589
|
? direita
|
|
573
590
|
: {
|
|
@@ -575,7 +592,7 @@ class InterpretadorBase {
|
|
|
575
592
|
valor: valorDireito,
|
|
576
593
|
imutavel: false,
|
|
577
594
|
};
|
|
578
|
-
return await
|
|
595
|
+
return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
|
|
579
596
|
}
|
|
580
597
|
}
|
|
581
598
|
const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
|
|
@@ -589,13 +606,7 @@ class InterpretadorBase {
|
|
|
589
606
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
590
607
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
591
608
|
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;
|
|
609
|
+
return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
|
|
599
610
|
}
|
|
600
611
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
601
612
|
return resultadoExponenciacao;
|
|
@@ -622,13 +633,7 @@ class InterpretadorBase {
|
|
|
622
633
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
623
634
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
624
635
|
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;
|
|
636
|
+
return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
|
|
632
637
|
}
|
|
633
638
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
634
639
|
case delegua_1.default.ADICAO:
|
|
@@ -637,15 +642,25 @@ class InterpretadorBase {
|
|
|
637
642
|
if (Array.isArray(valorEsquerdo) && Array.isArray(valorDireito)) {
|
|
638
643
|
return valorEsquerdo.concat(valorDireito);
|
|
639
644
|
}
|
|
645
|
+
// Se ambos os operandos são dicionários, mescla-os.
|
|
646
|
+
// Em caso de chaves duplicadas, valores à direita sobrescrevem os da esquerda.
|
|
647
|
+
if (valorEsquerdo &&
|
|
648
|
+
valorDireito &&
|
|
649
|
+
!Array.isArray(valorEsquerdo) &&
|
|
650
|
+
!Array.isArray(valorDireito) &&
|
|
651
|
+
valorEsquerdo.constructor === Object &&
|
|
652
|
+
valorDireito.constructor === Object) {
|
|
653
|
+
return Object.assign({}, valorEsquerdo, valorDireito);
|
|
654
|
+
}
|
|
640
655
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
641
656
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
642
|
-
const
|
|
657
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
643
658
|
? valorEsquerdo
|
|
644
659
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
645
|
-
const
|
|
660
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
646
661
|
? valorDireito
|
|
647
662
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
648
|
-
return
|
|
663
|
+
return valorResolvidoEsquerdo + valorResolvidoDireito;
|
|
649
664
|
}
|
|
650
665
|
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
651
666
|
this.tiposNumericos.includes(tipoDireito)) {
|
|
@@ -675,13 +690,13 @@ class InterpretadorBase {
|
|
|
675
690
|
}
|
|
676
691
|
// Retorna BigInt se qualquer operando for BigInt
|
|
677
692
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
678
|
-
const
|
|
693
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
679
694
|
? valorEsquerdo
|
|
680
695
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
681
|
-
const
|
|
696
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
682
697
|
? valorDireito
|
|
683
698
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
684
|
-
return
|
|
699
|
+
return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
|
|
685
700
|
}
|
|
686
701
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
687
702
|
case delegua_1.default.MULTIPLICACAO:
|
|
@@ -690,13 +705,13 @@ class InterpretadorBase {
|
|
|
690
705
|
if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
|
|
691
706
|
tipoEsquerdo !== delegua_2.default.TEXTO &&
|
|
692
707
|
tipoDireito !== delegua_2.default.TEXTO) {
|
|
693
|
-
const
|
|
708
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
694
709
|
? valorEsquerdo
|
|
695
710
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
696
|
-
const
|
|
711
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
697
712
|
? valorDireito
|
|
698
713
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
699
|
-
return
|
|
714
|
+
return valorResolvidoEsquerdo * valorResolvidoDireito;
|
|
700
715
|
}
|
|
701
716
|
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
702
717
|
tipoDireito === delegua_2.default.TEXTO) {
|
|
@@ -743,13 +758,7 @@ class InterpretadorBase {
|
|
|
743
758
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
744
759
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
745
760
|
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;
|
|
761
|
+
return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
|
|
753
762
|
}
|
|
754
763
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
755
764
|
case delegua_1.default.CIRCUMFLEXO:
|
|
@@ -759,13 +768,7 @@ class InterpretadorBase {
|
|
|
759
768
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
760
769
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
761
770
|
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;
|
|
771
|
+
return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
|
|
769
772
|
}
|
|
770
773
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
771
774
|
case delegua_1.default.BIT_OR:
|
|
@@ -775,45 +778,21 @@ class InterpretadorBase {
|
|
|
775
778
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
776
779
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
777
780
|
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;
|
|
781
|
+
return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
|
|
785
782
|
}
|
|
786
783
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
787
784
|
case delegua_1.default.MENOR_MENOR:
|
|
788
785
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
789
786
|
// 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;
|
|
787
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
788
|
+
return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
|
|
801
789
|
}
|
|
802
790
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
803
791
|
case delegua_1.default.MAIOR_MAIOR:
|
|
804
792
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
805
793
|
// 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;
|
|
794
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
795
|
+
return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
|
|
817
796
|
}
|
|
818
797
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
819
798
|
case delegua_1.default.DIFERENTE:
|
|
@@ -846,7 +825,7 @@ class InterpretadorBase {
|
|
|
846
825
|
: undefined;
|
|
847
826
|
let valor = await this.avaliar(variavelArgumento);
|
|
848
827
|
argumentos.push({
|
|
849
|
-
nome: nomeArgumento,
|
|
828
|
+
nome: nomeArgumento ?? null,
|
|
850
829
|
valor,
|
|
851
830
|
});
|
|
852
831
|
}
|
|
@@ -860,11 +839,11 @@ class InterpretadorBase {
|
|
|
860
839
|
async visitarExpressaoDeChamada(expressao) {
|
|
861
840
|
try {
|
|
862
841
|
let variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
|
|
863
|
-
if (variavelEntidadeChamada === null) {
|
|
842
|
+
if (variavelEntidadeChamada === null || variavelEntidadeChamada === undefined) {
|
|
864
843
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
|
|
865
844
|
String(expressao.entidadeChamada), expressao.linha));
|
|
866
845
|
}
|
|
867
|
-
if (
|
|
846
|
+
if (Object.prototype.hasOwnProperty.call(variavelEntidadeChamada, 'valorRetornado')) {
|
|
868
847
|
variavelEntidadeChamada = variavelEntidadeChamada.valorRetornado;
|
|
869
848
|
}
|
|
870
849
|
let entidadeChamada = this.resolverValor(variavelEntidadeChamada);
|
|
@@ -915,8 +894,8 @@ class InterpretadorBase {
|
|
|
915
894
|
// mesmo que esteja tudo certo com `DeleguaFuncao`,
|
|
916
895
|
// então precisamos testar o nome do construtor também.
|
|
917
896
|
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
918
|
-
entidadeChamada.constructor
|
|
919
|
-
entidadeChamada.constructor
|
|
897
|
+
entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
|
|
898
|
+
entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
|
|
920
899
|
const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
|
|
921
900
|
return retornoEntidadeChamada;
|
|
922
901
|
}
|
|
@@ -962,10 +941,6 @@ class InterpretadorBase {
|
|
|
962
941
|
indice = this.resolverValor(await this.avaliar(expressao.indice));
|
|
963
942
|
}
|
|
964
943
|
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
944
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
970
945
|
// Nunca será método aqui: apenas propriedade.
|
|
971
946
|
const alvoPropriedade = expressao.alvo;
|
|
@@ -977,8 +952,12 @@ class InterpretadorBase {
|
|
|
977
952
|
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
978
953
|
}
|
|
979
954
|
break;
|
|
955
|
+
case construtos_1.Variavel:
|
|
956
|
+
const alvoVariavel = expressao.alvo;
|
|
957
|
+
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
958
|
+
break;
|
|
980
959
|
default:
|
|
981
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(
|
|
960
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
|
|
982
961
|
}
|
|
983
962
|
return valorResolvido;
|
|
984
963
|
}
|
|
@@ -1070,10 +1049,10 @@ class InterpretadorBase {
|
|
|
1070
1049
|
const declaracaoInicializador = Array.isArray(declaracao.inicializador)
|
|
1071
1050
|
? declaracao.inicializador[0]
|
|
1072
1051
|
: declaracao.inicializador;
|
|
1073
|
-
if (declaracaoInicializador !== null) {
|
|
1052
|
+
if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
|
|
1074
1053
|
await this.avaliar(declaracaoInicializador);
|
|
1075
1054
|
}
|
|
1076
|
-
let retornoExecucao;
|
|
1055
|
+
let retornoExecucao = undefined;
|
|
1077
1056
|
let iteracoes = 0;
|
|
1078
1057
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
|
|
1079
1058
|
if (declaracao.condicao !== null &&
|
|
@@ -1087,7 +1066,7 @@ class InterpretadorBase {
|
|
|
1087
1066
|
return null;
|
|
1088
1067
|
}
|
|
1089
1068
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1090
|
-
retornoExecucao =
|
|
1069
|
+
retornoExecucao = undefined;
|
|
1091
1070
|
}
|
|
1092
1071
|
}
|
|
1093
1072
|
catch (erro) {
|
|
@@ -1098,15 +1077,19 @@ class InterpretadorBase {
|
|
|
1098
1077
|
});
|
|
1099
1078
|
return Promise.reject(erro);
|
|
1100
1079
|
}
|
|
1101
|
-
if (declaracao.incrementar
|
|
1080
|
+
if (declaracao.incrementar) {
|
|
1102
1081
|
await this.avaliar(declaracao.incrementar);
|
|
1103
1082
|
}
|
|
1104
1083
|
}
|
|
1105
1084
|
return retornoExecucao;
|
|
1106
1085
|
}
|
|
1107
|
-
|
|
1086
|
+
/**
|
|
1087
|
+
* Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
|
|
1088
|
+
* @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
|
|
1089
|
+
* @returns {Promise<any>} O resultado da execução da declaração.
|
|
1090
|
+
*/
|
|
1108
1091
|
async visitarDeclaracaoParaCada(declaracao) {
|
|
1109
|
-
let retornoExecucao;
|
|
1092
|
+
let retornoExecucao = undefined;
|
|
1110
1093
|
// Posição atual precisa ser reiniciada, pois pode estar dentro de outro
|
|
1111
1094
|
// laço de repetição.
|
|
1112
1095
|
declaracao.posicaoAtual = 0;
|
|
@@ -1144,7 +1127,7 @@ class InterpretadorBase {
|
|
|
1144
1127
|
return null;
|
|
1145
1128
|
}
|
|
1146
1129
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1147
|
-
retornoExecucao =
|
|
1130
|
+
retornoExecucao = undefined;
|
|
1148
1131
|
}
|
|
1149
1132
|
declaracao.posicaoAtual++;
|
|
1150
1133
|
}
|
|
@@ -1170,19 +1153,20 @@ class InterpretadorBase {
|
|
|
1170
1153
|
if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
|
|
1171
1154
|
return await this.executar(declaracao.caminhoEntao);
|
|
1172
1155
|
}
|
|
1173
|
-
|
|
1174
|
-
|
|
1156
|
+
const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
|
|
1157
|
+
for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
|
|
1158
|
+
const atual = declaracaoCaminhosSeSenao[i];
|
|
1175
1159
|
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
1176
1160
|
return await this.executar(atual.caminho);
|
|
1177
1161
|
}
|
|
1178
1162
|
}
|
|
1179
|
-
if (declaracao.caminhoSenao
|
|
1163
|
+
if (declaracao.caminhoSenao) {
|
|
1180
1164
|
return await this.executar(declaracao.caminhoSenao);
|
|
1181
1165
|
}
|
|
1182
1166
|
return null;
|
|
1183
1167
|
}
|
|
1184
1168
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
1185
|
-
let retornoExecucao;
|
|
1169
|
+
let retornoExecucao = undefined;
|
|
1186
1170
|
let iteracoes = 0;
|
|
1187
1171
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
|
|
1188
1172
|
this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
@@ -1193,7 +1177,7 @@ class InterpretadorBase {
|
|
|
1193
1177
|
return null;
|
|
1194
1178
|
}
|
|
1195
1179
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1196
|
-
retornoExecucao =
|
|
1180
|
+
retornoExecucao = undefined;
|
|
1197
1181
|
}
|
|
1198
1182
|
}
|
|
1199
1183
|
catch (erro) {
|
|
@@ -1248,17 +1232,17 @@ class InterpretadorBase {
|
|
|
1248
1232
|
}
|
|
1249
1233
|
}
|
|
1250
1234
|
async visitarDeclaracaoFazer(declaracao) {
|
|
1251
|
-
let retornoExecucao;
|
|
1235
|
+
let retornoExecucao = undefined;
|
|
1252
1236
|
let iteracoes = 0;
|
|
1253
1237
|
do {
|
|
1254
1238
|
try {
|
|
1255
1239
|
await this.cederControle(++iteracoes);
|
|
1256
1240
|
retornoExecucao = await this.executar(declaracao.caminhoFazer);
|
|
1257
1241
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
|
|
1258
|
-
return
|
|
1242
|
+
return undefined;
|
|
1259
1243
|
}
|
|
1260
1244
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1261
|
-
retornoExecucao =
|
|
1245
|
+
retornoExecucao = undefined;
|
|
1262
1246
|
}
|
|
1263
1247
|
}
|
|
1264
1248
|
catch (erro) {
|
|
@@ -1300,7 +1284,7 @@ class InterpretadorBase {
|
|
|
1300
1284
|
}
|
|
1301
1285
|
}
|
|
1302
1286
|
finally {
|
|
1303
|
-
if (declaracao.caminhoFinalmente
|
|
1287
|
+
if (declaracao.caminhoFinalmente)
|
|
1304
1288
|
valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
|
|
1305
1289
|
this.emDeclaracaoTente = false;
|
|
1306
1290
|
}
|
|
@@ -1332,7 +1316,7 @@ class InterpretadorBase {
|
|
|
1332
1316
|
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
1333
1317
|
try {
|
|
1334
1318
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1335
|
-
this.funcaoDeRetornoMesmaLinha(formatoTexto);
|
|
1319
|
+
this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
|
|
1336
1320
|
return {
|
|
1337
1321
|
tipo: 'vazio',
|
|
1338
1322
|
tipoExplicito: false,
|
|
@@ -1355,7 +1339,7 @@ class InterpretadorBase {
|
|
|
1355
1339
|
async visitarDeclaracaoEscreva(declaracao) {
|
|
1356
1340
|
try {
|
|
1357
1341
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1358
|
-
this.funcaoDeRetorno(formatoTexto);
|
|
1342
|
+
this.funcaoDeRetorno?.(formatoTexto);
|
|
1359
1343
|
return {
|
|
1360
1344
|
tipo: 'vazio',
|
|
1361
1345
|
tipoExplicito: false,
|
|
@@ -1399,7 +1383,7 @@ class InterpretadorBase {
|
|
|
1399
1383
|
}
|
|
1400
1384
|
async avaliacaoDeclaracaoVarOuConst(declaracao) {
|
|
1401
1385
|
let valorOuOutraVariavel = null;
|
|
1402
|
-
if (declaracao.inicializador
|
|
1386
|
+
if (declaracao.inicializador != null) {
|
|
1403
1387
|
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
1404
1388
|
}
|
|
1405
1389
|
let valorFinal = null;
|
|
@@ -1428,16 +1412,16 @@ class InterpretadorBase {
|
|
|
1428
1412
|
*/
|
|
1429
1413
|
async visitarDeclaracaoConstMultiplo(declaracao) {
|
|
1430
1414
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1431
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1415
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1432
1416
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1433
1417
|
this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1434
1418
|
}
|
|
1435
1419
|
return null;
|
|
1436
1420
|
}
|
|
1437
|
-
visitarExpressaoContinua(
|
|
1421
|
+
visitarExpressaoContinua(_) {
|
|
1438
1422
|
return new quebras_1.ContinuarQuebra();
|
|
1439
1423
|
}
|
|
1440
|
-
visitarExpressaoSustar(
|
|
1424
|
+
visitarExpressaoSustar(_) {
|
|
1441
1425
|
return new quebras_1.SustarQuebra();
|
|
1442
1426
|
}
|
|
1443
1427
|
async visitarExpressaoRetornar(declaracao) {
|
|
@@ -1617,133 +1601,29 @@ class InterpretadorBase {
|
|
|
1617
1601
|
if (superClassesResolvidas.length > 0) {
|
|
1618
1602
|
this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
|
|
1619
1603
|
}
|
|
1604
|
+
const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
|
|
1605
|
+
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1606
|
+
// Por enquanto, tudo bem deixar isso aqui.
|
|
1607
|
+
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1608
|
+
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1609
|
+
return descritorTipoClasse;
|
|
1610
|
+
}
|
|
1611
|
+
resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
|
|
1620
1612
|
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];
|
|
1613
|
+
for (const metodoAtual of declaracao.metodos) {
|
|
1632
1614
|
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
1615
|
const eInicializador = nomeMetodo === 'construtor';
|
|
1643
1616
|
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
|
|
1644
1617
|
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
|
-
}
|
|
1618
|
+
metodos[nomeMetodo] = funcao;
|
|
1686
1619
|
}
|
|
1687
1620
|
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
1621
|
if (descritorTipoClasse.superClasses.length === 0 &&
|
|
1704
1622
|
estruturas_1.OBJETO_BASE &&
|
|
1705
1623
|
descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
|
|
1706
1624
|
descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
|
|
1707
1625
|
}
|
|
1708
|
-
// Calcular o OReM (linearização C3) após os pais estarem definidos.
|
|
1709
1626
|
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
1627
|
return descritorTipoClasse;
|
|
1748
1628
|
}
|
|
1749
1629
|
/**
|
|
@@ -1790,7 +1670,8 @@ class InterpretadorBase {
|
|
|
1790
1670
|
if (!this.extensoesGlobais.has(tipoNome)) {
|
|
1791
1671
|
this.extensoesGlobais.set(tipoNome, new Map());
|
|
1792
1672
|
}
|
|
1793
|
-
this.extensoesGlobais.get(tipoNome)
|
|
1673
|
+
const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
|
|
1674
|
+
extensaoGlobal?.set(nomeMetodo, funcao);
|
|
1794
1675
|
}
|
|
1795
1676
|
else {
|
|
1796
1677
|
const hash = declaracao.hashArquivo;
|
|
@@ -1798,10 +1679,13 @@ class InterpretadorBase {
|
|
|
1798
1679
|
this.extensoesModulo.set(hash, new Map());
|
|
1799
1680
|
}
|
|
1800
1681
|
const mapa = this.extensoesModulo.get(hash);
|
|
1682
|
+
if (!mapa) {
|
|
1683
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
|
|
1684
|
+
}
|
|
1801
1685
|
if (!mapa.has(tipoNome)) {
|
|
1802
|
-
mapa
|
|
1686
|
+
mapa?.set(tipoNome, new Map());
|
|
1803
1687
|
}
|
|
1804
|
-
mapa.get(tipoNome)
|
|
1688
|
+
mapa.get(tipoNome)?.set(nomeMetodo, funcao);
|
|
1805
1689
|
}
|
|
1806
1690
|
}
|
|
1807
1691
|
}
|
|
@@ -1904,7 +1788,7 @@ class InterpretadorBase {
|
|
|
1904
1788
|
dicionario[chaveLogico] = this.resolverValor(promises[1]);
|
|
1905
1789
|
continue;
|
|
1906
1790
|
}
|
|
1907
|
-
dicionario[promises[0]] = this.resolverValor(promises[1]);
|
|
1791
|
+
dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
|
|
1908
1792
|
}
|
|
1909
1793
|
}
|
|
1910
1794
|
return dicionario;
|
|
@@ -1947,7 +1831,7 @@ class InterpretadorBase {
|
|
|
1947
1831
|
*/
|
|
1948
1832
|
async visitarDeclaracaoVarMultiplo(declaracao) {
|
|
1949
1833
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1950
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1834
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1951
1835
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1952
1836
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1953
1837
|
}
|