@designliquido/delegua 0.41.8 → 0.42.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/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +28 -14
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +16 -3
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +184 -46
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -0
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/index.d.ts +1 -0
- package/avaliador-sintatico/index.d.ts.map +1 -1
- package/avaliador-sintatico/index.js +1 -0
- package/avaliador-sintatico/index.js.map +1 -1
- package/avaliador-sintatico/informacao-escopo.d.ts +2 -1
- package/avaliador-sintatico/informacao-escopo.d.ts.map +1 -1
- package/avaliador-sintatico/informacao-escopo.js.map +1 -1
- package/avaliador-sintatico/pilha-escopos.d.ts +3 -1
- package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
- package/avaliador-sintatico/pilha-escopos.js +6 -3
- package/avaliador-sintatico/pilha-escopos.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +7 -7
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +14 -8
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +2 -0
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +9 -0
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +28 -0
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +46 -4
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +2 -2
- package/informacao-variavel-ou-constante.d.ts +8 -0
- package/informacao-variavel-ou-constante.d.ts.map +1 -0
- package/informacao-variavel-ou-constante.js +16 -0
- package/informacao-variavel-ou-constante.js.map +1 -0
- package/interfaces/primitiva-interface.d.ts +2 -0
- package/interfaces/primitiva-interface.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +39 -39
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +56 -0
- package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -0
- package/lexador/dialetos/palavras-reservadas/pitugues.js +63 -0
- package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -0
- package/lexador/index.d.ts +1 -0
- package/lexador/index.d.ts.map +1 -1
- package/lexador/index.js +1 -0
- package/lexador/index.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +28 -15
- package/lexador/lexador.js.map +1 -1
- package/package.json +2 -2
- package/tipos-de-simbolos/pitugues.d.ts +6 -0
- package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
- package/tipos-de-simbolos/pitugues.js +6 -0
- package/tipos-de-simbolos/pitugues.js.map +1 -1
- package/umd/delegua.js +768 -437
- package/bin/delegua +0 -3
- package/bin/delegua.cmd +0 -1
|
@@ -13,6 +13,7 @@ const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
|
|
|
13
13
|
const inferenciador_1 = require("../inferenciador");
|
|
14
14
|
const pilha_escopos_1 = require("./pilha-escopos");
|
|
15
15
|
const informacao_escopo_1 = require("./informacao-escopo");
|
|
16
|
+
const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-constante");
|
|
16
17
|
const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
|
|
17
18
|
const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
18
19
|
const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
|
|
@@ -41,22 +42,23 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
41
42
|
this.tiposDefinidosEmCodigo = {};
|
|
42
43
|
this.tiposDeFerramentasExternas = {};
|
|
43
44
|
this.primitivasConhecidas = {};
|
|
44
|
-
for (const nomePrimitivaDicionario of Object.
|
|
45
|
-
this.primitivasConhecidas[nomePrimitivaDicionario] = 'dicionário';
|
|
45
|
+
for (const [nomePrimitivaDicionario, dadosPrimitiva] of Object.entries(primitivas_dicionario_1.default)) {
|
|
46
|
+
this.primitivasConhecidas[nomePrimitivaDicionario] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaDicionario, 'dicionário', dadosPrimitiva.argumentos);
|
|
46
47
|
}
|
|
47
|
-
for (const nomePrimitivaNumero of Object.
|
|
48
|
-
this.primitivasConhecidas[nomePrimitivaNumero] = 'número';
|
|
48
|
+
for (const [nomePrimitivaNumero, dadosPrimitiva] of Object.entries(primitivas_numero_1.default)) {
|
|
49
|
+
this.primitivasConhecidas[nomePrimitivaNumero] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaNumero, 'número', dadosPrimitiva.argumentos);
|
|
49
50
|
}
|
|
50
|
-
for (const nomePrimitivaTexto of Object.
|
|
51
|
-
this.primitivasConhecidas[nomePrimitivaTexto] = 'texto';
|
|
51
|
+
for (const [nomePrimitivaTexto, dadosPrimitiva] of Object.entries(primitivas_texto_1.default)) {
|
|
52
|
+
this.primitivasConhecidas[nomePrimitivaTexto] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaTexto, 'texto', dadosPrimitiva.argumentos);
|
|
52
53
|
}
|
|
53
|
-
for (const nomePrimitivaVetor of Object.
|
|
54
|
-
this.primitivasConhecidas[nomePrimitivaVetor] = 'vetor';
|
|
54
|
+
for (const [nomePrimitivaVetor, dadosPrimitiva] of Object.entries(primitivas_vetor_1.default)) {
|
|
55
|
+
this.primitivasConhecidas[nomePrimitivaVetor] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomePrimitivaVetor, 'vetor', dadosPrimitiva.argumentos);
|
|
55
56
|
}
|
|
56
|
-
|
|
57
|
-
this.primitivasConhecidas['
|
|
58
|
-
this.primitivasConhecidas['
|
|
59
|
-
this.primitivasConhecidas['
|
|
57
|
+
// TODO: Por enquanto não há necessidade de validar argumentos aqui, mas isso pode mudar no futuro.
|
|
58
|
+
this.primitivasConhecidas['inteiro'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro');
|
|
59
|
+
this.primitivasConhecidas['numero'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('numero', 'número');
|
|
60
|
+
this.primitivasConhecidas['número'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número');
|
|
61
|
+
this.primitivasConhecidas['texto'] = new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto');
|
|
60
62
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
61
63
|
}
|
|
62
64
|
verificarDefinicaoTipoAtual() {
|
|
@@ -188,7 +190,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
188
190
|
case delegua_2.default.FUNÇÃO:
|
|
189
191
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
190
192
|
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
191
|
-
this.pilhaEscopos.
|
|
193
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
|
|
192
194
|
return corpoDaFuncao;
|
|
193
195
|
case delegua_2.default.IDENTIFICADOR:
|
|
194
196
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
@@ -214,6 +216,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
214
216
|
case delegua_2.default.ISTO:
|
|
215
217
|
this.avancarEDevolverAnterior();
|
|
216
218
|
return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
|
|
219
|
+
case delegua_2.default.LEIA:
|
|
220
|
+
return this.expressaoLeia();
|
|
217
221
|
case delegua_2.default.NULO:
|
|
218
222
|
this.avancarEDevolverAnterior();
|
|
219
223
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
|
|
@@ -308,11 +312,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
308
312
|
chamar() {
|
|
309
313
|
let expressao = this.primario();
|
|
310
314
|
while (true) {
|
|
315
|
+
let tipoPrimitiva = undefined;
|
|
311
316
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
312
|
-
expressao = this.finalizarChamada(expressao);
|
|
317
|
+
expressao = this.finalizarChamada(expressao, tipoPrimitiva);
|
|
313
318
|
}
|
|
314
319
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
|
|
315
320
|
const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
|
|
321
|
+
tipoPrimitiva = expressao.tipo;
|
|
316
322
|
expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
|
|
317
323
|
}
|
|
318
324
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
|
|
@@ -376,10 +382,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
376
382
|
}
|
|
377
383
|
return entidadeChamadaResolvida;
|
|
378
384
|
}
|
|
379
|
-
|
|
385
|
+
validarArgumentosEntidadeChamada(argumentosEntidadeChamada, argumentosUtilizados) {
|
|
386
|
+
if (argumentosEntidadeChamada.length === 0) {
|
|
387
|
+
return [];
|
|
388
|
+
}
|
|
389
|
+
const possiveisErros = [];
|
|
390
|
+
for (const [indice, argumentoEntidadeChamada] of argumentosEntidadeChamada.entries()) {
|
|
391
|
+
const argumentoUtilizado = argumentosUtilizados[indice];
|
|
392
|
+
if (argumentoUtilizado.tipo === null || argumentoUtilizado.tipo === undefined) {
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const argumentoEntidadeChamadaVetor = argumentoEntidadeChamada.tipo.endsWith('[]');
|
|
396
|
+
const argumentoUtilizadoVetor = argumentoUtilizado.tipo.endsWith('[]');
|
|
397
|
+
if (argumentoEntidadeChamadaVetor !== argumentoUtilizadoVetor) {
|
|
398
|
+
possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
const argumentoEntidadeChamadaQualquer = argumentoEntidadeChamada.tipo.startsWith('qualquer');
|
|
402
|
+
if (argumentoEntidadeChamadaQualquer) {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (argumentoUtilizado.tipo !== argumentoEntidadeChamada.tipo) {
|
|
406
|
+
possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return possiveisErros;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Diversas verificações de resolução de entidade chamada, como resolver chamada da pilha ou usar referência, argumentos, etc.
|
|
413
|
+
* @param entidadeChamada O construto da entidade chamada.
|
|
414
|
+
* @param argumentos Os argumentos utilizados na chamada.
|
|
415
|
+
* @param tipoPrimitiva Se for uma primitiva, o tipo dela. Senão, `undefined`.
|
|
416
|
+
* @returns A entidade chamada resolvida, se as validações passarem.
|
|
417
|
+
*/
|
|
418
|
+
resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
|
|
380
419
|
if (entidadeChamada.constructor.name === 'Variavel') {
|
|
381
420
|
const entidadeChamadaResolvidaVariavel = entidadeChamada;
|
|
382
|
-
if (
|
|
421
|
+
if (tipoPrimitiva === undefined) {
|
|
422
|
+
// Provavelmente uma chamada a alguma função da biblioteca global.
|
|
423
|
+
const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
|
|
424
|
+
if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
|
|
425
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
|
|
426
|
+
if (erros.length > 0) {
|
|
427
|
+
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => mensagem += `${erro}\n`, '')}`);
|
|
428
|
+
}
|
|
429
|
+
return entidadeChamadaResolvidaVariavel;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (tipoPrimitiva !== undefined && this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
|
|
433
|
+
var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
|
|
434
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
|
|
435
|
+
if (erros.length > 0) {
|
|
436
|
+
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaResolvidaVariavel.simbolo, `Erros ao resolver argumentos de chamada a ${entidadeChamadaResolvidaVariavel.simbolo.lexema}: \n${erros.reduce((mensagem, erro) => mensagem += `${erro}\n`, '')}`);
|
|
437
|
+
}
|
|
383
438
|
return entidadeChamadaResolvidaVariavel;
|
|
384
439
|
}
|
|
385
440
|
if (entidadeChamadaResolvidaVariavel.simbolo.lexema in this.tiposDefinidosEmCodigo) {
|
|
@@ -396,7 +451,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
396
451
|
}
|
|
397
452
|
return entidadeChamada;
|
|
398
453
|
}
|
|
399
|
-
finalizarChamada(entidadeChamada) {
|
|
454
|
+
finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
|
|
400
455
|
const argumentos = [];
|
|
401
456
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
402
457
|
do {
|
|
@@ -409,7 +464,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
409
464
|
}
|
|
410
465
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
411
466
|
// Toda chamada precisa saber de antemão qual o tipo resolvido.
|
|
412
|
-
const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada);
|
|
467
|
+
const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva);
|
|
413
468
|
// TODO: Criar forma de validar tipos dos argumentos da entidade chamada.
|
|
414
469
|
const construtoChamada = new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
|
|
415
470
|
construtoChamada.tipo = 'qualquer';
|
|
@@ -558,7 +613,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
558
613
|
* @returns Um objeto da classe `Leia`.
|
|
559
614
|
*/
|
|
560
615
|
expressaoLeia() {
|
|
561
|
-
const simboloLeia = this.
|
|
616
|
+
const simboloLeia = this.avancarEDevolverAnterior();
|
|
562
617
|
this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos argumentos em instrução `leia`.");
|
|
563
618
|
const argumentos = [];
|
|
564
619
|
if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
|
|
@@ -569,9 +624,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
569
624
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
|
|
570
625
|
return new construtos_1.Leia(simboloLeia, argumentos);
|
|
571
626
|
}
|
|
627
|
+
// TODO: Depreciar.
|
|
572
628
|
expressao() {
|
|
573
|
-
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.LEIA))
|
|
574
|
-
return this.expressaoLeia();
|
|
575
629
|
return this.atribuir();
|
|
576
630
|
}
|
|
577
631
|
blocoEscopo() {
|
|
@@ -759,7 +813,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
759
813
|
if (!tipoVetor.endsWith('[]')) {
|
|
760
814
|
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
|
|
761
815
|
}
|
|
762
|
-
this.pilhaEscopos.
|
|
816
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
|
|
763
817
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
764
818
|
const corpo = this.resolverDeclaracao();
|
|
765
819
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
|
|
@@ -998,7 +1052,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
998
1052
|
default:
|
|
999
1053
|
break;
|
|
1000
1054
|
}
|
|
1001
|
-
this.pilhaEscopos.
|
|
1055
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloNomeVariavel.lexema, tipoInicializacao));
|
|
1002
1056
|
const blocoCorpo = this.blocoEscopo();
|
|
1003
1057
|
return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
|
|
1004
1058
|
}
|
|
@@ -1012,7 +1066,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1012
1066
|
const inicializador = this.expressao();
|
|
1013
1067
|
const retornos = [];
|
|
1014
1068
|
for (let identificador of identificadores) {
|
|
1015
|
-
this.pilhaEscopos.
|
|
1069
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
|
|
1016
1070
|
const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1017
1071
|
declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
|
|
1018
1072
|
retornos.push(declaracaoVar);
|
|
@@ -1034,6 +1088,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1034
1088
|
case 'AcessoMetodo':
|
|
1035
1089
|
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
1036
1090
|
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
1091
|
+
case 'AcessoMetodoOuPropriedade':
|
|
1092
|
+
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
1093
|
+
// e a chamada normalmente é feita para uma primitiva.
|
|
1094
|
+
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
1095
|
+
const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
|
|
1096
|
+
if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
|
|
1097
|
+
return this.primitivasConhecidas[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
|
|
1098
|
+
}
|
|
1099
|
+
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
|
|
1037
1100
|
case 'AcessoPropriedade':
|
|
1038
1101
|
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
1039
1102
|
return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
@@ -1063,6 +1126,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1063
1126
|
case 'Noneto':
|
|
1064
1127
|
case 'Deceto':
|
|
1065
1128
|
return delegua_1.default.TUPLA;
|
|
1129
|
+
case "ImportarBiblioteca":
|
|
1130
|
+
case "ModuloDeclaracoes":
|
|
1131
|
+
return "módulo";
|
|
1066
1132
|
default:
|
|
1067
1133
|
return inicializador.tipo;
|
|
1068
1134
|
}
|
|
@@ -1088,7 +1154,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1088
1154
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1089
1155
|
// Inicialização de variáveis sem valor.
|
|
1090
1156
|
for (let identificador of identificadores.values()) {
|
|
1091
|
-
this.pilhaEscopos.
|
|
1157
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1092
1158
|
retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
|
|
1093
1159
|
}
|
|
1094
1160
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1105,7 +1171,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1105
1171
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1106
1172
|
// Se tipo ainda não foi definido, infere.
|
|
1107
1173
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1108
|
-
this.pilhaEscopos.
|
|
1174
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1109
1175
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1110
1176
|
}
|
|
1111
1177
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1123,7 +1189,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1123
1189
|
const retornos = [];
|
|
1124
1190
|
for (let identificador of identificadores) {
|
|
1125
1191
|
// TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
|
|
1126
|
-
this.pilhaEscopos.
|
|
1192
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, 'qualquer'));
|
|
1127
1193
|
const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1128
1194
|
declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
|
|
1129
1195
|
retornos.push(declaracaoConst);
|
|
@@ -1159,7 +1225,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1159
1225
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1160
1226
|
// Se tipo ainda não foi definido, infere.
|
|
1161
1227
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1162
|
-
this.pilhaEscopos.
|
|
1228
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1163
1229
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1164
1230
|
}
|
|
1165
1231
|
this.pilhaDecoradores = [];
|
|
@@ -1180,9 +1246,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1180
1246
|
this.pilhaDecoradores = [];
|
|
1181
1247
|
// Se houver chamadas recursivas à função, precisamos definir um tipo
|
|
1182
1248
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
1183
|
-
this.pilhaEscopos.
|
|
1249
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, 'qualquer'));
|
|
1184
1250
|
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
1185
|
-
this.pilhaEscopos.
|
|
1251
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, corpoDaFuncao.tipo));
|
|
1186
1252
|
const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipo, decoradores);
|
|
1187
1253
|
this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
|
|
1188
1254
|
return funcaoDeclaracao;
|
|
@@ -1208,7 +1274,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1208
1274
|
parametro.tipoDado = tipoDadoParametro;
|
|
1209
1275
|
this.avancarEDevolverAnterior();
|
|
1210
1276
|
}
|
|
1211
|
-
this.pilhaEscopos.
|
|
1277
|
+
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
1212
1278
|
parametros.push(parametro);
|
|
1213
1279
|
if (parametro.abrangencia === 'multiplo')
|
|
1214
1280
|
break;
|
|
@@ -1411,28 +1477,99 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1411
1477
|
this.avancarEDevolverAnterior();
|
|
1412
1478
|
}
|
|
1413
1479
|
}
|
|
1480
|
+
/**
|
|
1481
|
+
* Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
|
|
1482
|
+
* TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
|
|
1483
|
+
*/
|
|
1414
1484
|
inicializarPilhaEscopos() {
|
|
1415
1485
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
1416
1486
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
1417
1487
|
// Funções nativas de Delégua
|
|
1418
|
-
this.pilhaEscopos.
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
this.pilhaEscopos.
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
this.pilhaEscopos.
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
this.pilhaEscopos.
|
|
1430
|
-
|
|
1431
|
-
|
|
1488
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
|
|
1489
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
|
|
1490
|
+
]));
|
|
1491
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
|
|
1492
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
|
|
1493
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
|
|
1494
|
+
]));
|
|
1495
|
+
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
|
|
1496
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1497
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1498
|
+
]));
|
|
1499
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
|
|
1500
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1501
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1502
|
+
]));
|
|
1503
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
|
|
1504
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1505
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1506
|
+
]));
|
|
1507
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
|
|
1508
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1509
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1510
|
+
]));
|
|
1511
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
|
|
1512
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1513
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1514
|
+
]));
|
|
1515
|
+
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
|
|
1516
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1517
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1518
|
+
]));
|
|
1519
|
+
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
|
|
1520
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1521
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1522
|
+
]));
|
|
1523
|
+
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
|
|
1524
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1525
|
+
]));
|
|
1526
|
+
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
|
|
1527
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1528
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
|
|
1529
|
+
]));
|
|
1530
|
+
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1531
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1532
|
+
]));
|
|
1533
|
+
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1534
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1535
|
+
]));
|
|
1536
|
+
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
|
|
1537
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1538
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
1539
|
+
]));
|
|
1540
|
+
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
|
|
1541
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1542
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1543
|
+
]));
|
|
1544
|
+
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
|
|
1545
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1546
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1547
|
+
]));
|
|
1548
|
+
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
|
|
1549
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1550
|
+
]));
|
|
1551
|
+
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
|
|
1552
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1553
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
|
|
1554
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
|
|
1555
|
+
]));
|
|
1556
|
+
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
|
|
1557
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
|
|
1558
|
+
]));
|
|
1559
|
+
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
|
|
1560
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1561
|
+
]));
|
|
1562
|
+
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
|
|
1563
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1564
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
|
|
1565
|
+
]));
|
|
1566
|
+
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
|
|
1567
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
|
|
1568
|
+
]));
|
|
1432
1569
|
// TODO: Escrever algum tipo de validação aqui.
|
|
1433
1570
|
for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
|
|
1434
1571
|
for (const [nomeTipo, tipo] of Object.entries(tipos)) {
|
|
1435
|
-
this.pilhaEscopos.
|
|
1572
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeTipo, tipo));
|
|
1436
1573
|
}
|
|
1437
1574
|
}
|
|
1438
1575
|
}
|
|
@@ -1459,6 +1596,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1459
1596
|
}
|
|
1460
1597
|
if (this.performance) {
|
|
1461
1598
|
const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
|
|
1599
|
+
// eslint-disable-next-line no-undef
|
|
1462
1600
|
console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
|
|
1463
1601
|
}
|
|
1464
1602
|
return {
|