@designliquido/delegua 0.53.2 → 0.54.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/avaliador-sintatico/avaliador-sintatico.d.ts +17 -8
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +187 -130
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/comum.d.ts +2 -2
- package/avaliador-sintatico/comum.d.ts.map +1 -1
- package/avaliador-sintatico/comum.js +2 -2
- package/avaliador-sintatico/comum.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +65 -65
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts +3 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +19 -19
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/avaliador-sintatico/elemento-montao-tipos.d.ts +11 -0
- package/avaliador-sintatico/elemento-montao-tipos.d.ts.map +1 -0
- package/avaliador-sintatico/elemento-montao-tipos.js +11 -0
- package/avaliador-sintatico/elemento-montao-tipos.js.map +1 -0
- package/avaliador-sintatico/informacao-escopo.d.ts +4 -3
- package/avaliador-sintatico/informacao-escopo.d.ts.map +1 -1
- package/avaliador-sintatico/informacao-escopo.js +1 -1
- package/avaliador-sintatico/informacao-escopo.js.map +1 -1
- package/avaliador-sintatico/montao-tipos.d.ts +33 -0
- package/avaliador-sintatico/montao-tipos.d.ts.map +1 -0
- package/avaliador-sintatico/montao-tipos.js +50 -0
- package/avaliador-sintatico/montao-tipos.js.map +1 -0
- package/avaliador-sintatico/pilha-escopos.d.ts +5 -3
- package/avaliador-sintatico/pilha-escopos.d.ts.map +1 -1
- package/avaliador-sintatico/pilha-escopos.js +18 -4
- package/avaliador-sintatico/pilha-escopos.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +3 -3
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.js +2 -2
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.js +11 -11
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +19 -18
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-metodo-ou-propriedade.js +1 -1
- package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
- package/construtos/dicionario.d.ts +2 -2
- package/construtos/dicionario.d.ts.map +1 -1
- package/construtos/dicionario.js.map +1 -1
- package/depuracao/index.d.ts +0 -1
- package/depuracao/index.d.ts.map +1 -1
- package/depuracao/index.js +0 -6
- package/depuracao/index.js.map +1 -1
- package/geracao-identificadores/index.d.ts +9 -0
- package/geracao-identificadores/index.d.ts.map +1 -1
- package/geracao-identificadores/index.js +20 -0
- package/geracao-identificadores/index.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/index.js +1 -3
- package/index.js.map +1 -1
- package/informacao-elemento-sintatico.d.ts +11 -0
- package/informacao-elemento-sintatico.d.ts.map +1 -0
- package/informacao-elemento-sintatico.js +18 -0
- package/informacao-elemento-sintatico.js.map +1 -0
- package/interfaces/primitiva-interface.d.ts +2 -2
- package/interfaces/primitiva-interface.d.ts.map +1 -1
- package/interpretador/interpretador-base.d.ts +2 -2
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +3 -3
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +1 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +34 -15
- package/interpretador/interpretador.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +4 -2
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-javascript.js +2 -0
- package/tradutores/tradutor-reverso-javascript.js.map +1 -1
- package/umd/delegua.js +873 -750
- package/depuracao/cyrb53.d.ts +0 -10
- package/depuracao/cyrb53.d.ts.map +0 -1
- package/depuracao/cyrb53.js +0 -23
- package/depuracao/cyrb53.js.map +0 -1
- package/informacao-variavel-ou-constante.d.ts +0 -10
- package/informacao-variavel-ou-constante.d.ts.map +0 -1
- package/informacao-variavel-ou-constante.js +0 -18
- package/informacao-variavel-ou-constante.js.map +0 -1
|
@@ -13,14 +13,16 @@ 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
|
|
16
|
+
const informacao_elemento_sintatico_1 = require("../informacao-elemento-sintatico");
|
|
17
17
|
const comum_1 = require("./comum");
|
|
18
|
+
const montao_tipos_1 = require("./montao-tipos");
|
|
18
19
|
const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
|
|
19
20
|
const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
20
21
|
const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
|
|
21
22
|
const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
|
|
22
23
|
const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
|
|
23
24
|
const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
|
|
25
|
+
const elemento_montao_tipos_1 = require("./elemento-montao-tipos");
|
|
24
26
|
/**
|
|
25
27
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
26
28
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
@@ -31,11 +33,14 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
|
|
|
31
33
|
*
|
|
32
34
|
* Este é o avaliador sintático de Delégua que, assim como todos os demais dialetos baseados
|
|
33
35
|
* neste núcleo, são uma derivação do avaliador sintático base. Aqui estão implementadas várias mecânicas
|
|
34
|
-
* a mais relacionadas a tipagem e registros de bibliotecas externas
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* registro de
|
|
38
|
-
*
|
|
36
|
+
* a mais relacionadas a tipagem e registros de bibliotecas externas:
|
|
37
|
+
*
|
|
38
|
+
* - `tiposDeFerramentasExternas` é utilizada em [Liquido](https://github.com/DesignLiquido/liquido)
|
|
39
|
+
* para registro de tipos exclusivos de Liquido, como classes de requisição e resposta;
|
|
40
|
+
* - `primitivasConhecidas` é utilizada aqui para registro de métodos relacionados a tipos, e também
|
|
41
|
+
* para as bibliotecas externas de Delégua registrarem suas respectivas resoluções de tipos;
|
|
42
|
+
* - `montaoTipos` é uma implementação de montão muito semelhante ao montão do interpretador, para
|
|
43
|
+
* tipos complexos com N níveis de profundidade, como dicionários e objetos.
|
|
39
44
|
*/
|
|
40
45
|
class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
41
46
|
constructor(performance = false) {
|
|
@@ -48,11 +53,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
48
53
|
this.tiposDefinidosEmCodigo = {};
|
|
49
54
|
this.tiposDeFerramentasExternas = {};
|
|
50
55
|
this.primitivasConhecidas = {};
|
|
56
|
+
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
57
|
+
this.montaoTipos = new montao_tipos_1.MontaoTipos();
|
|
51
58
|
(0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'dicionário', primitivas_dicionario_1.default);
|
|
52
59
|
(0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'número', primitivas_numero_1.default);
|
|
53
60
|
(0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'texto', primitivas_texto_1.default);
|
|
54
61
|
(0, comum_1.registrarPrimitiva)(this.primitivasConhecidas, 'vetor', primitivas_vetor_1.default);
|
|
55
|
-
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
56
62
|
}
|
|
57
63
|
verificarDefinicaoTipoAtual() {
|
|
58
64
|
const tipos = [...Object.values(delegua_1.default)];
|
|
@@ -272,7 +278,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
272
278
|
case delegua_2.default.FUNÇÃO:
|
|
273
279
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
274
280
|
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
275
|
-
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new
|
|
281
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloFuncao.lexema, 'função'));
|
|
276
282
|
return corpoDaFuncao;
|
|
277
283
|
case delegua_2.default.IDENTIFICADOR:
|
|
278
284
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
@@ -399,28 +405,43 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
399
405
|
}
|
|
400
406
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
401
407
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
408
|
+
resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
|
|
409
|
+
if (!this.simbolos[this.atual]) {
|
|
410
|
+
return expressaoAnterior;
|
|
411
|
+
}
|
|
412
|
+
switch (this.simbolos[this.atual].tipo) {
|
|
413
|
+
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
414
|
+
this.avancarEDevolverAnterior();
|
|
415
|
+
const chamada = this.finalizarChamada(expressaoAnterior, tipoAnterior);
|
|
416
|
+
return this.resolverCadeiaChamadas(chamada);
|
|
417
|
+
case delegua_2.default.PONTO:
|
|
418
|
+
this.avancarEDevolverAnterior();
|
|
410
419
|
const nome = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de método ou propriedade após '.'.");
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
420
|
+
let tipoInferido = expressaoAnterior.tipo;
|
|
421
|
+
// Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
|
|
422
|
+
if (expressaoAnterior.tipo === 'dicionário' && expressaoAnterior.constructor !== construtos_1.Dicionario) {
|
|
423
|
+
const nomeDicionario = expressaoAnterior.simbolo.lexema;
|
|
424
|
+
const elementoDicionarioPilha = this.pilhaEscopos.obterElementoMontaoTipos(nomeDicionario);
|
|
425
|
+
const referenciaMontaoTipos = this.montaoTipos.obterReferencia(expressaoAnterior.hashArquivo, expressaoAnterior.linha, elementoDicionarioPilha.endereco);
|
|
426
|
+
if (nome.lexema in referenciaMontaoTipos.subElementos) {
|
|
427
|
+
tipoInferido = referenciaMontaoTipos.subElementos[nome.lexema].tipo;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
|
|
431
|
+
return this.resolverCadeiaChamadas(acesso, tipoInferido);
|
|
432
|
+
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
433
|
+
this.avancarEDevolverAnterior();
|
|
415
434
|
const indice = this.expressao();
|
|
416
435
|
const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}
|
|
436
|
+
const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento);
|
|
437
|
+
return this.resolverCadeiaChamadas(acessoVariavel);
|
|
438
|
+
default:
|
|
439
|
+
return expressaoAnterior;
|
|
422
440
|
}
|
|
423
|
-
|
|
441
|
+
}
|
|
442
|
+
chamar() {
|
|
443
|
+
let expressao = this.primario();
|
|
444
|
+
return this.resolverCadeiaChamadas(expressao);
|
|
424
445
|
}
|
|
425
446
|
/**
|
|
426
447
|
* `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
|
|
@@ -527,23 +548,24 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
527
548
|
* @returns A entidade chamada resolvida, se as validações passarem.
|
|
528
549
|
*/
|
|
529
550
|
resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
|
|
530
|
-
if (entidadeChamada.constructor
|
|
551
|
+
if (entidadeChamada.constructor === construtos_1.Variavel) {
|
|
531
552
|
const entidadeChamadaResolvidaVariavel = entidadeChamada;
|
|
532
|
-
if (tipoPrimitiva ===
|
|
553
|
+
if (tipoPrimitiva === 'qualquer') {
|
|
533
554
|
// Provavelmente uma chamada a alguma função da biblioteca global.
|
|
555
|
+
// Até então, é sempre do tipo `InformacaoElementoSintatico`.
|
|
534
556
|
const informacoesPossivelFuncaoBibliotecaGlobal = this.pilhaEscopos.obterBibliotecaGlobal(entidadeChamadaResolvidaVariavel.simbolo.lexema);
|
|
535
557
|
if (informacoesPossivelFuncaoBibliotecaGlobal) {
|
|
536
|
-
const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.
|
|
558
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.subElementos, argumentos);
|
|
537
559
|
if (erros.length > 0) {
|
|
538
560
|
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`), '')}`);
|
|
539
561
|
}
|
|
540
562
|
return entidadeChamadaResolvidaVariavel;
|
|
541
563
|
}
|
|
542
564
|
}
|
|
543
|
-
if (tipoPrimitiva !==
|
|
565
|
+
if (tipoPrimitiva !== 'qualquer' &&
|
|
544
566
|
this.primitivasConhecidas[tipoPrimitiva].hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
|
|
545
567
|
var informacoesPrimitiva = this.primitivasConhecidas[tipoPrimitiva][entidadeChamadaResolvidaVariavel.simbolo.lexema];
|
|
546
|
-
const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.
|
|
568
|
+
const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.subElementos, argumentos);
|
|
547
569
|
if (erros.length > 0) {
|
|
548
570
|
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`), '')}`);
|
|
549
571
|
}
|
|
@@ -554,11 +576,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
554
576
|
}
|
|
555
577
|
const possivelReferencia = this.pilhaEscopos.obterReferenciaFuncao(entidadeChamadaResolvidaVariavel.simbolo.lexema);
|
|
556
578
|
if (possivelReferencia !== null) {
|
|
557
|
-
return new construtos_1.ReferenciaFuncao(
|
|
579
|
+
return new construtos_1.ReferenciaFuncao(entidadeChamadaResolvidaVariavel.hashArquivo, entidadeChamadaResolvidaVariavel.linha, entidadeChamadaResolvidaVariavel.simbolo, entidadeChamadaResolvidaVariavel.tipo, possivelReferencia.id);
|
|
558
580
|
}
|
|
559
|
-
return new construtos_1.ArgumentoReferenciaFuncao(
|
|
581
|
+
return new construtos_1.ArgumentoReferenciaFuncao(entidadeChamadaResolvidaVariavel.hashArquivo, entidadeChamadaResolvidaVariavel.linha, entidadeChamadaResolvidaVariavel.simbolo);
|
|
560
582
|
}
|
|
561
|
-
if (entidadeChamada.constructor
|
|
583
|
+
if (entidadeChamada.constructor === construtos_1.AcessoMetodoOuPropriedade) {
|
|
562
584
|
return this.resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamada);
|
|
563
585
|
}
|
|
564
586
|
return entidadeChamada;
|
|
@@ -947,8 +969,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
947
969
|
if (tipoDicionario !== 'dicionário') {
|
|
948
970
|
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é um dicionário. Tipo resolvido: ${tipoDicionario}.`);
|
|
949
971
|
}
|
|
950
|
-
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new
|
|
951
|
-
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new
|
|
972
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
|
|
973
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
|
|
952
974
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
953
975
|
const corpo = this.resolverDeclaracao();
|
|
954
976
|
return {
|
|
@@ -980,7 +1002,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
980
1002
|
if (tipoVetor.endsWith('[]')) {
|
|
981
1003
|
tipoVariavelIteracao = tipoVetor.slice(0, -2);
|
|
982
1004
|
}
|
|
983
|
-
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new
|
|
1005
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
|
|
984
1006
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
985
1007
|
const corpo = this.resolverDeclaracao();
|
|
986
1008
|
return {
|
|
@@ -1245,7 +1267,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1245
1267
|
default:
|
|
1246
1268
|
break;
|
|
1247
1269
|
}
|
|
1248
|
-
this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new
|
|
1270
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloNomeVariavel.lexema, tipoInicializacao));
|
|
1249
1271
|
const blocoCorpo = this.blocoEscopo();
|
|
1250
1272
|
return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
|
|
1251
1273
|
}
|
|
@@ -1259,7 +1281,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1259
1281
|
const inicializador = this.expressao();
|
|
1260
1282
|
const retornos = [];
|
|
1261
1283
|
for (let identificador of identificadores) {
|
|
1262
|
-
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new
|
|
1284
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
|
|
1263
1285
|
const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1264
1286
|
declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
|
|
1265
1287
|
retornos.push(declaracaoVar);
|
|
@@ -1271,12 +1293,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1271
1293
|
if (tipo !== 'qualquer') {
|
|
1272
1294
|
return tipo;
|
|
1273
1295
|
}
|
|
1274
|
-
switch (inicializador.constructor
|
|
1275
|
-
case
|
|
1296
|
+
switch (inicializador.constructor) {
|
|
1297
|
+
case construtos_1.AcessoIndiceVariavel:
|
|
1276
1298
|
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
1277
1299
|
.entidadeChamada;
|
|
1278
1300
|
// Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
|
|
1279
|
-
if (entidadeChamadaAcessoIndiceVariavel.constructor
|
|
1301
|
+
if (entidadeChamadaAcessoIndiceVariavel.constructor === construtos_1.AcessoIndiceVariavel) {
|
|
1280
1302
|
return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
|
|
1281
1303
|
}
|
|
1282
1304
|
if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
|
|
@@ -1284,13 +1306,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1284
1306
|
}
|
|
1285
1307
|
// Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
|
|
1286
1308
|
return 'qualquer';
|
|
1287
|
-
case
|
|
1309
|
+
case construtos_1.Chamada:
|
|
1288
1310
|
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
1289
|
-
switch (entidadeChamadaChamada.constructor
|
|
1290
|
-
case
|
|
1311
|
+
switch (entidadeChamadaChamada.constructor) {
|
|
1312
|
+
case construtos_1.AcessoMetodo:
|
|
1291
1313
|
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
1292
1314
|
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
1293
|
-
case
|
|
1315
|
+
case construtos_1.AcessoMetodoOuPropriedade:
|
|
1294
1316
|
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
1295
1317
|
// e a chamada normalmente é feita para uma primitiva.
|
|
1296
1318
|
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
@@ -1301,42 +1323,70 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1301
1323
|
}
|
|
1302
1324
|
}
|
|
1303
1325
|
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
|
|
1304
|
-
case
|
|
1326
|
+
case construtos_1.AcessoPropriedade:
|
|
1305
1327
|
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
1306
1328
|
return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
1307
|
-
case
|
|
1329
|
+
case construtos_1.ArgumentoReferenciaFuncao:
|
|
1308
1330
|
// TODO: Voltar aqui se necessário.
|
|
1309
1331
|
return 'qualquer';
|
|
1310
|
-
case
|
|
1332
|
+
case construtos_1.ReferenciaFuncao:
|
|
1311
1333
|
const entidadeChamadaReferenciaFuncao = entidadeChamadaChamada;
|
|
1312
1334
|
return entidadeChamadaReferenciaFuncao.tipo;
|
|
1313
|
-
case
|
|
1335
|
+
case construtos_1.Variavel:
|
|
1314
1336
|
const entidadeChamadaVariavel = entidadeChamadaChamada;
|
|
1315
1337
|
return entidadeChamadaVariavel.tipo;
|
|
1316
1338
|
}
|
|
1317
1339
|
break;
|
|
1318
|
-
case
|
|
1340
|
+
case construtos_1.FuncaoConstruto:
|
|
1319
1341
|
const funcaoConstruto = inicializador;
|
|
1320
1342
|
return `função<${funcaoConstruto.tipo}>`;
|
|
1321
|
-
case
|
|
1343
|
+
case construtos_1.Leia:
|
|
1322
1344
|
return 'texto';
|
|
1323
|
-
case
|
|
1324
|
-
case
|
|
1325
|
-
case
|
|
1326
|
-
case
|
|
1327
|
-
case
|
|
1328
|
-
case
|
|
1329
|
-
case
|
|
1330
|
-
case
|
|
1331
|
-
case
|
|
1345
|
+
case tuplas_1.Dupla:
|
|
1346
|
+
case tuplas_1.Trio:
|
|
1347
|
+
case tuplas_1.Quarteto:
|
|
1348
|
+
case tuplas_1.Quinteto:
|
|
1349
|
+
case tuplas_1.Sexteto:
|
|
1350
|
+
case tuplas_1.Septeto:
|
|
1351
|
+
case tuplas_1.Octeto:
|
|
1352
|
+
case tuplas_1.Noneto:
|
|
1353
|
+
case tuplas_1.Deceto:
|
|
1332
1354
|
return delegua_1.default.TUPLA;
|
|
1333
|
-
case 'ImportarBiblioteca':
|
|
1334
|
-
case 'ModuloDeclaracoes':
|
|
1335
|
-
return 'módulo';
|
|
1336
1355
|
default:
|
|
1356
|
+
// Construtos mapeados em `delegua-node`.
|
|
1357
|
+
switch (inicializador.constructor.name) {
|
|
1358
|
+
case 'ImportarBiblioteca':
|
|
1359
|
+
case 'ModuloDeclaracoes':
|
|
1360
|
+
return 'módulo';
|
|
1361
|
+
}
|
|
1337
1362
|
return inicializador.tipo;
|
|
1338
1363
|
}
|
|
1339
1364
|
}
|
|
1365
|
+
resolverValorConstruto(construto) {
|
|
1366
|
+
if (construto instanceof construtos_1.Literal) {
|
|
1367
|
+
return construto.valor;
|
|
1368
|
+
}
|
|
1369
|
+
throw this.erro({ hashArquivo: construto.hashArquivo, linha: construto.linha }, `Construto do tipo ${construto.constructor.name} não possui um mapeamento de valor.`);
|
|
1370
|
+
}
|
|
1371
|
+
resolverInformacaoElementoSintaticoDeDicionario(construto) {
|
|
1372
|
+
let retorno;
|
|
1373
|
+
if (construto instanceof construtos_1.Dicionario) {
|
|
1374
|
+
retorno = new elemento_montao_tipos_1.ElementoMontaoTipos('dicionário');
|
|
1375
|
+
const subElementos = {};
|
|
1376
|
+
for (var i = 0; i < construto.valores.length; i++) {
|
|
1377
|
+
const chaveCorrespondente = this.resolverValorConstruto(construto.chaves[i]);
|
|
1378
|
+
const valorCorrespondente = construto.valores[i];
|
|
1379
|
+
subElementos[chaveCorrespondente] = this.resolverInformacaoElementoSintaticoDeDicionario(valorCorrespondente);
|
|
1380
|
+
}
|
|
1381
|
+
retorno.subElementos = subElementos;
|
|
1382
|
+
const endereco = this.montaoTipos.adicionarReferencia(retorno);
|
|
1383
|
+
retorno.endereco = endereco;
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1386
|
+
retorno = new elemento_montao_tipos_1.ElementoMontaoTipos(construto.tipo);
|
|
1387
|
+
}
|
|
1388
|
+
return retorno;
|
|
1389
|
+
}
|
|
1340
1390
|
/**
|
|
1341
1391
|
* Caso símbolo atual seja `var`, devolve uma declaração de variável.
|
|
1342
1392
|
* @returns Um Construto do tipo Var.
|
|
@@ -1361,7 +1411,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1361
1411
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1362
1412
|
// Inicialização de variáveis sem valor.
|
|
1363
1413
|
for (let identificador of identificadores.values()) {
|
|
1364
|
-
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new
|
|
1414
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
1365
1415
|
retorno.push(new declaracoes_1.Var(identificador, null, tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
|
|
1366
1416
|
}
|
|
1367
1417
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1377,7 +1427,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1377
1427
|
}
|
|
1378
1428
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1379
1429
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1380
|
-
|
|
1430
|
+
if (tipo !== 'dicionário') {
|
|
1431
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
1432
|
+
}
|
|
1433
|
+
else {
|
|
1434
|
+
const inicializadorDicionario = inicializadores[indice];
|
|
1435
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, this.resolverInformacaoElementoSintaticoDeDicionario(inicializadorDicionario));
|
|
1436
|
+
}
|
|
1381
1437
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
|
|
1382
1438
|
}
|
|
1383
1439
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -1395,7 +1451,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1395
1451
|
const retornos = [];
|
|
1396
1452
|
for (let identificador of identificadores) {
|
|
1397
1453
|
// TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
|
|
1398
|
-
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new
|
|
1454
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, 'qualquer'));
|
|
1399
1455
|
const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1400
1456
|
declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
|
|
1401
1457
|
retornos.push(declaracaoConst);
|
|
@@ -1434,7 +1490,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1434
1490
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1435
1491
|
// Se tipo ainda não foi definido, infere.
|
|
1436
1492
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1437
|
-
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new
|
|
1493
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
1438
1494
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
|
|
1439
1495
|
}
|
|
1440
1496
|
this.pilhaDecoradores = [];
|
|
@@ -1455,10 +1511,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1455
1511
|
this.pilhaDecoradores = [];
|
|
1456
1512
|
// Se houver chamadas recursivas à função, precisamos definir um tipo
|
|
1457
1513
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
1458
|
-
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new
|
|
1514
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, 'qualquer'));
|
|
1459
1515
|
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
1460
1516
|
const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
|
|
1461
|
-
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new
|
|
1517
|
+
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, tipoDaFuncao));
|
|
1462
1518
|
const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao, decoradores);
|
|
1463
1519
|
this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
|
|
1464
1520
|
return funcaoDeclaracao;
|
|
@@ -1484,7 +1540,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1484
1540
|
parametro.tipoDado = tipoDadoParametro;
|
|
1485
1541
|
this.avancarEDevolverAnterior();
|
|
1486
1542
|
}
|
|
1487
|
-
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new
|
|
1543
|
+
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
1488
1544
|
parametros.push(parametro);
|
|
1489
1545
|
if (parametro.abrangencia === 'multiplo')
|
|
1490
1546
|
break;
|
|
@@ -1658,89 +1714,89 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1658
1714
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
1659
1715
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
1660
1716
|
// Funções nativas de Delégua
|
|
1661
|
-
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new
|
|
1662
|
-
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new
|
|
1663
|
-
new
|
|
1664
|
-
new
|
|
1717
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
|
|
1718
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
|
|
1719
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
|
|
1720
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
|
|
1665
1721
|
]));
|
|
1666
|
-
this.pilhaEscopos.definirInformacoesVariavel('algum', new
|
|
1667
|
-
new
|
|
1668
|
-
new
|
|
1722
|
+
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('algum', 'lógico', true, [
|
|
1723
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1724
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
1669
1725
|
]));
|
|
1670
|
-
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new
|
|
1671
|
-
new
|
|
1672
|
-
new
|
|
1726
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar', 'qualquer', true, [
|
|
1727
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1728
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
1673
1729
|
]));
|
|
1674
|
-
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new
|
|
1675
|
-
new
|
|
1676
|
-
new
|
|
1730
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarIndice', 'inteiro', true, [
|
|
1731
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1732
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
1677
1733
|
]));
|
|
1678
|
-
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new
|
|
1679
|
-
new
|
|
1680
|
-
new
|
|
1734
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
|
|
1735
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1736
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
1681
1737
|
]));
|
|
1682
|
-
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new
|
|
1683
|
-
new
|
|
1684
|
-
new
|
|
1738
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
|
|
1739
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1740
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
|
|
1685
1741
|
]));
|
|
1686
|
-
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new
|
|
1687
|
-
new
|
|
1688
|
-
new
|
|
1742
|
+
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
|
|
1743
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1744
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
1689
1745
|
]));
|
|
1690
|
-
this.pilhaEscopos.definirInformacoesVariavel('incluido', new
|
|
1691
|
-
new
|
|
1692
|
-
new
|
|
1746
|
+
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('incluido', 'lógico', true, [
|
|
1747
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1748
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
1693
1749
|
]));
|
|
1694
|
-
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new
|
|
1695
|
-
new
|
|
1750
|
+
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('inteiro', 'inteiro', true, [
|
|
1751
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
1696
1752
|
]));
|
|
1697
|
-
this.pilhaEscopos.definirInformacoesVariavel('mapear', new
|
|
1698
|
-
new
|
|
1699
|
-
new
|
|
1753
|
+
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('mapear', 'qualquer[]', true, [
|
|
1754
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1755
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoMapeamento', 'função'),
|
|
1700
1756
|
]));
|
|
1701
|
-
this.pilhaEscopos.definirInformacoesVariavel('numero', new
|
|
1702
|
-
new
|
|
1757
|
+
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
|
|
1758
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
1703
1759
|
]));
|
|
1704
|
-
this.pilhaEscopos.definirInformacoesVariavel('número', new
|
|
1705
|
-
new
|
|
1760
|
+
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
|
|
1761
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
1706
1762
|
]));
|
|
1707
|
-
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new
|
|
1708
|
-
new
|
|
1709
|
-
new
|
|
1763
|
+
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('ordenar', 'qualquer[]', true, [
|
|
1764
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1765
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoOrdenacao', 'função'),
|
|
1710
1766
|
]));
|
|
1711
|
-
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new
|
|
1712
|
-
new
|
|
1713
|
-
new
|
|
1767
|
+
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('paraCada', 'qualquer[]', true, [
|
|
1768
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1769
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
1714
1770
|
]));
|
|
1715
|
-
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new
|
|
1716
|
-
new
|
|
1717
|
-
new
|
|
1771
|
+
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondicao', 'qualquer', true, [
|
|
1772
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1773
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
|
|
1718
1774
|
]));
|
|
1719
|
-
this.pilhaEscopos.definirInformacoesVariavel('real', new
|
|
1720
|
-
new
|
|
1775
|
+
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('real', 'número', true, [
|
|
1776
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
1721
1777
|
]));
|
|
1722
|
-
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new
|
|
1723
|
-
new
|
|
1724
|
-
new
|
|
1725
|
-
new
|
|
1778
|
+
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('reduzir', 'qualquer', true, [
|
|
1779
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1780
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoReducao', 'função'),
|
|
1781
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorInicial', 'qualquer'),
|
|
1726
1782
|
]));
|
|
1727
|
-
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new
|
|
1728
|
-
new
|
|
1783
|
+
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tamanho', 'inteiro', true, [
|
|
1784
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('objeto', 'qualquer'),
|
|
1729
1785
|
]));
|
|
1730
|
-
this.pilhaEscopos.definirInformacoesVariavel('texto', new
|
|
1731
|
-
new
|
|
1786
|
+
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('texto', 'texto', true, [
|
|
1787
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
|
|
1732
1788
|
]));
|
|
1733
|
-
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new
|
|
1734
|
-
new
|
|
1735
|
-
new
|
|
1789
|
+
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
|
|
1790
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1791
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
|
|
1736
1792
|
]));
|
|
1737
|
-
this.pilhaEscopos.definirInformacoesVariavel('tupla', new
|
|
1738
|
-
new
|
|
1793
|
+
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
|
|
1794
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
|
|
1739
1795
|
]));
|
|
1740
1796
|
// TODO: Escrever algum tipo de validação aqui.
|
|
1741
1797
|
for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
|
|
1742
1798
|
for (const [nomeTipo, tipo] of Object.entries(tipos)) {
|
|
1743
|
-
this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new
|
|
1799
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeTipo, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeTipo, tipo));
|
|
1744
1800
|
}
|
|
1745
1801
|
}
|
|
1746
1802
|
}
|
|
@@ -1753,6 +1809,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1753
1809
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
1754
1810
|
this.pilhaDecoradores = [];
|
|
1755
1811
|
this.tiposDefinidosEmCodigo = {};
|
|
1812
|
+
this.montaoTipos = new montao_tipos_1.MontaoTipos();
|
|
1756
1813
|
this.inicializarPilhaEscopos();
|
|
1757
1814
|
let declaracoes = [];
|
|
1758
1815
|
while (!this.estaNoFinal()) {
|