@designliquido/delegua 0.41.7 → 0.42.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/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +33 -18
- 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 +185 -55
- 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 +5 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.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 +3 -2
- 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 +6 -4
- 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 +18 -11
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +45 -22
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/index.js +0 -1
- package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +4 -2
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +4 -2
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +42 -14
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +62 -20
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +3 -1
- package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
- package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
- package/construtos/acesso-metodo.d.ts +2 -2
- package/construtos/acesso-propriedade.d.ts +2 -2
- package/construtos/acesso-propriedade.d.ts.map +1 -1
- package/construtos/acesso-propriedade.js.map +1 -1
- package/construtos/argumento-referencia-funcao.d.ts +2 -2
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js.map +1 -1
- package/construtos/componente-linguagem.d.ts +2 -2
- package/construtos/componente-linguagem.js +1 -1
- package/construtos/referencia-funcao.d.ts +2 -2
- package/construtos/super.d.ts.map +1 -1
- package/construtos/super.js.map +1 -1
- package/inferenciador.d.ts.map +1 -1
- package/inferenciador.js.map +1 -1
- 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/construtos/index.d.ts +2 -2
- package/interfaces/primitiva-interface.d.ts +2 -0
- package/interfaces/primitiva-interface.d.ts.map +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +2 -0
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +1 -1
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +6 -3
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +4 -4
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +2 -2
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +3 -3
- package/interpretador/pilha-escopos-execucao.js.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/package.json +3 -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/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/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +2 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +18 -13
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +8 -8
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +6 -6
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +830 -495
- 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,20 +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['
|
|
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');
|
|
58
62
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
59
63
|
}
|
|
60
64
|
verificarDefinicaoTipoAtual() {
|
|
@@ -163,6 +167,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
163
167
|
}
|
|
164
168
|
const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valores);
|
|
165
169
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, valores.length, tipoVetor);
|
|
170
|
+
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
171
|
+
let valor = '';
|
|
172
|
+
let linhaAtual = this.simbolos[this.atual].linha;
|
|
173
|
+
let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
|
|
174
|
+
.length %
|
|
175
|
+
2 ===
|
|
176
|
+
0;
|
|
177
|
+
if (eParExpressaoRegular) {
|
|
178
|
+
this.avancarEDevolverAnterior();
|
|
179
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
|
|
180
|
+
valor += this.simbolos[this.atual].lexema || '';
|
|
181
|
+
this.avancarEDevolverAnterior();
|
|
182
|
+
}
|
|
183
|
+
this.avancarEDevolverAnterior();
|
|
184
|
+
return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
|
|
185
|
+
}
|
|
166
186
|
case delegua_2.default.FALSO:
|
|
167
187
|
this.avancarEDevolverAnterior();
|
|
168
188
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false, 'lógico');
|
|
@@ -170,7 +190,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
170
190
|
case delegua_2.default.FUNÇÃO:
|
|
171
191
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
172
192
|
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
173
|
-
this.pilhaEscopos.
|
|
193
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
|
|
174
194
|
return corpoDaFuncao;
|
|
175
195
|
case delegua_2.default.IDENTIFICADOR:
|
|
176
196
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
@@ -200,6 +220,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
200
220
|
this.avancarEDevolverAnterior();
|
|
201
221
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
|
|
202
222
|
case delegua_2.default.NUMERO:
|
|
223
|
+
case delegua_2.default.NÚMERO:
|
|
203
224
|
case delegua_2.default.TEXTO:
|
|
204
225
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
205
226
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
@@ -283,33 +304,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
283
304
|
}
|
|
284
305
|
}
|
|
285
306
|
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
|
|
286
|
-
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
287
|
-
let valor = '';
|
|
288
|
-
let linhaAtual = this.simbolos[this.atual].linha;
|
|
289
|
-
let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
|
|
290
|
-
.length %
|
|
291
|
-
2 ===
|
|
292
|
-
0;
|
|
293
|
-
if (eParExpressaoRegular) {
|
|
294
|
-
this.avancarEDevolverAnterior();
|
|
295
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
|
|
296
|
-
valor += this.simbolos[this.atual].lexema || '';
|
|
297
|
-
this.avancarEDevolverAnterior();
|
|
298
|
-
}
|
|
299
|
-
this.avancarEDevolverAnterior();
|
|
300
|
-
return new construtos_1.ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
|
|
301
|
-
}
|
|
302
307
|
}
|
|
303
308
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
304
309
|
}
|
|
305
310
|
chamar() {
|
|
306
311
|
let expressao = this.primario();
|
|
307
312
|
while (true) {
|
|
313
|
+
let tipoPrimitiva = undefined;
|
|
308
314
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
309
|
-
expressao = this.finalizarChamada(expressao);
|
|
315
|
+
expressao = this.finalizarChamada(expressao, tipoPrimitiva);
|
|
310
316
|
}
|
|
311
317
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
|
|
312
318
|
const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
|
|
319
|
+
tipoPrimitiva = expressao.tipo;
|
|
313
320
|
expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressao, nome);
|
|
314
321
|
}
|
|
315
322
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_ESQUERDO)) {
|
|
@@ -373,10 +380,59 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
373
380
|
}
|
|
374
381
|
return entidadeChamadaResolvida;
|
|
375
382
|
}
|
|
376
|
-
|
|
383
|
+
validarArgumentosEntidadeChamada(argumentosEntidadeChamada, argumentosUtilizados) {
|
|
384
|
+
if (argumentosEntidadeChamada.length === 0) {
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
const possiveisErros = [];
|
|
388
|
+
for (const [indice, argumentoEntidadeChamada] of argumentosEntidadeChamada.entries()) {
|
|
389
|
+
const argumentoUtilizado = argumentosUtilizados[indice];
|
|
390
|
+
if (argumentoUtilizado.tipo === null || argumentoUtilizado.tipo === undefined) {
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
const argumentoEntidadeChamadaVetor = argumentoEntidadeChamada.tipo.endsWith('[]');
|
|
394
|
+
const argumentoUtilizadoVetor = argumentoUtilizado.tipo.endsWith('[]');
|
|
395
|
+
if (argumentoEntidadeChamadaVetor !== argumentoUtilizadoVetor) {
|
|
396
|
+
possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const argumentoEntidadeChamadaQualquer = argumentoEntidadeChamada.tipo.startsWith('qualquer');
|
|
400
|
+
if (argumentoEntidadeChamadaQualquer) {
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
if (argumentoUtilizado.tipo !== argumentoEntidadeChamada.tipo) {
|
|
404
|
+
possiveisErros.push(`Argumento: ${argumentoEntidadeChamada.nome}. Tipo esperado: ${argumentoEntidadeChamada.tipo}; Tipo utilizado: ${argumentoUtilizado.tipo}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return possiveisErros;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Diversas verificações de resolução de entidade chamada, como resolver chamada da pilha ou usar referência, argumentos, etc.
|
|
411
|
+
* @param entidadeChamada O construto da entidade chamada.
|
|
412
|
+
* @param argumentos Os argumentos utilizados na chamada.
|
|
413
|
+
* @param tipoPrimitiva Se for uma primitiva, o tipo dela. Senão, `undefined`.
|
|
414
|
+
* @returns A entidade chamada resolvida, se as validações passarem.
|
|
415
|
+
*/
|
|
416
|
+
resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
|
|
377
417
|
if (entidadeChamada.constructor.name === 'Variavel') {
|
|
378
418
|
const entidadeChamadaResolvidaVariavel = entidadeChamada;
|
|
379
|
-
if (
|
|
419
|
+
if (tipoPrimitiva === undefined) {
|
|
420
|
+
// Provavelmente uma chamada a alguma função da biblioteca global.
|
|
421
|
+
const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
|
|
422
|
+
if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
|
|
423
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
|
|
424
|
+
if (erros.length > 0) {
|
|
425
|
+
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`, '')}`);
|
|
426
|
+
}
|
|
427
|
+
return entidadeChamadaResolvidaVariavel;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (tipoPrimitiva !== undefined && this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
|
|
431
|
+
var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
|
|
432
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
|
|
433
|
+
if (erros.length > 0) {
|
|
434
|
+
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`, '')}`);
|
|
435
|
+
}
|
|
380
436
|
return entidadeChamadaResolvidaVariavel;
|
|
381
437
|
}
|
|
382
438
|
if (entidadeChamadaResolvidaVariavel.simbolo.lexema in this.tiposDefinidosEmCodigo) {
|
|
@@ -393,7 +449,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
393
449
|
}
|
|
394
450
|
return entidadeChamada;
|
|
395
451
|
}
|
|
396
|
-
finalizarChamada(entidadeChamada) {
|
|
452
|
+
finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
|
|
397
453
|
const argumentos = [];
|
|
398
454
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
399
455
|
do {
|
|
@@ -406,7 +462,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
406
462
|
}
|
|
407
463
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
408
464
|
// Toda chamada precisa saber de antemão qual o tipo resolvido.
|
|
409
|
-
const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada);
|
|
465
|
+
const entidadeChamadaResolvida = this.resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva);
|
|
410
466
|
// TODO: Criar forma de validar tipos dos argumentos da entidade chamada.
|
|
411
467
|
const construtoChamada = new construtos_1.Chamada(this.hashArquivo, entidadeChamadaResolvida, argumentos);
|
|
412
468
|
construtoChamada.tipo = 'qualquer';
|
|
@@ -756,7 +812,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
756
812
|
if (!tipoVetor.endsWith('[]')) {
|
|
757
813
|
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
|
|
758
814
|
}
|
|
759
|
-
this.pilhaEscopos.
|
|
815
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
|
|
760
816
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
761
817
|
const corpo = this.resolverDeclaracao();
|
|
762
818
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
|
|
@@ -995,7 +1051,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
995
1051
|
default:
|
|
996
1052
|
break;
|
|
997
1053
|
}
|
|
998
|
-
this.pilhaEscopos.
|
|
1054
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloNomeVariavel.lexema, tipoInicializacao));
|
|
999
1055
|
const blocoCorpo = this.blocoEscopo();
|
|
1000
1056
|
return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
|
|
1001
1057
|
}
|
|
@@ -1009,7 +1065,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1009
1065
|
const inicializador = this.expressao();
|
|
1010
1066
|
const retornos = [];
|
|
1011
1067
|
for (let identificador of identificadores) {
|
|
1012
|
-
this.pilhaEscopos.
|
|
1068
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
|
|
1013
1069
|
const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1014
1070
|
declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
|
|
1015
1071
|
retornos.push(declaracaoVar);
|
|
@@ -1085,7 +1141,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1085
1141
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1086
1142
|
// Inicialização de variáveis sem valor.
|
|
1087
1143
|
for (let identificador of identificadores.values()) {
|
|
1088
|
-
this.pilhaEscopos.
|
|
1144
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1089
1145
|
retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
|
|
1090
1146
|
}
|
|
1091
1147
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1102,7 +1158,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1102
1158
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1103
1159
|
// Se tipo ainda não foi definido, infere.
|
|
1104
1160
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1105
|
-
this.pilhaEscopos.
|
|
1161
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1106
1162
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1107
1163
|
}
|
|
1108
1164
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1120,7 +1176,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1120
1176
|
const retornos = [];
|
|
1121
1177
|
for (let identificador of identificadores) {
|
|
1122
1178
|
// TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
|
|
1123
|
-
this.pilhaEscopos.
|
|
1179
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, 'qualquer'));
|
|
1124
1180
|
const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1125
1181
|
declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
|
|
1126
1182
|
retornos.push(declaracaoConst);
|
|
@@ -1156,7 +1212,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1156
1212
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1157
1213
|
// Se tipo ainda não foi definido, infere.
|
|
1158
1214
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1159
|
-
this.pilhaEscopos.
|
|
1215
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1160
1216
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1161
1217
|
}
|
|
1162
1218
|
this.pilhaDecoradores = [];
|
|
@@ -1177,9 +1233,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1177
1233
|
this.pilhaDecoradores = [];
|
|
1178
1234
|
// Se houver chamadas recursivas à função, precisamos definir um tipo
|
|
1179
1235
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
1180
|
-
this.pilhaEscopos.
|
|
1236
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, 'qualquer'));
|
|
1181
1237
|
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
1182
|
-
this.pilhaEscopos.
|
|
1238
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simbolo.lexema, corpoDaFuncao.tipo));
|
|
1183
1239
|
const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipo, decoradores);
|
|
1184
1240
|
this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
|
|
1185
1241
|
return funcaoDeclaracao;
|
|
@@ -1205,7 +1261,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1205
1261
|
parametro.tipoDado = tipoDadoParametro;
|
|
1206
1262
|
this.avancarEDevolverAnterior();
|
|
1207
1263
|
}
|
|
1208
|
-
this.pilhaEscopos.
|
|
1264
|
+
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
1209
1265
|
parametros.push(parametro);
|
|
1210
1266
|
if (parametro.abrangencia === 'multiplo')
|
|
1211
1267
|
break;
|
|
@@ -1408,26 +1464,99 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1408
1464
|
this.avancarEDevolverAnterior();
|
|
1409
1465
|
}
|
|
1410
1466
|
}
|
|
1467
|
+
/**
|
|
1468
|
+
* Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
|
|
1469
|
+
* TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
|
|
1470
|
+
*/
|
|
1411
1471
|
inicializarPilhaEscopos() {
|
|
1412
1472
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
1413
1473
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
1414
1474
|
// Funções nativas de Delégua
|
|
1415
|
-
this.pilhaEscopos.
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
this.pilhaEscopos.
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
this.pilhaEscopos.
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
this.pilhaEscopos.
|
|
1475
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
|
|
1476
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
|
|
1477
|
+
]));
|
|
1478
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
|
|
1479
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
|
|
1480
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
|
|
1481
|
+
]));
|
|
1482
|
+
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
|
|
1483
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1484
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1485
|
+
]));
|
|
1486
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
|
|
1487
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1488
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1489
|
+
]));
|
|
1490
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
|
|
1491
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1492
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1493
|
+
]));
|
|
1494
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
|
|
1495
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1496
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1497
|
+
]));
|
|
1498
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
|
|
1499
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1500
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1501
|
+
]));
|
|
1502
|
+
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
|
|
1503
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1504
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1505
|
+
]));
|
|
1506
|
+
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
|
|
1507
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1508
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1509
|
+
]));
|
|
1510
|
+
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
|
|
1511
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1512
|
+
]));
|
|
1513
|
+
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
|
|
1514
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1515
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
|
|
1516
|
+
]));
|
|
1517
|
+
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1518
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1519
|
+
]));
|
|
1520
|
+
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1521
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1522
|
+
]));
|
|
1523
|
+
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
|
|
1524
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1525
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
1526
|
+
]));
|
|
1527
|
+
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
|
|
1528
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1529
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1530
|
+
]));
|
|
1531
|
+
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
|
|
1532
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1533
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1534
|
+
]));
|
|
1535
|
+
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
|
|
1536
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1537
|
+
]));
|
|
1538
|
+
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
|
|
1539
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1540
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
|
|
1541
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
|
|
1542
|
+
]));
|
|
1543
|
+
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
|
|
1544
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
|
|
1545
|
+
]));
|
|
1546
|
+
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
|
|
1547
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1548
|
+
]));
|
|
1549
|
+
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
|
|
1550
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1551
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
|
|
1552
|
+
]));
|
|
1553
|
+
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
|
|
1554
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
|
|
1555
|
+
]));
|
|
1427
1556
|
// TODO: Escrever algum tipo de validação aqui.
|
|
1428
1557
|
for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
|
|
1429
1558
|
for (const [nomeTipo, tipo] of Object.entries(tipos)) {
|
|
1430
|
-
this.pilhaEscopos.
|
|
1559
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeTipo, tipo));
|
|
1431
1560
|
}
|
|
1432
1561
|
}
|
|
1433
1562
|
}
|
|
@@ -1454,6 +1583,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1454
1583
|
}
|
|
1455
1584
|
if (this.performance) {
|
|
1456
1585
|
const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
|
|
1586
|
+
// eslint-disable-next-line no-undef
|
|
1457
1587
|
console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
|
|
1458
1588
|
}
|
|
1459
1589
|
return {
|