@designliquido/delegua 0.42.3 → 0.43.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-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +7 -1
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/pilha-variaveis.d.ts.map +1 -1
- package/analisador-semantico/pilha-variaveis.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +0 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +48 -39
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +6 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +16 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +255 -56
- 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/micro-avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +6 -5
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +56 -22
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.js +5 -3
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/index.d.ts.map +1 -1
- package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/matematica.js +26 -8
- package/bibliotecas/dialetos/egua-classico/matematica.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +5 -7
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +15 -30
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-metodo.d.ts.map +1 -1
- package/construtos/acesso-metodo.js.map +1 -1
- package/construtos/atribuicao-por-indice.d.ts.map +1 -1
- package/construtos/atribuicao-por-indice.js.map +1 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +4 -2
- package/construtos/binario.js.map +1 -1
- package/construtos/decorador.d.ts.map +1 -1
- package/construtos/decorador.js.map +1 -1
- package/construtos/fim-para.d.ts.map +1 -1
- package/construtos/fim-para.js.map +1 -1
- package/construtos/formatacao-escrita.d.ts.map +1 -1
- package/construtos/formatacao-escrita.js.map +1 -1
- package/construtos/literal.d.ts.map +1 -1
- package/construtos/literal.js.map +1 -1
- package/construtos/referencia-funcao.d.ts.map +1 -1
- package/construtos/referencia-funcao.js.map +1 -1
- package/construtos/super.d.ts.map +1 -1
- package/construtos/super.js.map +1 -1
- package/construtos/tuplas/index.d.ts.map +1 -1
- package/construtos/tuplas/index.js.map +1 -1
- package/construtos/tuplas/septeto.d.ts.map +1 -1
- package/construtos/tuplas/septeto.js.map +1 -1
- package/construtos/variavel.d.ts.map +1 -1
- package/construtos/variavel.js.map +1 -1
- package/construtos/vetor.d.ts.map +1 -1
- package/construtos/vetor.js.map +1 -1
- package/declaracoes/aleatorio.d.ts.map +1 -1
- package/declaracoes/aleatorio.js.map +1 -1
- package/declaracoes/comentario.d.ts.map +1 -1
- package/declaracoes/comentario.js.map +1 -1
- package/declaracoes/const-multiplo.d.ts.map +1 -1
- package/declaracoes/const-multiplo.js.map +1 -1
- package/declaracoes/escolha.d.ts.map +1 -1
- package/declaracoes/escolha.js.map +1 -1
- package/declaracoes/para-cada.d.ts.map +1 -1
- package/declaracoes/para-cada.js.map +1 -1
- package/declaracoes/var-multiplo.d.ts.map +1 -1
- package/declaracoes/var-multiplo.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js.map +1 -1
- package/formatadores/formatador-pitugues.d.ts.map +1 -1
- package/formatadores/formatador-pitugues.js.map +1 -1
- package/geracao-identificadores/index.d.ts.map +1 -1
- package/geracao-identificadores/index.js.map +1 -1
- package/inferenciador.d.ts.map +1 -1
- package/inferenciador.js.map +1 -1
- package/informacao-variavel-ou-constante.js +1 -1
- package/informacao-variavel-ou-constante.js.map +1 -1
- package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
- package/interfaces/primitiva-interface.d.ts +1 -1
- package/interfaces/visitante-comum-interface.d.ts.map +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +24 -8
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +4 -2
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +26 -9
- 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 +12 -4
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
- package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
- package/interpretador/estruturas/funcao-padrao.js.map +1 -1
- package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
- package/interpretador/estruturas/objeto-delegua-classe.js +2 -1
- package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +88 -36
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador-com-depuracao.d.ts.map +1 -1
- package/interpretador/interpretador-com-depuracao.js +14 -6
- package/interpretador/interpretador-com-depuracao.js.map +1 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +13 -5
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/dialetos/lexador-egua-classico.d.ts.map +1 -1
- package/lexador/dialetos/lexador-egua-classico.js +3 -1
- package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
- package/lexador/dialetos/lexador-guarani.d.ts.map +1 -1
- package/lexador/dialetos/lexador-guarani.js +6 -2
- package/lexador/dialetos/lexador-guarani.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +4 -2
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.js +4 -2
- package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
- package/lexador/lexador-base-linha-unica.d.ts.map +1 -1
- package/lexador/lexador-base-linha-unica.js.map +1 -1
- package/lexador/lexador-base.d.ts.map +1 -1
- package/lexador/lexador-base.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +3 -1
- package/lexador/lexador.js.map +1 -1
- package/lexador/micro-lexador.d.ts.map +1 -1
- package/lexador/micro-lexador.js +3 -1
- package/lexador/micro-lexador.js.map +1 -1
- package/lexador/traducao/lexador-javascript.d.ts.map +1 -1
- package/lexador/traducao/lexador-javascript.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/python/python3-lexer.d.ts.map +1 -1
- package/tradutores/python/python3-lexer.js +2 -1
- package/tradutores/python/python3-lexer.js.map +1 -1
- package/tradutores/python/python3-parser.d.ts.map +1 -1
- package/tradutores/python/python3-parser.js +17 -8
- package/tradutores/python/python3-parser.js.map +1 -1
- package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
- package/tradutores/tradutor-assembly-x64.js.map +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +22 -8
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +24 -8
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +7 -5
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-javascript.js +2 -1
- package/tradutores/tradutor-reverso-javascript.js.map +1 -1
- package/umd/delegua.js +617 -253
package/umd/delegua.js
CHANGED
|
@@ -306,7 +306,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
306
306
|
throw this.erro(this.simbolos[this.atual], `Tipo de dados desconhecido: '${this.simbolos[this.atual].lexema}'.`);
|
|
307
307
|
}
|
|
308
308
|
if (this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
|
|
309
|
-
const tiposVetores = [
|
|
309
|
+
const tiposVetores = [
|
|
310
|
+
'inteiro[]',
|
|
311
|
+
'numero[]',
|
|
312
|
+
'número[]',
|
|
313
|
+
'qualquer[]',
|
|
314
|
+
'real[]',
|
|
315
|
+
'texto[]',
|
|
316
|
+
];
|
|
310
317
|
this.avancarEDevolverAnterior();
|
|
311
318
|
if (!this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_DIREITO)) {
|
|
312
319
|
throw this.erro(this.simbolos[this.atual], `Esperado símbolo de fechamento do vetor: ']'. Atual: ${this.simbolos[this.atual].lexema}`);
|
|
@@ -404,8 +411,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
404
411
|
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
405
412
|
let valor = '';
|
|
406
413
|
let linhaAtual = this.simbolos[this.atual].linha;
|
|
407
|
-
let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR)
|
|
408
|
-
.length %
|
|
414
|
+
let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_2.default.EXPRESSAO_REGULAR).length %
|
|
409
415
|
2 ===
|
|
410
416
|
0;
|
|
411
417
|
if (eParExpressaoRegular) {
|
|
@@ -658,16 +664,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
658
664
|
if (informacoesPossivelFuncaoBibliotecaGlobal !== undefined) {
|
|
659
665
|
const erros = this.validarArgumentosEntidadeChamada(informacoesPossivelFuncaoBibliotecaGlobal.argumentos, argumentos);
|
|
660
666
|
if (erros.length > 0) {
|
|
661
|
-
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
|
|
667
|
+
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`), '')}`);
|
|
662
668
|
}
|
|
663
669
|
return entidadeChamadaResolvidaVariavel;
|
|
664
670
|
}
|
|
665
671
|
}
|
|
666
|
-
if (tipoPrimitiva !== undefined &&
|
|
672
|
+
if (tipoPrimitiva !== undefined &&
|
|
673
|
+
this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
|
|
667
674
|
var informacoesPrimitiva = this.primitivasConhecidas[entidadeChamadaResolvidaVariavel.simbolo.lexema];
|
|
668
675
|
const erros = this.validarArgumentosEntidadeChamada(informacoesPrimitiva.argumentos, argumentos);
|
|
669
676
|
if (erros.length > 0) {
|
|
670
|
-
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
|
|
677
|
+
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`), '')}`);
|
|
671
678
|
}
|
|
672
679
|
return entidadeChamadaResolvidaVariavel;
|
|
673
680
|
}
|
|
@@ -865,7 +872,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
865
872
|
blocoEscopo() {
|
|
866
873
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
867
874
|
let declaracoes = [];
|
|
868
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
875
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
876
|
+
!this.estaNoFinal()) {
|
|
869
877
|
const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
|
|
870
878
|
if (Array.isArray(retornoDeclaracao)) {
|
|
871
879
|
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
@@ -919,7 +927,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
919
927
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
|
|
920
928
|
const caminhos = [];
|
|
921
929
|
let caminhoPadrao = null;
|
|
922
|
-
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
|
|
930
|
+
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
|
|
931
|
+
!this.estaNoFinal()) {
|
|
923
932
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
|
|
924
933
|
const caminhoCondicoes = [this.expressao()];
|
|
925
934
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
@@ -1314,7 +1323,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1314
1323
|
}
|
|
1315
1324
|
switch (inicializador.constructor.name) {
|
|
1316
1325
|
case 'AcessoIndiceVariavel':
|
|
1317
|
-
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
1326
|
+
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
1327
|
+
.entidadeChamada;
|
|
1318
1328
|
// Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
|
|
1319
1329
|
if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
|
|
1320
1330
|
return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
|
|
@@ -1331,8 +1341,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1331
1341
|
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
1332
1342
|
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
1333
1343
|
case 'AcessoMetodoOuPropriedade':
|
|
1334
|
-
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
1335
|
-
// e a chamada normalmente é feita para uma primitiva.
|
|
1344
|
+
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
1345
|
+
// e a chamada normalmente é feita para uma primitiva.
|
|
1336
1346
|
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
1337
1347
|
const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
|
|
1338
1348
|
if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
|
|
@@ -1368,9 +1378,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1368
1378
|
case 'Noneto':
|
|
1369
1379
|
case 'Deceto':
|
|
1370
1380
|
return delegua_1.default.TUPLA;
|
|
1371
|
-
case
|
|
1372
|
-
case
|
|
1373
|
-
return
|
|
1381
|
+
case 'ImportarBiblioteca':
|
|
1382
|
+
case 'ModuloDeclaracoes':
|
|
1383
|
+
return 'módulo';
|
|
1374
1384
|
default:
|
|
1375
1385
|
return inicializador.tipo;
|
|
1376
1386
|
}
|
|
@@ -1411,7 +1421,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1411
1421
|
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1412
1422
|
}
|
|
1413
1423
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1414
|
-
// Se tipo ainda não foi definido, infere.
|
|
1415
1424
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1416
1425
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1417
1426
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
@@ -1629,7 +1638,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1629
1638
|
this.pilhaDecoradores = [];
|
|
1630
1639
|
const metodos = [];
|
|
1631
1640
|
const propriedades = [];
|
|
1632
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
1641
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
1642
|
+
!this.estaNoFinal()) {
|
|
1633
1643
|
// Se o símbolo atual é arroba, é um decorador.
|
|
1634
1644
|
// Caso contrário, verificamos o próximo símbolo.
|
|
1635
1645
|
if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
|
|
@@ -1721,92 +1731,91 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1721
1731
|
}
|
|
1722
1732
|
/**
|
|
1723
1733
|
* Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
|
|
1724
|
-
* TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
|
|
1725
1734
|
*/
|
|
1726
1735
|
inicializarPilhaEscopos() {
|
|
1727
1736
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
1728
1737
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
1729
1738
|
// Funções nativas de Delégua
|
|
1730
1739
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
|
|
1731
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
|
|
1740
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número'),
|
|
1732
1741
|
]));
|
|
1733
1742
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
|
|
1734
1743
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
|
|
1735
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
|
|
1744
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
|
|
1736
1745
|
]));
|
|
1737
1746
|
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
|
|
1738
1747
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1739
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1748
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1740
1749
|
]));
|
|
1741
1750
|
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
|
|
1742
1751
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1743
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1752
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1744
1753
|
]));
|
|
1745
1754
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
|
|
1746
1755
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1747
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1756
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1748
1757
|
]));
|
|
1749
1758
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
|
|
1750
1759
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1751
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1760
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1752
1761
|
]));
|
|
1753
1762
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
|
|
1754
1763
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1755
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1764
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1756
1765
|
]));
|
|
1757
1766
|
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
|
|
1758
1767
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1759
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1768
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1760
1769
|
]));
|
|
1761
1770
|
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
|
|
1762
1771
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1763
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1772
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
1764
1773
|
]));
|
|
1765
1774
|
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
|
|
1766
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1775
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
1767
1776
|
]));
|
|
1768
1777
|
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
|
|
1769
1778
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1770
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
|
|
1779
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
|
|
1771
1780
|
]));
|
|
1772
1781
|
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1773
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1782
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1774
1783
|
]));
|
|
1775
1784
|
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1776
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1785
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1777
1786
|
]));
|
|
1778
1787
|
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
|
|
1779
1788
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1780
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
1789
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
|
|
1781
1790
|
]));
|
|
1782
1791
|
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
|
|
1783
1792
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1784
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1793
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1785
1794
|
]));
|
|
1786
1795
|
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
|
|
1787
1796
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1788
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1797
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1789
1798
|
]));
|
|
1790
1799
|
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
|
|
1791
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1800
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1792
1801
|
]));
|
|
1793
1802
|
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
|
|
1794
1803
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1795
1804
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
|
|
1796
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
|
|
1805
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
|
|
1797
1806
|
]));
|
|
1798
1807
|
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
|
|
1799
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
|
|
1808
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
|
|
1800
1809
|
]));
|
|
1801
1810
|
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
|
|
1802
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1811
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1803
1812
|
]));
|
|
1804
1813
|
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
|
|
1805
1814
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1806
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
|
|
1815
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
|
|
1807
1816
|
]));
|
|
1808
1817
|
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
|
|
1809
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
|
|
1818
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1810
1819
|
]));
|
|
1811
1820
|
// TODO: Escrever algum tipo de validação aqui.
|
|
1812
1821
|
for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
|
|
@@ -2191,7 +2200,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2191
2200
|
}
|
|
2192
2201
|
blocoEscopo() {
|
|
2193
2202
|
const declaracoes = [];
|
|
2194
|
-
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2203
|
+
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2204
|
+
!this.estaNoFinal()) {
|
|
2195
2205
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
2196
2206
|
}
|
|
2197
2207
|
this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
|
|
@@ -2296,7 +2306,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2296
2306
|
this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
|
|
2297
2307
|
const caminhos = [];
|
|
2298
2308
|
let caminhoPadrao = null;
|
|
2299
|
-
while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2309
|
+
while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2310
|
+
!this.estaNoFinal()) {
|
|
2300
2311
|
if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CASO)) {
|
|
2301
2312
|
const caminhoCondicoes = [this.expressao()];
|
|
2302
2313
|
this.consumir(egua_classico_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
@@ -2458,7 +2469,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2458
2469
|
}
|
|
2459
2470
|
this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
|
|
2460
2471
|
const metodos = [];
|
|
2461
|
-
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2472
|
+
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2473
|
+
!this.estaNoFinal()) {
|
|
2462
2474
|
metodos.push(this.funcao('método'));
|
|
2463
2475
|
}
|
|
2464
2476
|
this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
@@ -2514,6 +2526,9 @@ const declaracoes_1 = require("../../declaracoes");
|
|
|
2514
2526
|
const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
|
|
2515
2527
|
const lexador_1 = require("../../lexador");
|
|
2516
2528
|
const inferenciador_1 = require("../../inferenciador");
|
|
2529
|
+
const pilha_escopos_1 = require("../pilha-escopos");
|
|
2530
|
+
const informacao_escopo_1 = require("../informacao-escopo");
|
|
2531
|
+
const informacao_variavel_ou_constante_1 = require("../../informacao-variavel-ou-constante");
|
|
2517
2532
|
const pitugues_1 = __importDefault(require("../../tipos-de-simbolos/pitugues"));
|
|
2518
2533
|
/**
|
|
2519
2534
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
@@ -2529,6 +2544,77 @@ class AvaliadorSintaticoPitugues {
|
|
|
2529
2544
|
this.blocos = 0;
|
|
2530
2545
|
this.performance = performance;
|
|
2531
2546
|
this.escopos = [];
|
|
2547
|
+
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
2548
|
+
this.primitivasConhecidas = {};
|
|
2549
|
+
this.tiposDefinidosEmCodigo = {};
|
|
2550
|
+
}
|
|
2551
|
+
logicaComumInferenciaTiposVariaveisEConstantes(inicializador, tipo) {
|
|
2552
|
+
if (tipo !== 'qualquer') {
|
|
2553
|
+
return tipo;
|
|
2554
|
+
}
|
|
2555
|
+
switch (inicializador.constructor.name) {
|
|
2556
|
+
case 'AcessoIndiceVariavel':
|
|
2557
|
+
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
2558
|
+
.entidadeChamada;
|
|
2559
|
+
// Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
|
|
2560
|
+
if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
|
|
2561
|
+
return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
|
|
2562
|
+
}
|
|
2563
|
+
if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
|
|
2564
|
+
return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
|
|
2565
|
+
}
|
|
2566
|
+
// Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
|
|
2567
|
+
return 'qualquer';
|
|
2568
|
+
case 'Chamada':
|
|
2569
|
+
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
2570
|
+
switch (entidadeChamadaChamada.constructor.name) {
|
|
2571
|
+
case 'AcessoMetodo':
|
|
2572
|
+
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
2573
|
+
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
2574
|
+
case 'AcessoMetodoOuPropriedade':
|
|
2575
|
+
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
2576
|
+
// e a chamada normalmente é feita para uma primitiva.
|
|
2577
|
+
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
2578
|
+
const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
|
|
2579
|
+
if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
|
|
2580
|
+
return this.primitivasConhecidas[entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema].tipo;
|
|
2581
|
+
}
|
|
2582
|
+
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamadaAcessoMetodoOuPropriedade.simbolo, `Primitiva '${entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema}' não existe.`);
|
|
2583
|
+
case 'AcessoPropriedade':
|
|
2584
|
+
const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
|
|
2585
|
+
return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
|
|
2586
|
+
case 'ArgumentoReferenciaFuncao':
|
|
2587
|
+
// TODO: Voltar aqui se necessário.
|
|
2588
|
+
return 'qualquer';
|
|
2589
|
+
case 'ReferenciaFuncao':
|
|
2590
|
+
const entidadeChamadaReferenciaFuncao = entidadeChamadaChamada;
|
|
2591
|
+
return entidadeChamadaReferenciaFuncao.tipo;
|
|
2592
|
+
case 'Variavel':
|
|
2593
|
+
const entidadeChamadaVariavel = entidadeChamadaChamada;
|
|
2594
|
+
return entidadeChamadaVariavel.tipo;
|
|
2595
|
+
}
|
|
2596
|
+
break;
|
|
2597
|
+
case 'FuncaoConstruto':
|
|
2598
|
+
const funcaoConstruto = inicializador;
|
|
2599
|
+
return `função<${funcaoConstruto.tipo}>`;
|
|
2600
|
+
case 'Leia':
|
|
2601
|
+
return 'texto';
|
|
2602
|
+
case 'Dupla':
|
|
2603
|
+
case 'Trio':
|
|
2604
|
+
case 'Quarteto':
|
|
2605
|
+
case 'Quinteto':
|
|
2606
|
+
case 'Sexteto':
|
|
2607
|
+
case 'Septeto':
|
|
2608
|
+
case 'Octeto':
|
|
2609
|
+
case 'Noneto':
|
|
2610
|
+
case 'Deceto':
|
|
2611
|
+
return 'tupla';
|
|
2612
|
+
case 'ImportarBiblioteca':
|
|
2613
|
+
case 'ModuloDeclaracoes':
|
|
2614
|
+
return 'módulo';
|
|
2615
|
+
default:
|
|
2616
|
+
return inicializador.tipo;
|
|
2617
|
+
}
|
|
2532
2618
|
}
|
|
2533
2619
|
expressaoLeia() {
|
|
2534
2620
|
const simboloLeia = this.simbolos[this.atual];
|
|
@@ -2574,8 +2660,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
2574
2660
|
let retorno = [];
|
|
2575
2661
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2576
2662
|
// Se tipo ainda não foi definido, infere.
|
|
2577
|
-
|
|
2578
|
-
|
|
2663
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
2664
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
2579
2665
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo
|
|
2580
2666
|
// TODO: Discutir decoradores com comunidade.
|
|
2581
2667
|
// Array.from(this.pilhaDecoradores)
|
|
@@ -2590,10 +2676,12 @@ class AvaliadorSintaticoPitugues {
|
|
|
2590
2676
|
declaracaoDeVariaveis() {
|
|
2591
2677
|
const identificadores = [];
|
|
2592
2678
|
let retorno = [];
|
|
2679
|
+
let tipo = 'qualquer';
|
|
2593
2680
|
do {
|
|
2594
2681
|
identificadores.push(this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
2595
2682
|
} while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
|
|
2596
2683
|
if (!this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
|
|
2684
|
+
// Inicialização de variáveis sem valor.
|
|
2597
2685
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2598
2686
|
retorno.push(new declaracoes_1.Var(identificador, null));
|
|
2599
2687
|
}
|
|
@@ -2608,9 +2696,11 @@ class AvaliadorSintaticoPitugues {
|
|
|
2608
2696
|
throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
2609
2697
|
}
|
|
2610
2698
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2611
|
-
|
|
2699
|
+
const inicializador = inicializadores[indice];
|
|
2700
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
2701
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
2702
|
+
retorno.push(new declaracoes_1.Var(identificador, inicializador, tipo));
|
|
2612
2703
|
}
|
|
2613
|
-
this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA);
|
|
2614
2704
|
return retorno;
|
|
2615
2705
|
}
|
|
2616
2706
|
sincronizar() {
|
|
@@ -2682,9 +2772,6 @@ class AvaliadorSintaticoPitugues {
|
|
|
2682
2772
|
const simboloAtual = this.simbolos[this.atual];
|
|
2683
2773
|
let valores = [];
|
|
2684
2774
|
switch (simboloAtual.tipo) {
|
|
2685
|
-
case pitugues_1.default.SUPER:
|
|
2686
|
-
const simboloSuper = this.avancarEDevolverAnterior();
|
|
2687
|
-
return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
|
|
2688
2775
|
case pitugues_1.default.COLCHETE_ESQUERDO:
|
|
2689
2776
|
this.avancarEDevolverAnterior();
|
|
2690
2777
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.COLCHETE_DIREITO)) {
|
|
@@ -2724,14 +2811,18 @@ class AvaliadorSintaticoPitugues {
|
|
|
2724
2811
|
case pitugues_1.default.FUNÇÃO:
|
|
2725
2812
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
2726
2813
|
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
2727
|
-
|
|
2814
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
|
|
2728
2815
|
return corpoDaFuncao;
|
|
2816
|
+
case pitugues_1.default.IMPORTAR:
|
|
2817
|
+
return this.declaracaoImportar();
|
|
2729
2818
|
case pitugues_1.default.NULO:
|
|
2730
2819
|
this.avancarEDevolverAnterior();
|
|
2731
2820
|
return new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, null);
|
|
2732
2821
|
case pitugues_1.default.ISTO:
|
|
2733
2822
|
const simboloIsto = this.avancarEDevolverAnterior();
|
|
2734
2823
|
return new construtos_1.Isto(this.hashArquivo, simboloAtual.linha, simboloIsto);
|
|
2824
|
+
case pitugues_1.default.LEIA:
|
|
2825
|
+
return this.expressaoLeia();
|
|
2735
2826
|
case pitugues_1.default.NUMERO:
|
|
2736
2827
|
case pitugues_1.default.TEXTO:
|
|
2737
2828
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
@@ -2740,14 +2831,22 @@ class AvaliadorSintaticoPitugues {
|
|
|
2740
2831
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
|
|
2741
2832
|
case pitugues_1.default.IDENTIFICADOR:
|
|
2742
2833
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
2743
|
-
|
|
2834
|
+
let tipoOperando;
|
|
2835
|
+
if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
|
|
2836
|
+
tipoOperando = simboloIdentificador.lexema;
|
|
2837
|
+
}
|
|
2838
|
+
else {
|
|
2839
|
+
tipoOperando = this.pilhaEscopos.obterTipoVariavelPorNome(simboloIdentificador.lexema);
|
|
2840
|
+
}
|
|
2841
|
+
return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
|
|
2744
2842
|
case pitugues_1.default.PARENTESE_ESQUERDO:
|
|
2745
2843
|
this.avancarEDevolverAnterior();
|
|
2746
2844
|
const expressao = this.expressao();
|
|
2747
2845
|
this.consumir(pitugues_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
2748
2846
|
return new construtos_1.Agrupamento(this.hashArquivo, simboloAtual.linha, expressao);
|
|
2749
|
-
case pitugues_1.default.
|
|
2750
|
-
|
|
2847
|
+
case pitugues_1.default.SUPER:
|
|
2848
|
+
const simboloSuper = this.avancarEDevolverAnterior();
|
|
2849
|
+
return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
|
|
2751
2850
|
}
|
|
2752
2851
|
throw this.erro(this.simboloAtual(), 'Esperado expressão.');
|
|
2753
2852
|
}
|
|
@@ -2911,9 +3010,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
2911
3010
|
}
|
|
2912
3011
|
return expressao;
|
|
2913
3012
|
}
|
|
3013
|
+
// TODO: Depreciar.
|
|
2914
3014
|
expressao() {
|
|
2915
|
-
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.LEIA))
|
|
2916
|
-
return this.expressaoLeia();
|
|
2917
3015
|
return this.atribuir();
|
|
2918
3016
|
}
|
|
2919
3017
|
declaracaoEscreva() {
|
|
@@ -2931,6 +3029,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
2931
3029
|
return new declaracoes_1.Expressao(expressao);
|
|
2932
3030
|
}
|
|
2933
3031
|
blocoEscopo() {
|
|
3032
|
+
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
2934
3033
|
let declaracoes = [];
|
|
2935
3034
|
let simboloAtual = this.simboloAtual();
|
|
2936
3035
|
const simboloAnterior = this.simboloAnterior();
|
|
@@ -2954,28 +3053,27 @@ class AvaliadorSintaticoPitugues {
|
|
|
2954
3053
|
`Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
|
|
2955
3054
|
`Atual: ${espacosIndentacaoLinhaAtual}`);
|
|
2956
3055
|
}
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
declaracoes.push(retornoDeclaracao);
|
|
2971
|
-
}
|
|
2972
|
-
simboloAtual = this.simboloAtual();
|
|
2973
|
-
if (!simboloAtual)
|
|
2974
|
-
break;
|
|
2975
|
-
espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
3056
|
+
// Indentação ok, é um bloco de escopo.
|
|
3057
|
+
// Inclui todas as declarações cujas linhas tenham o mesmo número de espaços
|
|
3058
|
+
// de indentação do bloco.
|
|
3059
|
+
// Se `simboloAtual` for definido em algum momento como indefinido,
|
|
3060
|
+
// Significa que o código acabou, então o bloco também acabou.
|
|
3061
|
+
const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
|
|
3062
|
+
while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
|
|
3063
|
+
const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
|
|
3064
|
+
if (Array.isArray(retornoDeclaracao)) {
|
|
3065
|
+
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
3066
|
+
}
|
|
3067
|
+
else {
|
|
3068
|
+
declaracoes.push(retornoDeclaracao);
|
|
2976
3069
|
}
|
|
3070
|
+
simboloAtual = this.simboloAtual();
|
|
3071
|
+
if (!simboloAtual)
|
|
3072
|
+
break;
|
|
3073
|
+
espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
2977
3074
|
}
|
|
2978
3075
|
}
|
|
3076
|
+
this.pilhaEscopos.removerUltimo();
|
|
2979
3077
|
return declaracoes;
|
|
2980
3078
|
}
|
|
2981
3079
|
declaracaoEnquanto() {
|
|
@@ -3041,30 +3139,54 @@ class AvaliadorSintaticoPitugues {
|
|
|
3041
3139
|
this.blocos -= 1;
|
|
3042
3140
|
}
|
|
3043
3141
|
}
|
|
3142
|
+
declaracaoParaCada(simboloPara) {
|
|
3143
|
+
const nomeVariavelIteracao = this.consumir(pitugues_1.default.IDENTIFICADOR, "Esperado identificador de variável de iteração para instrução 'para cada'.");
|
|
3144
|
+
if (!this.verificarSeSimboloAtualEIgualA(pitugues_1.default.DE, pitugues_1.default.EM)) {
|
|
3145
|
+
throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
|
|
3146
|
+
}
|
|
3147
|
+
const vetor = this.expressao();
|
|
3148
|
+
if (!vetor.hasOwnProperty('tipo')) {
|
|
3149
|
+
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
|
|
3150
|
+
}
|
|
3151
|
+
const tipoVetor = vetor.tipo;
|
|
3152
|
+
if (!tipoVetor.endsWith('[]') && tipoVetor !== 'vetor') {
|
|
3153
|
+
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não é iterável. Tipo resolvido: ${tipoVetor}.`);
|
|
3154
|
+
}
|
|
3155
|
+
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(nomeVariavelIteracao.lexema, tipoVetor.slice(0, -2)));
|
|
3156
|
+
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
3157
|
+
const corpo = this.resolverDeclaracao();
|
|
3158
|
+
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), nomeVariavelIteracao.lexema, vetor, corpo);
|
|
3159
|
+
}
|
|
3160
|
+
declaracaoParaTradicional(simboloPara) {
|
|
3161
|
+
let inicializador;
|
|
3162
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA)) {
|
|
3163
|
+
inicializador = null;
|
|
3164
|
+
}
|
|
3165
|
+
else if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VARIAVEL)) {
|
|
3166
|
+
inicializador = this.declaracaoDeVariaveis();
|
|
3167
|
+
}
|
|
3168
|
+
else {
|
|
3169
|
+
inicializador = this.declaracaoExpressao();
|
|
3170
|
+
}
|
|
3171
|
+
let condicao = null;
|
|
3172
|
+
if (!this.verificarTipoSimboloAtual(pitugues_1.default.PONTO_E_VIRGULA)) {
|
|
3173
|
+
condicao = this.expressao();
|
|
3174
|
+
}
|
|
3175
|
+
let incrementar = null;
|
|
3176
|
+
if (this.simbolos[this.atual].tipo !== pitugues_1.default.DOIS_PONTOS) {
|
|
3177
|
+
incrementar = this.expressao();
|
|
3178
|
+
}
|
|
3179
|
+
const corpo = this.resolverDeclaracao();
|
|
3180
|
+
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
3181
|
+
}
|
|
3044
3182
|
declaracaoPara() {
|
|
3045
3183
|
try {
|
|
3046
3184
|
const simboloPara = this.simboloAnterior();
|
|
3047
3185
|
this.blocos += 1;
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
inicializador = null;
|
|
3051
|
-
}
|
|
3052
|
-
else if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VARIAVEL)) {
|
|
3053
|
-
inicializador = this.declaracaoDeVariaveis();
|
|
3054
|
-
}
|
|
3055
|
-
else {
|
|
3056
|
-
inicializador = this.declaracaoExpressao();
|
|
3057
|
-
}
|
|
3058
|
-
let condicao = null;
|
|
3059
|
-
if (!this.verificarTipoSimboloAtual(pitugues_1.default.PONTO_E_VIRGULA)) {
|
|
3060
|
-
condicao = this.expressao();
|
|
3061
|
-
}
|
|
3062
|
-
let incrementar = null;
|
|
3063
|
-
if (this.simbolos[this.atual].tipo !== pitugues_1.default.DOIS_PONTOS) {
|
|
3064
|
-
incrementar = this.expressao();
|
|
3186
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.CADA)) {
|
|
3187
|
+
return this.declaracaoParaCada(simboloPara);
|
|
3065
3188
|
}
|
|
3066
|
-
|
|
3067
|
-
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
3189
|
+
return this.declaracaoParaTradicional(simboloPara);
|
|
3068
3190
|
}
|
|
3069
3191
|
catch (erro) {
|
|
3070
3192
|
throw erro;
|
|
@@ -3207,17 +3329,18 @@ class AvaliadorSintaticoPitugues {
|
|
|
3207
3329
|
const parametro = {};
|
|
3208
3330
|
if (this.simboloAtual().tipo === pitugues_1.default.MULTIPLICACAO) {
|
|
3209
3331
|
this.consumir(pitugues_1.default.MULTIPLICACAO, null);
|
|
3210
|
-
parametro
|
|
3332
|
+
parametro.abrangencia = 'multiplo';
|
|
3211
3333
|
}
|
|
3212
3334
|
else {
|
|
3213
|
-
parametro
|
|
3335
|
+
parametro.abrangencia = 'padrao';
|
|
3214
3336
|
}
|
|
3215
|
-
parametro
|
|
3337
|
+
parametro.nome = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
|
|
3216
3338
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
|
|
3217
|
-
parametro
|
|
3339
|
+
parametro.valorPadrao = this.primario();
|
|
3218
3340
|
}
|
|
3341
|
+
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
3219
3342
|
parametros.push(parametro);
|
|
3220
|
-
if (parametro
|
|
3343
|
+
if (parametro.abrangencia === 'multiplo')
|
|
3221
3344
|
break;
|
|
3222
3345
|
} while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
|
|
3223
3346
|
return parametros;
|
|
@@ -3277,12 +3400,100 @@ class AvaliadorSintaticoPitugues {
|
|
|
3277
3400
|
return null;
|
|
3278
3401
|
}
|
|
3279
3402
|
}
|
|
3403
|
+
registrarTiposBibliotecasEPrimitivas() {
|
|
3404
|
+
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
3405
|
+
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
3406
|
+
// Funções nativas de Delégua
|
|
3407
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
|
|
3408
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número'),
|
|
3409
|
+
]));
|
|
3410
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
|
|
3411
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
|
|
3412
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
|
|
3413
|
+
]));
|
|
3414
|
+
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
|
|
3415
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3416
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
3417
|
+
]));
|
|
3418
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
|
|
3419
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3420
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
3421
|
+
]));
|
|
3422
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
|
|
3423
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3424
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
3425
|
+
]));
|
|
3426
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
|
|
3427
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3428
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
3429
|
+
]));
|
|
3430
|
+
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
|
|
3431
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3432
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
3433
|
+
]));
|
|
3434
|
+
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
|
|
3435
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3436
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
3437
|
+
]));
|
|
3438
|
+
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
|
|
3439
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3440
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
3441
|
+
]));
|
|
3442
|
+
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
|
|
3443
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
3444
|
+
]));
|
|
3445
|
+
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
|
|
3446
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3447
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
|
|
3448
|
+
]));
|
|
3449
|
+
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
3450
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
3451
|
+
]));
|
|
3452
|
+
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
3453
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
3454
|
+
]));
|
|
3455
|
+
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
|
|
3456
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3457
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
|
|
3458
|
+
]));
|
|
3459
|
+
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
|
|
3460
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3461
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
3462
|
+
]));
|
|
3463
|
+
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
|
|
3464
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3465
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
3466
|
+
]));
|
|
3467
|
+
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
|
|
3468
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
3469
|
+
]));
|
|
3470
|
+
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
|
|
3471
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3472
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
|
|
3473
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
|
|
3474
|
+
]));
|
|
3475
|
+
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
|
|
3476
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
|
|
3477
|
+
]));
|
|
3478
|
+
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
|
|
3479
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
3480
|
+
]));
|
|
3481
|
+
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
|
|
3482
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3483
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
|
|
3484
|
+
]));
|
|
3485
|
+
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
|
|
3486
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
3487
|
+
]));
|
|
3488
|
+
}
|
|
3280
3489
|
analisar(retornoLexador, hashArquivo) {
|
|
3281
3490
|
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
3282
3491
|
this.erros = [];
|
|
3283
3492
|
this.atual = 0;
|
|
3284
3493
|
this.blocos = 0;
|
|
3285
3494
|
this.escopos = [];
|
|
3495
|
+
this.registrarTiposBibliotecasEPrimitivas();
|
|
3496
|
+
this.tiposDefinidosEmCodigo = {};
|
|
3286
3497
|
this.hashArquivo = hashArquivo || 0;
|
|
3287
3498
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
3288
3499
|
this.pragmas = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.pragmas) || {};
|
|
@@ -3309,7 +3520,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
3309
3520
|
}
|
|
3310
3521
|
exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
|
|
3311
3522
|
|
|
3312
|
-
},{"../../construtos":42,"../../declaracoes":82,"../../inferenciador":105,"../../lexador":154,"../../tipos-de-simbolos/pitugues":169,"../erro-avaliador-sintatico":7,"browser-process-hrtime":342}],5:[function(require,module,exports){
|
|
3523
|
+
},{"../../construtos":42,"../../declaracoes":82,"../../inferenciador":105,"../../informacao-variavel-ou-constante":106,"../../lexador":154,"../../tipos-de-simbolos/pitugues":169,"../erro-avaliador-sintatico":7,"../informacao-escopo":9,"../pilha-escopos":12,"browser-process-hrtime":342}],5:[function(require,module,exports){
|
|
3313
3524
|
"use strict";
|
|
3314
3525
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3315
3526
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -4001,7 +4212,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
4001
4212
|
if (arguments.length <= 0) {
|
|
4002
4213
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A função recebe ao menos um parâmetro.'));
|
|
4003
4214
|
}
|
|
4004
|
-
const valorMinimo = minimo.hasOwnProperty('valor')
|
|
4215
|
+
const valorMinimo = minimo.hasOwnProperty('valor')
|
|
4216
|
+
? minimo.valor
|
|
4217
|
+
: minimo;
|
|
4005
4218
|
if (arguments.length === 2) {
|
|
4006
4219
|
if (typeof valorMinimo !== 'number') {
|
|
4007
4220
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'O parâmetro deve ser um número.'));
|
|
@@ -4011,7 +4224,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
4011
4224
|
if (arguments.length > 3) {
|
|
4012
4225
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A quantidade de parâmetros máxima para esta função é 2.'));
|
|
4013
4226
|
}
|
|
4014
|
-
const valorMaximo = maximo.hasOwnProperty('valor')
|
|
4227
|
+
const valorMaximo = maximo.hasOwnProperty('valor')
|
|
4228
|
+
? maximo.valor
|
|
4229
|
+
: maximo;
|
|
4015
4230
|
if (typeof valorMinimo !== 'number' || typeof valorMaximo !== 'number') {
|
|
4016
4231
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Os dois parâmetros devem ser do tipo número.'));
|
|
4017
4232
|
}
|
|
@@ -4026,7 +4241,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
4026
4241
|
*/
|
|
4027
4242
|
async function algum(interpretador, vetor, funcaoPesquisa) {
|
|
4028
4243
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4029
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4244
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4245
|
+
? funcaoPesquisa.valor
|
|
4246
|
+
: funcaoPesquisa;
|
|
4030
4247
|
if (!Array.isArray(valorVetor)) {
|
|
4031
4248
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
4032
4249
|
}
|
|
@@ -4050,7 +4267,9 @@ async function algum(interpretador, vetor, funcaoPesquisa) {
|
|
|
4050
4267
|
*/
|
|
4051
4268
|
async function encontrar(interpretador, vetor, funcaoPesquisa) {
|
|
4052
4269
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4053
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4270
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4271
|
+
? funcaoPesquisa.valor
|
|
4272
|
+
: funcaoPesquisa;
|
|
4054
4273
|
if (!Array.isArray(valorVetor)) {
|
|
4055
4274
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
4056
4275
|
}
|
|
@@ -4074,7 +4293,9 @@ async function encontrar(interpretador, vetor, funcaoPesquisa) {
|
|
|
4074
4293
|
*/
|
|
4075
4294
|
async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
|
|
4076
4295
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4077
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4296
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4297
|
+
? funcaoPesquisa.valor
|
|
4298
|
+
: funcaoPesquisa;
|
|
4078
4299
|
if (!Array.isArray(valorVetor)) {
|
|
4079
4300
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
4080
4301
|
}
|
|
@@ -4098,7 +4319,9 @@ async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
|
|
|
4098
4319
|
*/
|
|
4099
4320
|
async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
|
|
4100
4321
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4101
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4322
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4323
|
+
? funcaoPesquisa.valor
|
|
4324
|
+
: funcaoPesquisa;
|
|
4102
4325
|
if (!Array.isArray(valorVetor)) {
|
|
4103
4326
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
4104
4327
|
}
|
|
@@ -4121,7 +4344,9 @@ async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
|
|
|
4121
4344
|
*/
|
|
4122
4345
|
async function encontrarUltimoIndice(interpretador, vetor, funcaoPesquisa) {
|
|
4123
4346
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4124
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4347
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4348
|
+
? funcaoPesquisa.valor
|
|
4349
|
+
: funcaoPesquisa;
|
|
4125
4350
|
if (!Array.isArray(valorVetor)) {
|
|
4126
4351
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
4127
4352
|
}
|
|
@@ -4146,7 +4371,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
4146
4371
|
if (vetor === null || vetor === undefined)
|
|
4147
4372
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() não pode ser nulo.'));
|
|
4148
4373
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4149
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4374
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4375
|
+
? funcaoFiltragem.valor
|
|
4376
|
+
: funcaoFiltragem;
|
|
4150
4377
|
if (!Array.isArray(valorVetor)) {
|
|
4151
4378
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() deve ser um vetor.'));
|
|
4152
4379
|
}
|
|
@@ -4155,7 +4382,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
4155
4382
|
}
|
|
4156
4383
|
const resultados = [];
|
|
4157
4384
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
4158
|
-
const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4385
|
+
const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4386
|
+
valorVetor[indice],
|
|
4387
|
+
]);
|
|
4159
4388
|
if (deveRetornarValor === false)
|
|
4160
4389
|
continue;
|
|
4161
4390
|
resultados.push(valorVetor[indice]);
|
|
@@ -4200,28 +4429,34 @@ function validacaoComumNumeros(valorParaConverter) {
|
|
|
4200
4429
|
async function inteiro(interpretador, valorParaConverter) {
|
|
4201
4430
|
if (valorParaConverter === null || valorParaConverter === undefined)
|
|
4202
4431
|
return Promise.resolve(0);
|
|
4203
|
-
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4432
|
+
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4433
|
+
? valorParaConverter.valor
|
|
4434
|
+
: valorParaConverter;
|
|
4204
4435
|
const resultadoValidacao = validacaoComumNumeros(valor);
|
|
4205
4436
|
return resultadoValidacao || Promise.resolve(parseInt(valor));
|
|
4206
4437
|
}
|
|
4207
4438
|
/**
|
|
4208
|
-
*
|
|
4209
|
-
*
|
|
4210
|
-
* @param
|
|
4211
|
-
* @param
|
|
4212
|
-
* @
|
|
4439
|
+
* Dado um vetor e uma função de mapeamento, executa a função de mapeamento
|
|
4440
|
+
* passando como argumento cada elemento do vetor.
|
|
4441
|
+
* @param interpretador A instância do interpretador.
|
|
4442
|
+
* @param vetor O vetor
|
|
4443
|
+
* @param funcaoMapeamento A função de mapeamento.
|
|
4444
|
+
* @returns O resultado acumulado da execução da função de mapeamento.
|
|
4213
4445
|
*/
|
|
4214
4446
|
async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
4215
4447
|
if (vetor === null || vetor === undefined)
|
|
4216
4448
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
|
|
4217
4449
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4218
|
-
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
4450
|
+
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
4451
|
+
? funcaoMapeamento.valor
|
|
4452
|
+
: funcaoMapeamento;
|
|
4219
4453
|
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
4220
4454
|
// na avaliação sintática. Estudar remoção.
|
|
4221
4455
|
if (!Array.isArray(valorVetor)) {
|
|
4222
4456
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
|
|
4223
4457
|
}
|
|
4224
|
-
|
|
4458
|
+
const nomeConstrutorFuncaoMapeamento = valorFuncaoMapeamento.constructor.name.replaceAll('_', '');
|
|
4459
|
+
if (nomeConstrutorFuncaoMapeamento !== 'DeleguaFuncao') {
|
|
4225
4460
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
|
|
4226
4461
|
}
|
|
4227
4462
|
const resultados = [];
|
|
@@ -4239,7 +4474,9 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
4239
4474
|
async function numero(interpretador, valorParaConverter) {
|
|
4240
4475
|
if (valorParaConverter === null || valorParaConverter === undefined)
|
|
4241
4476
|
return Promise.resolve(0);
|
|
4242
|
-
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4477
|
+
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4478
|
+
? valorParaConverter.valor
|
|
4479
|
+
: valorParaConverter;
|
|
4243
4480
|
const resultadoValidacao = validacaoComumNumeros(valor);
|
|
4244
4481
|
return resultadoValidacao || Promise.resolve(Number(valor));
|
|
4245
4482
|
}
|
|
@@ -4279,7 +4516,9 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
4279
4516
|
if (vetor === null || vetor === undefined)
|
|
4280
4517
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() não pode ser nulo.'));
|
|
4281
4518
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4282
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4519
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4520
|
+
? funcaoFiltragem.valor
|
|
4521
|
+
: funcaoFiltragem;
|
|
4283
4522
|
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
4284
4523
|
// na avaliação sintática. Estudar remoção.
|
|
4285
4524
|
if (!Array.isArray(valorVetor)) {
|
|
@@ -4303,7 +4542,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
4303
4542
|
if (vetor === null || vetor === undefined)
|
|
4304
4543
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() não pode ser nulo.'));
|
|
4305
4544
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4306
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4545
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4546
|
+
? funcaoFiltragem.valor
|
|
4547
|
+
: funcaoFiltragem;
|
|
4307
4548
|
if (!Array.isArray(valorVetor)) {
|
|
4308
4549
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() deve ser um vetor.'));
|
|
4309
4550
|
}
|
|
@@ -4311,7 +4552,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
4311
4552
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O segundo parâmetro da função primeiroEmCondicao() deve ser uma função.'));
|
|
4312
4553
|
}
|
|
4313
4554
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
4314
|
-
const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4555
|
+
const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4556
|
+
valorVetor[indice],
|
|
4557
|
+
]);
|
|
4315
4558
|
if (valorResolvido !== null) {
|
|
4316
4559
|
return valorResolvido;
|
|
4317
4560
|
}
|
|
@@ -4343,7 +4586,9 @@ async function real(interpretador, numero) {
|
|
|
4343
4586
|
*/
|
|
4344
4587
|
async function reduzir(interpretador, vetor, funcaoReducao, valorInicial = null) {
|
|
4345
4588
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4346
|
-
const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor')
|
|
4589
|
+
const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor')
|
|
4590
|
+
? funcaoReducao.valor
|
|
4591
|
+
: funcaoReducao;
|
|
4347
4592
|
const valorPadrao = valorInicial.hasOwnProperty('valor') ? valorInicial.valor : valorInicial;
|
|
4348
4593
|
if (!Array.isArray(valorVetor)) {
|
|
4349
4594
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função deve ser um vetor.'));
|
|
@@ -4544,7 +4789,7 @@ exports.default = {
|
|
|
4544
4789
|
tipoRetorno: 'texto[]',
|
|
4545
4790
|
argumentos: [
|
|
4546
4791
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('divisor', 'texto'),
|
|
4547
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número')
|
|
4792
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número'),
|
|
4548
4793
|
],
|
|
4549
4794
|
implementacao: (interpretador, texto, divisor, limite) => {
|
|
4550
4795
|
if (limite) {
|
|
@@ -4557,15 +4802,13 @@ exports.default = {
|
|
|
4557
4802
|
tipoRetorno: 'texto',
|
|
4558
4803
|
argumentos: [
|
|
4559
4804
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4560
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4805
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4561
4806
|
],
|
|
4562
4807
|
implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
|
|
4563
4808
|
},
|
|
4564
4809
|
inclui: {
|
|
4565
4810
|
tipoRetorno: 'texto',
|
|
4566
|
-
argumentos: [
|
|
4567
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')
|
|
4568
|
-
],
|
|
4811
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')],
|
|
4569
4812
|
implementacao: (interpretador, texto, elemento) => Promise.resolve(texto.includes(elemento)),
|
|
4570
4813
|
},
|
|
4571
4814
|
inverter: {
|
|
@@ -4587,7 +4830,7 @@ exports.default = {
|
|
|
4587
4830
|
tipoRetorno: 'texto',
|
|
4588
4831
|
argumentos: [
|
|
4589
4832
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto'),
|
|
4590
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto')
|
|
4833
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto'),
|
|
4591
4834
|
],
|
|
4592
4835
|
implementacao: (interpretador, texto, elemento, substituto) => Promise.resolve(texto.replace(elemento, substituto)),
|
|
4593
4836
|
},
|
|
@@ -4595,7 +4838,7 @@ exports.default = {
|
|
|
4595
4838
|
tipoRetorno: 'texto',
|
|
4596
4839
|
argumentos: [
|
|
4597
4840
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4598
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4841
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4599
4842
|
],
|
|
4600
4843
|
implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
|
|
4601
4844
|
},
|
|
@@ -4613,9 +4856,7 @@ const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-co
|
|
|
4613
4856
|
exports.default = {
|
|
4614
4857
|
adicionar: {
|
|
4615
4858
|
tipoRetorno: 'qualquer[]',
|
|
4616
|
-
argumentos: [
|
|
4617
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4618
|
-
],
|
|
4859
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4619
4860
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4620
4861
|
vetor.push(elemento);
|
|
4621
4862
|
return Promise.resolve(vetor);
|
|
@@ -4623,18 +4864,14 @@ exports.default = {
|
|
|
4623
4864
|
},
|
|
4624
4865
|
concatenar: {
|
|
4625
4866
|
tipoRetorno: 'qualquer[]',
|
|
4626
|
-
argumentos: [
|
|
4627
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')
|
|
4628
|
-
],
|
|
4867
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')],
|
|
4629
4868
|
implementacao: (interpretador, vetor, outroVetor) => {
|
|
4630
4869
|
return Promise.resolve(vetor.concat(outroVetor));
|
|
4631
4870
|
},
|
|
4632
4871
|
},
|
|
4633
4872
|
empilhar: {
|
|
4634
4873
|
tipoRetorno: 'qualquer[]',
|
|
4635
|
-
argumentos: [
|
|
4636
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4637
|
-
],
|
|
4874
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4638
4875
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4639
4876
|
vetor.push(elemento);
|
|
4640
4877
|
return Promise.resolve(vetor);
|
|
@@ -4645,7 +4882,7 @@ exports.default = {
|
|
|
4645
4882
|
argumentos: [
|
|
4646
4883
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'qualquer'),
|
|
4647
4884
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('excluirQuantidade', 'número'),
|
|
4648
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]')
|
|
4885
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]'),
|
|
4649
4886
|
],
|
|
4650
4887
|
implementacao: (interpretador, vetor, inicio, excluirQuantidade, ...itens) => {
|
|
4651
4888
|
let elementos = [];
|
|
@@ -4664,15 +4901,13 @@ exports.default = {
|
|
|
4664
4901
|
tipoRetorno: 'qualquer[]',
|
|
4665
4902
|
argumentos: [
|
|
4666
4903
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4667
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4904
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4668
4905
|
],
|
|
4669
4906
|
implementacao: (interpretador, vetor, inicio, fim) => Promise.resolve(vetor.slice(inicio, fim)),
|
|
4670
4907
|
},
|
|
4671
4908
|
filtrarPor: {
|
|
4672
4909
|
tipoRetorno: 'qualquer[]',
|
|
4673
|
-
argumentos: [
|
|
4674
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
|
|
4675
|
-
],
|
|
4910
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
|
|
4676
4911
|
implementacao: async (interpretador, vetor, funcao) => {
|
|
4677
4912
|
if (funcao === undefined || funcao === null) {
|
|
4678
4913
|
return Promise.reject("É necessário passar uma função para o método 'filtrarPor'");
|
|
@@ -4688,9 +4923,7 @@ exports.default = {
|
|
|
4688
4923
|
},
|
|
4689
4924
|
inclui: {
|
|
4690
4925
|
tipoRetorno: 'lógico',
|
|
4691
|
-
argumentos: [
|
|
4692
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4693
|
-
],
|
|
4926
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4694
4927
|
implementacao: (interpretador, vetor, elemento) => Promise.resolve(vetor.includes(elemento)),
|
|
4695
4928
|
},
|
|
4696
4929
|
inverter: {
|
|
@@ -4700,16 +4933,12 @@ exports.default = {
|
|
|
4700
4933
|
},
|
|
4701
4934
|
juntar: {
|
|
4702
4935
|
tipoRetorno: 'texto',
|
|
4703
|
-
argumentos: [
|
|
4704
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')
|
|
4705
|
-
],
|
|
4936
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')],
|
|
4706
4937
|
implementacao: (interpretador, vetor, separador) => Promise.resolve(vetor.join(separador)),
|
|
4707
4938
|
},
|
|
4708
4939
|
mapear: {
|
|
4709
4940
|
tipoRetorno: 'qualquer[]',
|
|
4710
|
-
argumentos: [
|
|
4711
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
|
|
4712
|
-
],
|
|
4941
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
|
|
4713
4942
|
implementacao: async (interpretador, vetor, funcao) => {
|
|
4714
4943
|
if (funcao === undefined || funcao === null) {
|
|
4715
4944
|
return Promise.reject("É necessário passar uma função para o método 'mapear'");
|
|
@@ -4724,14 +4953,15 @@ exports.default = {
|
|
|
4724
4953
|
},
|
|
4725
4954
|
ordenar: {
|
|
4726
4955
|
tipoRetorno: 'qualquer[]',
|
|
4727
|
-
argumentos: [
|
|
4728
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
4729
|
-
],
|
|
4956
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')],
|
|
4730
4957
|
implementacao: async (interpretador, vetor, funcaoOrdenacao) => {
|
|
4731
4958
|
if (funcaoOrdenacao !== undefined && funcaoOrdenacao !== null) {
|
|
4732
4959
|
for (let i = 0; i < vetor.length - 1; i++) {
|
|
4733
4960
|
for (let j = 1; j < vetor.length; j++) {
|
|
4734
|
-
if ((await funcaoOrdenacao.chamar(interpretador, [
|
|
4961
|
+
if ((await funcaoOrdenacao.chamar(interpretador, [
|
|
4962
|
+
vetor[j - 1],
|
|
4963
|
+
vetor[j],
|
|
4964
|
+
])) > 0) {
|
|
4735
4965
|
const aux = vetor[j];
|
|
4736
4966
|
vetor[j] = vetor[j - 1];
|
|
4737
4967
|
vetor[j - 1] = aux;
|
|
@@ -4748,9 +4978,7 @@ exports.default = {
|
|
|
4748
4978
|
},
|
|
4749
4979
|
remover: {
|
|
4750
4980
|
tipoRetorno: 'qualquer[]',
|
|
4751
|
-
argumentos: [
|
|
4752
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4753
|
-
],
|
|
4981
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4754
4982
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4755
4983
|
const index = vetor.indexOf(elemento);
|
|
4756
4984
|
if (index !== -1)
|
|
@@ -5036,7 +5264,8 @@ class Binario {
|
|
|
5036
5264
|
this.tipo = this.deduzirTipo();
|
|
5037
5265
|
}
|
|
5038
5266
|
deduzirTipo() {
|
|
5039
|
-
if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
|
|
5267
|
+
if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
|
|
5268
|
+
['logico', 'lógico'].includes(this.direita.tipo)) {
|
|
5040
5269
|
return 'lógico';
|
|
5041
5270
|
}
|
|
5042
5271
|
if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
|
|
@@ -5045,7 +5274,8 @@ class Binario {
|
|
|
5045
5274
|
if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
|
|
5046
5275
|
return 'inteiro';
|
|
5047
5276
|
}
|
|
5048
|
-
if (['numero', 'número'].includes(this.esquerda.tipo) ||
|
|
5277
|
+
if (['numero', 'número'].includes(this.esquerda.tipo) ||
|
|
5278
|
+
['numero', 'número'].includes(this.direita.tipo)) {
|
|
5049
5279
|
return 'número';
|
|
5050
5280
|
}
|
|
5051
5281
|
return 'qualquer';
|
|
@@ -7594,7 +7824,7 @@ class InformacaoVariavelOuConstante {
|
|
|
7594
7824
|
this.argumentos = argumentos;
|
|
7595
7825
|
}
|
|
7596
7826
|
toString() {
|
|
7597
|
-
return `InformacaoVariavelOuConstante(nome=${this.nome}, tipo=${this.tipo}, argumentos=${this.argumentos.map(arg => arg.toString()).join(', ')})`;
|
|
7827
|
+
return `InformacaoVariavelOuConstante(nome=${this.nome}, tipo=${this.tipo}, argumentos=${this.argumentos.map((arg) => arg.toString()).join(', ')})`;
|
|
7598
7828
|
}
|
|
7599
7829
|
}
|
|
7600
7830
|
exports.InformacaoVariavelOuConstante = InformacaoVariavelOuConstante;
|
|
@@ -7945,7 +8175,9 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7945
8175
|
const argumentosResolvidos = [];
|
|
7946
8176
|
for (let i = indiceArgumentoAtual; i < argumentos.length; i++) {
|
|
7947
8177
|
const argumentoAtual = argumentos[i];
|
|
7948
|
-
argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor')
|
|
8178
|
+
argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor')
|
|
8179
|
+
? argumentoAtual.valor
|
|
8180
|
+
: argumentoAtual);
|
|
7949
8181
|
}
|
|
7950
8182
|
return argumentosResolvidos;
|
|
7951
8183
|
}
|
|
@@ -7958,14 +8190,19 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7958
8190
|
if (parametro.abrangencia === 'multiplo') {
|
|
7959
8191
|
const argumentosResolvidos = this.resolverParametrosEspalhados(argumentos, i);
|
|
7960
8192
|
// TODO: Verificar se `imutavel` é `true` aqui mesmo.
|
|
7961
|
-
ambiente.valores[nome] = {
|
|
8193
|
+
ambiente.valores[nome] = {
|
|
8194
|
+
tipo: 'vetor',
|
|
8195
|
+
valor: argumentosResolvidos,
|
|
8196
|
+
imutavel: true,
|
|
8197
|
+
};
|
|
7962
8198
|
}
|
|
7963
8199
|
else {
|
|
7964
8200
|
let argumento = argumentos[i];
|
|
7965
8201
|
if (argumento.valor === null) {
|
|
7966
8202
|
argumentos[i].valor = parametro['padrao'] ? parametro['padrao'].valor : null;
|
|
7967
8203
|
}
|
|
7968
|
-
ambiente.valores[nome] =
|
|
8204
|
+
ambiente.valores[nome] =
|
|
8205
|
+
argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
|
|
7969
8206
|
// Se o argumento é `DeleguaFuncao`, para habilitar o recurso de _currying_,
|
|
7970
8207
|
// copiamos seu valor para o escopo atual. Nem sempre podemos contar com a tipagem explícita aqui.
|
|
7971
8208
|
if (argumento.valor && ['funcao', 'função'].includes(argumento.valor.tipo)) {
|
|
@@ -7985,7 +8222,8 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7985
8222
|
};
|
|
7986
8223
|
// TODO: Apenass Potigol usa isso até então.
|
|
7987
8224
|
// Estudar mover isso para o dialeto.
|
|
7988
|
-
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
8225
|
+
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
8226
|
+
this.nome !== 'construtor') {
|
|
7989
8227
|
for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
|
|
7990
8228
|
ambiente.valores[nomeCampo] = {
|
|
7991
8229
|
valor: valorCampo,
|
|
@@ -8286,7 +8524,8 @@ class ObjetoDeleguaClasse {
|
|
|
8286
8524
|
throw new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade "${nomePropriedade}" não existe neste objeto.`);
|
|
8287
8525
|
}
|
|
8288
8526
|
definir(simbolo, valor) {
|
|
8289
|
-
if (this.classe.dialetoRequerDeclaracaoPropriedades &&
|
|
8527
|
+
if (this.classe.dialetoRequerDeclaracaoPropriedades &&
|
|
8528
|
+
!this.propriedades.hasOwnProperty(simbolo.lexema)) {
|
|
8290
8529
|
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Propriedade "${simbolo.lexema}" não foi definida na declaração da classe ${this.classe.simboloOriginal.lexema}.`);
|
|
8291
8530
|
}
|
|
8292
8531
|
this.propriedades[simbolo.lexema] = valor;
|
|
@@ -8416,7 +8655,8 @@ class InterpretadorBase {
|
|
|
8416
8655
|
this.diretorioBase = diretorioBase;
|
|
8417
8656
|
this.performance = performance;
|
|
8418
8657
|
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
8419
|
-
this.funcaoDeRetornoMesmaLinha =
|
|
8658
|
+
this.funcaoDeRetornoMesmaLinha =
|
|
8659
|
+
funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
|
|
8420
8660
|
this.erros = [];
|
|
8421
8661
|
this.declaracoes = [];
|
|
8422
8662
|
this.resultadoInterpretador = [];
|
|
@@ -8550,7 +8790,9 @@ class InterpretadorBase {
|
|
|
8550
8790
|
textoFinal = textoFinal.replace('${' + elemento.variavel + '}', this.paraTexto((_b = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _b === void 0 ? void 0 : _b.valor));
|
|
8551
8791
|
}
|
|
8552
8792
|
else {
|
|
8553
|
-
const valor = ((_c = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _c === void 0 ? void 0 : _c.hasOwnProperty('valor'))
|
|
8793
|
+
const valor = ((_c = elemento === null || elemento === void 0 ? void 0 : elemento.valor) === null || _c === void 0 ? void 0 : _c.hasOwnProperty('valor'))
|
|
8794
|
+
? elemento === null || elemento === void 0 ? void 0 : elemento.valor.valor
|
|
8795
|
+
: elemento === null || elemento === void 0 ? void 0 : elemento.valor;
|
|
8554
8796
|
textoFinal = textoFinal.replace('${' + elemento.variavel + '}', `${this.paraTexto(valor)}`);
|
|
8555
8797
|
}
|
|
8556
8798
|
});
|
|
@@ -8602,7 +8844,8 @@ class InterpretadorBase {
|
|
|
8602
8844
|
return true;
|
|
8603
8845
|
}
|
|
8604
8846
|
verificarOperandoNumero(operador, operando) {
|
|
8605
|
-
if (typeof operando === primitivos_1.default.NUMERO ||
|
|
8847
|
+
if (typeof operando === primitivos_1.default.NUMERO ||
|
|
8848
|
+
operando.tipo === delegua_2.default.NUMERO)
|
|
8606
8849
|
return;
|
|
8607
8850
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operando precisa ser um número.', Number(operador.linha));
|
|
8608
8851
|
}
|
|
@@ -8655,11 +8898,15 @@ class InterpretadorBase {
|
|
|
8655
8898
|
let resultado = '';
|
|
8656
8899
|
const conteudo = await this.avaliar(declaracao.expressao);
|
|
8657
8900
|
const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
|
|
8658
|
-
const tipoConteudo = conteudo.hasOwnProperty('tipo')
|
|
8901
|
+
const tipoConteudo = conteudo.hasOwnProperty('tipo')
|
|
8902
|
+
? conteudo.tipo
|
|
8903
|
+
: typeof conteudo;
|
|
8659
8904
|
resultado = valorConteudo;
|
|
8660
8905
|
if ([delegua_2.default.NUMERO, primitivos_1.default.NUMERO].includes(tipoConteudo) &&
|
|
8661
8906
|
declaracao.casasDecimais > 0) {
|
|
8662
|
-
resultado = valorConteudo.toLocaleString('pt', {
|
|
8907
|
+
resultado = valorConteudo.toLocaleString('pt', {
|
|
8908
|
+
maximumFractionDigits: declaracao.casasDecimais,
|
|
8909
|
+
});
|
|
8663
8910
|
}
|
|
8664
8911
|
if (declaracao.espacos > 0) {
|
|
8665
8912
|
resultado += ' '.repeat(declaracao.espacos);
|
|
@@ -8718,14 +8965,19 @@ class InterpretadorBase {
|
|
|
8718
8965
|
const direita = await this.avaliar(expressao.direita);
|
|
8719
8966
|
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
|
|
8720
8967
|
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
|
|
8721
|
-
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
8722
|
-
|
|
8968
|
+
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
8969
|
+
? esquerda.tipo
|
|
8970
|
+
: (0, inferenciador_1.inferirTipoVariavel)(esquerda);
|
|
8971
|
+
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo'))
|
|
8972
|
+
? direita.tipo
|
|
8973
|
+
: (0, inferenciador_1.inferirTipoVariavel)(direita);
|
|
8723
8974
|
switch (expressao.operador.tipo) {
|
|
8724
8975
|
case delegua_1.default.EXPONENCIACAO:
|
|
8725
8976
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
8726
8977
|
return Math.pow(valorEsquerdo, valorDireito);
|
|
8727
8978
|
case delegua_1.default.MAIOR:
|
|
8728
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8979
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8980
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8729
8981
|
return Number(valorEsquerdo) > Number(valorDireito);
|
|
8730
8982
|
}
|
|
8731
8983
|
return String(valorEsquerdo) > String(valorDireito);
|
|
@@ -8733,7 +8985,8 @@ class InterpretadorBase {
|
|
|
8733
8985
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
8734
8986
|
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
8735
8987
|
case delegua_1.default.MENOR:
|
|
8736
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8988
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8989
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8737
8990
|
return Number(valorEsquerdo) < Number(valorDireito);
|
|
8738
8991
|
}
|
|
8739
8992
|
return String(valorEsquerdo) < String(valorDireito);
|
|
@@ -8746,7 +8999,8 @@ class InterpretadorBase {
|
|
|
8746
8999
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
8747
9000
|
case delegua_1.default.ADICAO:
|
|
8748
9001
|
case delegua_1.default.MAIS_IGUAL:
|
|
8749
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
9002
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
9003
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8750
9004
|
return Number(valorEsquerdo) + Number(valorDireito);
|
|
8751
9005
|
}
|
|
8752
9006
|
// TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
|
|
@@ -8765,11 +9019,13 @@ class InterpretadorBase {
|
|
|
8765
9019
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
8766
9020
|
case delegua_1.default.MULTIPLICACAO:
|
|
8767
9021
|
case delegua_1.default.MULTIPLICACAO_IGUAL:
|
|
8768
|
-
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
9022
|
+
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
9023
|
+
tipoDireito === delegua_2.default.TEXTO) {
|
|
8769
9024
|
// Sem ambos os valores resolvem como texto, multiplica normal.
|
|
8770
9025
|
// Se apenas um resolve como texto, o outro repete o
|
|
8771
9026
|
// texto n vezes, sendo n o valor do outro.
|
|
8772
|
-
if (tipoEsquerdo === delegua_2.default.TEXTO &&
|
|
9027
|
+
if (tipoEsquerdo === delegua_2.default.TEXTO &&
|
|
9028
|
+
tipoDireito === delegua_2.default.TEXTO) {
|
|
8773
9029
|
return Number(valorEsquerdo) * Number(valorDireito);
|
|
8774
9030
|
}
|
|
8775
9031
|
if (tipoEsquerdo === delegua_2.default.TEXTO) {
|
|
@@ -8841,7 +9097,8 @@ class InterpretadorBase {
|
|
|
8841
9097
|
try {
|
|
8842
9098
|
const variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
|
|
8843
9099
|
if (variavelEntidadeChamada === null) {
|
|
8844
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
|
|
9100
|
+
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
|
|
9101
|
+
String(expressao.entidadeChamada), expressao.linha));
|
|
8845
9102
|
}
|
|
8846
9103
|
const entidadeChamada = variavelEntidadeChamada.hasOwnProperty('valor')
|
|
8847
9104
|
? variavelEntidadeChamada.valor
|
|
@@ -8853,7 +9110,9 @@ class InterpretadorBase {
|
|
|
8853
9110
|
return await this.chamarMetodoPrimitiva(expressao, entidadeChamada);
|
|
8854
9111
|
}
|
|
8855
9112
|
const argumentos = await this.resolverArgumentosChamada(expressao);
|
|
8856
|
-
const aridade = entidadeChamada.aridade
|
|
9113
|
+
const aridade = entidadeChamada.aridade
|
|
9114
|
+
? entidadeChamada.aridade()
|
|
9115
|
+
: entidadeChamada.length;
|
|
8857
9116
|
// Completar os argumentos não preenchidos com valores indefinidos.
|
|
8858
9117
|
if (argumentos.length < aridade) {
|
|
8859
9118
|
const diferenca = aridade - argumentos.length;
|
|
@@ -8866,7 +9125,9 @@ class InterpretadorBase {
|
|
|
8866
9125
|
}
|
|
8867
9126
|
if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
|
|
8868
9127
|
try {
|
|
8869
|
-
return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor')
|
|
9128
|
+
return entidadeChamada.chamar(this, argumentos.map((a) => a && a.valor && a.valor.hasOwnProperty('valor')
|
|
9129
|
+
? a.valor.valor
|
|
9130
|
+
: a === null || a === void 0 ? void 0 : a.valor), expressao.entidadeChamada.simbolo);
|
|
8870
9131
|
}
|
|
8871
9132
|
catch (erro) {
|
|
8872
9133
|
this.erros.push({
|
|
@@ -8879,7 +9140,8 @@ class InterpretadorBase {
|
|
|
8879
9140
|
// Por algum motivo misterioso, `entidadeChamada instanceof Chamavel` dá `false` em Liquido,
|
|
8880
9141
|
// mesmo que esteja tudo certo com `DeleguaFuncao`,
|
|
8881
9142
|
// então precisamos testar o nome do construtor também.
|
|
8882
|
-
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
9143
|
+
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
9144
|
+
entidadeChamada.constructor.name === 'DeleguaFuncao') {
|
|
8883
9145
|
const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
|
|
8884
9146
|
return retornoEntidadeChamada;
|
|
8885
9147
|
}
|
|
@@ -8932,7 +9194,9 @@ class InterpretadorBase {
|
|
|
8932
9194
|
// Nunca será método aqui: apenas propriedade.
|
|
8933
9195
|
const alvoPropriedade = expressao.alvo;
|
|
8934
9196
|
const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
|
|
8935
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9197
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9198
|
+
? variavelObjeto.valor
|
|
9199
|
+
: variavelObjeto;
|
|
8936
9200
|
const valor = await this.avaliar(expressao.valor);
|
|
8937
9201
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
8938
9202
|
const objetoDeleguaClasse = objeto;
|
|
@@ -8961,7 +9225,8 @@ class InterpretadorBase {
|
|
|
8961
9225
|
return direita.includes(esquerda);
|
|
8962
9226
|
}
|
|
8963
9227
|
else if (direita !== null && typeof direita === 'object') {
|
|
8964
|
-
return esquerda in direita ||
|
|
9228
|
+
return (esquerda in direita ||
|
|
9229
|
+
(direita.valor !== undefined && esquerda in direita.valor));
|
|
8965
9230
|
}
|
|
8966
9231
|
throw new excecoes_1.ErroEmTempoDeExecucao(esquerda, "Tipo de chamada inválida com 'em'.", expressao.linha);
|
|
8967
9232
|
}
|
|
@@ -8986,7 +9251,8 @@ class InterpretadorBase {
|
|
|
8986
9251
|
}
|
|
8987
9252
|
let retornoExecucao;
|
|
8988
9253
|
while (!(retornoExecucao instanceof quebras_1.Quebra)) {
|
|
8989
|
-
if (declaracao.condicao !== null &&
|
|
9254
|
+
if (declaracao.condicao !== null &&
|
|
9255
|
+
!this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
8990
9256
|
break;
|
|
8991
9257
|
}
|
|
8992
9258
|
try {
|
|
@@ -9018,11 +9284,14 @@ class InterpretadorBase {
|
|
|
9018
9284
|
// laço de repetição.
|
|
9019
9285
|
declaracao.posicaoAtual = 0;
|
|
9020
9286
|
const vetorResolvido = await this.avaliar(declaracao.vetor);
|
|
9021
|
-
const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
|
|
9287
|
+
const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
|
|
9288
|
+
? vetorResolvido.valor
|
|
9289
|
+
: vetorResolvido;
|
|
9022
9290
|
if (!Array.isArray(valorVetorResolvido)) {
|
|
9023
9291
|
return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
|
|
9024
9292
|
}
|
|
9025
|
-
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9293
|
+
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9294
|
+
declaracao.posicaoAtual < valorVetorResolvido.length) {
|
|
9026
9295
|
try {
|
|
9027
9296
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.nomeVariavelIteracao, valorVetorResolvido[declaracao.posicaoAtual]);
|
|
9028
9297
|
retornoExecucao = await this.executar(declaracao.corpo);
|
|
@@ -9068,7 +9337,8 @@ class InterpretadorBase {
|
|
|
9068
9337
|
}
|
|
9069
9338
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
9070
9339
|
let retornoExecucao;
|
|
9071
|
-
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9340
|
+
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9341
|
+
this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
9072
9342
|
try {
|
|
9073
9343
|
retornoExecucao = await this.executar(declaracao.corpo);
|
|
9074
9344
|
if (retornoExecucao instanceof quebras_1.SustarQuebra) {
|
|
@@ -9091,7 +9361,9 @@ class InterpretadorBase {
|
|
|
9091
9361
|
}
|
|
9092
9362
|
async visitarDeclaracaoEscolha(declaracao) {
|
|
9093
9363
|
const condicaoEscolha = await this.avaliar(declaracao.identificadorOuLiteral);
|
|
9094
|
-
const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
|
|
9364
|
+
const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
|
|
9365
|
+
? condicaoEscolha.valor
|
|
9366
|
+
: condicaoEscolha;
|
|
9095
9367
|
const caminhos = declaracao.caminhos;
|
|
9096
9368
|
const caminhoPadrao = declaracao.caminhoPadrao;
|
|
9097
9369
|
let encontrado = false;
|
|
@@ -9173,9 +9445,7 @@ class InterpretadorBase {
|
|
|
9173
9445
|
}
|
|
9174
9446
|
else {
|
|
9175
9447
|
const literalErro = new construtos_1.Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
|
|
9176
|
-
const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [
|
|
9177
|
-
literalErro,
|
|
9178
|
-
]);
|
|
9448
|
+
const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [literalErro]);
|
|
9179
9449
|
valorRetorno = await chamadaPegue.aceitar(this);
|
|
9180
9450
|
}
|
|
9181
9451
|
}
|
|
@@ -9195,7 +9465,9 @@ class InterpretadorBase {
|
|
|
9195
9465
|
let formatoTexto = '';
|
|
9196
9466
|
for (const argumento of argumentos) {
|
|
9197
9467
|
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
9198
|
-
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
|
|
9468
|
+
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
|
|
9469
|
+
? resultadoAvaliacao.valor
|
|
9470
|
+
: resultadoAvaliacao;
|
|
9199
9471
|
formatoTexto += `${this.paraTexto(valor)} `;
|
|
9200
9472
|
}
|
|
9201
9473
|
return formatoTexto.trimEnd();
|
|
@@ -9356,10 +9628,15 @@ class InterpretadorBase {
|
|
|
9356
9628
|
}
|
|
9357
9629
|
}
|
|
9358
9630
|
async visitarExpressaoAcessoIndiceVariavel(expressao) {
|
|
9359
|
-
const promises = await Promise.all([
|
|
9631
|
+
const promises = await Promise.all([
|
|
9632
|
+
this.avaliar(expressao.entidadeChamada),
|
|
9633
|
+
this.avaliar(expressao.indice),
|
|
9634
|
+
]);
|
|
9360
9635
|
const variavelObjeto = promises[0];
|
|
9361
9636
|
const indice = promises[1];
|
|
9362
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9637
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9638
|
+
? variavelObjeto.valor
|
|
9639
|
+
: variavelObjeto;
|
|
9363
9640
|
let valorIndice = indice.hasOwnProperty('valor') ? indice.valor : indice;
|
|
9364
9641
|
if (Array.isArray(objeto)) {
|
|
9365
9642
|
if (!Number.isInteger(valorIndice)) {
|
|
@@ -9405,7 +9682,9 @@ class InterpretadorBase {
|
|
|
9405
9682
|
}
|
|
9406
9683
|
async visitarExpressaoDefinirValor(expressao) {
|
|
9407
9684
|
const variavelObjeto = await this.avaliar(expressao.objeto);
|
|
9408
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9685
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9686
|
+
? variavelObjeto.valor
|
|
9687
|
+
: variavelObjeto;
|
|
9409
9688
|
if (objeto.constructor.name !== 'ObjetoDeleguaClasse' && objeto.constructor !== Object) {
|
|
9410
9689
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.nome, 'Somente instâncias e dicionários podem possuir campos.', expressao.linha));
|
|
9411
9690
|
}
|
|
@@ -9472,10 +9751,13 @@ class InterpretadorBase {
|
|
|
9472
9751
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
9473
9752
|
variavelObjeto = variavelObjeto.valor;
|
|
9474
9753
|
}
|
|
9475
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9754
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9755
|
+
? variavelObjeto.valor
|
|
9756
|
+
: variavelObjeto;
|
|
9476
9757
|
// Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
|
|
9477
9758
|
// então testamos também o nome do construtor.
|
|
9478
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
9759
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
9760
|
+
objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
9479
9761
|
const valor = objeto.obter(expressao.simbolo);
|
|
9480
9762
|
if (valor === 0)
|
|
9481
9763
|
return 0;
|
|
@@ -9520,13 +9802,18 @@ class InterpretadorBase {
|
|
|
9520
9802
|
async visitarExpressaoDicionario(expressao) {
|
|
9521
9803
|
const dicionario = {};
|
|
9522
9804
|
for (let i = 0; i < expressao.chaves.length; i++) {
|
|
9523
|
-
const promises = await Promise.all([
|
|
9805
|
+
const promises = await Promise.all([
|
|
9806
|
+
this.avaliar(expressao.chaves[i]),
|
|
9807
|
+
this.avaliar(expressao.valores[i]),
|
|
9808
|
+
]);
|
|
9524
9809
|
if (typeof promises[0] === 'boolean') {
|
|
9525
9810
|
const chaveLogico = promises[0] === true ? 'verdadeiro' : 'falso';
|
|
9526
9811
|
dicionario[chaveLogico] = promises[1];
|
|
9527
9812
|
continue;
|
|
9528
9813
|
}
|
|
9529
|
-
dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
|
|
9814
|
+
dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
|
|
9815
|
+
? promises[1].valor
|
|
9816
|
+
: promises[1];
|
|
9530
9817
|
}
|
|
9531
9818
|
return dicionario;
|
|
9532
9819
|
}
|
|
@@ -9588,7 +9875,10 @@ class InterpretadorBase {
|
|
|
9588
9875
|
retornoVetor += `${JSON.stringify(elemento)}, `;
|
|
9589
9876
|
continue;
|
|
9590
9877
|
}
|
|
9591
|
-
retornoVetor +=
|
|
9878
|
+
retornoVetor +=
|
|
9879
|
+
typeof elemento === 'string'
|
|
9880
|
+
? `'${elemento}', `
|
|
9881
|
+
: `${this.paraTexto(elemento)}, `;
|
|
9592
9882
|
}
|
|
9593
9883
|
if (retornoVetor.length > 1) {
|
|
9594
9884
|
retornoVetor = retornoVetor.slice(0, -2);
|
|
@@ -9649,7 +9939,8 @@ class InterpretadorBase {
|
|
|
9649
9939
|
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
9650
9940
|
let retornoExecucao;
|
|
9651
9941
|
try {
|
|
9652
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9942
|
+
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9943
|
+
ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
9653
9944
|
retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
|
|
9654
9945
|
}
|
|
9655
9946
|
return retornoExecucao;
|
|
@@ -9862,7 +10153,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
9862
10153
|
let formatoTexto = '';
|
|
9863
10154
|
for (const argumento of argumentos) {
|
|
9864
10155
|
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
9865
|
-
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
|
|
10156
|
+
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
|
|
10157
|
+
? resultadoAvaliacao.valor
|
|
10158
|
+
: resultadoAvaliacao;
|
|
9866
10159
|
formatoTexto += `${this.paraTexto(valor)} `;
|
|
9867
10160
|
}
|
|
9868
10161
|
return formatoTexto.trimEnd();
|
|
@@ -10062,7 +10355,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10062
10355
|
let i = this.pilhaEscoposExecucao.pilha.length - 1;
|
|
10063
10356
|
while (i > 0) {
|
|
10064
10357
|
let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10065
|
-
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10358
|
+
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10359
|
+
ultimoEscopo.finalizado) {
|
|
10066
10360
|
this.pilhaEscoposExecucao.removerUltimo();
|
|
10067
10361
|
const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10068
10362
|
escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
|
|
@@ -10097,7 +10391,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10097
10391
|
if (!this.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
|
|
10098
10392
|
ultimoEscopo.declaracaoAtual++;
|
|
10099
10393
|
}
|
|
10100
|
-
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10394
|
+
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10395
|
+
ultimoEscopo.finalizado) {
|
|
10101
10396
|
if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
|
|
10102
10397
|
this.descartarEscopoPorRetornoFuncao();
|
|
10103
10398
|
}
|
|
@@ -10126,7 +10421,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10126
10421
|
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10127
10422
|
let retornoExecucao;
|
|
10128
10423
|
try {
|
|
10129
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
10424
|
+
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
10425
|
+
ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
10130
10426
|
if (naoVerificarPrimeiraExecucao) {
|
|
10131
10427
|
naoVerificarPrimeiraExecucao = false;
|
|
10132
10428
|
}
|
|
@@ -10205,7 +10501,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10205
10501
|
await this.instrucaoPasso(escopo + 1);
|
|
10206
10502
|
}
|
|
10207
10503
|
else {
|
|
10208
|
-
if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
|
|
10504
|
+
if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
|
|
10505
|
+
escopoVisitado.finalizado) {
|
|
10209
10506
|
this.pilhaEscoposExecucao.removerUltimo();
|
|
10210
10507
|
}
|
|
10211
10508
|
if (this.pilhaEscoposExecucao.elementos() === 1) {
|
|
@@ -10284,7 +10581,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10284
10581
|
* @param nome O nome da variável.
|
|
10285
10582
|
*/
|
|
10286
10583
|
obterVariavel(nome) {
|
|
10287
|
-
const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({
|
|
10584
|
+
const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({
|
|
10585
|
+
lexema: nome,
|
|
10586
|
+
});
|
|
10288
10587
|
return valorOuVariavel.hasOwnProperty('valor')
|
|
10289
10588
|
? valorOuVariavel
|
|
10290
10589
|
: {
|
|
@@ -10332,7 +10631,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10332
10631
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10333
10632
|
variavelObjeto = variavelObjeto.valor;
|
|
10334
10633
|
}
|
|
10335
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10634
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10635
|
+
? variavelObjeto.valor
|
|
10636
|
+
: variavelObjeto;
|
|
10336
10637
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10337
10638
|
return objeto.obterMetodo(expressao.nomeMetodo) || null;
|
|
10338
10639
|
}
|
|
@@ -10412,7 +10713,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10412
10713
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10413
10714
|
variavelObjeto = variavelObjeto.valor;
|
|
10414
10715
|
}
|
|
10415
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10716
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10717
|
+
? variavelObjeto.valor
|
|
10718
|
+
: variavelObjeto;
|
|
10416
10719
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10417
10720
|
return objeto.obter(expressao.simbolo);
|
|
10418
10721
|
}
|
|
@@ -10476,10 +10779,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10476
10779
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10477
10780
|
variavelObjeto = variavelObjeto.valor;
|
|
10478
10781
|
}
|
|
10479
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10782
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10783
|
+
? variavelObjeto.valor
|
|
10784
|
+
: variavelObjeto;
|
|
10480
10785
|
// Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
|
|
10481
10786
|
// então testamos também o nome do construtor.
|
|
10482
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
10787
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
10788
|
+
objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10483
10789
|
return objeto.obterMetodo(expressao.nomePropriedade) || null;
|
|
10484
10790
|
}
|
|
10485
10791
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
@@ -10529,7 +10835,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10529
10835
|
// Se o retorno for uma função anônima, o escopo precisa ser preservado.
|
|
10530
10836
|
// Como quebras matam o topo da pilha de escopos, precisamos dizer
|
|
10531
10837
|
// para a finalização para copiar as variáveis para o escopo de baixo.
|
|
10532
|
-
|
|
10838
|
+
const construtorRetorno = retornoQuebra.valor.constructor.name.replaceAll('_', '');
|
|
10839
|
+
if (construtorRetorno === 'DeleguaFuncao') {
|
|
10533
10840
|
retornoQuebra.preservarEscopo = true;
|
|
10534
10841
|
}
|
|
10535
10842
|
return retornoQuebra;
|
|
@@ -10998,7 +11305,9 @@ class LexadorEguaClassico {
|
|
|
10998
11305
|
this.avancar();
|
|
10999
11306
|
}
|
|
11000
11307
|
const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
|
|
11001
|
-
const tipo = codigo in egua_classico_1.palavrasReservadas
|
|
11308
|
+
const tipo = codigo in egua_classico_1.palavrasReservadas
|
|
11309
|
+
? egua_classico_1.palavrasReservadas[codigo]
|
|
11310
|
+
: egua_classico_2.default.IDENTIFICADOR;
|
|
11002
11311
|
this.adicionarSimbolo(tipo);
|
|
11003
11312
|
}
|
|
11004
11313
|
analisarToken() {
|
|
@@ -11193,8 +11502,12 @@ class LexadorGuarani extends lexador_base_1.LexadorBase {
|
|
|
11193
11502
|
while (this.eAlfabetoOuDigito(this.simboloAtual())) {
|
|
11194
11503
|
this.avancar();
|
|
11195
11504
|
}
|
|
11196
|
-
const codigo = this.codigo[this.linha]
|
|
11197
|
-
|
|
11505
|
+
const codigo = this.codigo[this.linha]
|
|
11506
|
+
.substring(this.inicioSimbolo, this.atual)
|
|
11507
|
+
.toLowerCase();
|
|
11508
|
+
const tipo = codigo in guarani_2.palavrasReservadas
|
|
11509
|
+
? guarani_2.palavrasReservadas[codigo]
|
|
11510
|
+
: guarani_1.default.IDENTIFICADOR;
|
|
11198
11511
|
this.adicionarSimbolo(tipo);
|
|
11199
11512
|
}
|
|
11200
11513
|
analisarToken() {
|
|
@@ -11348,7 +11661,8 @@ class LexadorPitugues {
|
|
|
11348
11661
|
eFinalDoCodigo() {
|
|
11349
11662
|
if (this.linha > this.codigo.length - 1)
|
|
11350
11663
|
return true;
|
|
11351
|
-
return this.linha == this.codigo.length - 1 &&
|
|
11664
|
+
return (this.linha == this.codigo.length - 1 &&
|
|
11665
|
+
this.codigo[this.codigo.length - 1].length <= this.atual);
|
|
11352
11666
|
}
|
|
11353
11667
|
avancar() {
|
|
11354
11668
|
this.atual += 1;
|
|
@@ -11417,7 +11731,8 @@ class LexadorPitugues {
|
|
|
11417
11731
|
}
|
|
11418
11732
|
identificarPalavraChave() {
|
|
11419
11733
|
const linhaPrimeiroCaracter = this.linha;
|
|
11420
|
-
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
11734
|
+
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
11735
|
+
this.linha === linhaPrimeiroCaracter) {
|
|
11421
11736
|
this.avancar();
|
|
11422
11737
|
}
|
|
11423
11738
|
let textoPalavraChave;
|
|
@@ -11717,7 +12032,8 @@ class LexadorPortugolIpt {
|
|
|
11717
12032
|
eFinalDoCodigo() {
|
|
11718
12033
|
if (this.linha > this.codigo.length - 1)
|
|
11719
12034
|
return true;
|
|
11720
|
-
return this.linha == this.codigo.length - 1 &&
|
|
12035
|
+
return (this.linha == this.codigo.length - 1 &&
|
|
12036
|
+
this.codigo[this.codigo.length - 1].length <= this.atual);
|
|
11721
12037
|
}
|
|
11722
12038
|
/**
|
|
11723
12039
|
* Indica se o código está na última linha.
|
|
@@ -11795,7 +12111,8 @@ class LexadorPortugolIpt {
|
|
|
11795
12111
|
}
|
|
11796
12112
|
identificarPalavraChave() {
|
|
11797
12113
|
const linhaPrimeiroCaracter = this.linha;
|
|
11798
|
-
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
12114
|
+
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
12115
|
+
this.linha === linhaPrimeiroCaracter) {
|
|
11799
12116
|
this.avancar();
|
|
11800
12117
|
}
|
|
11801
12118
|
let textoPalavraChave;
|
|
@@ -12449,7 +12766,9 @@ class Lexador {
|
|
|
12449
12766
|
this.avancar();
|
|
12450
12767
|
}
|
|
12451
12768
|
const codigo = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual);
|
|
12452
|
-
const tipo = codigo in palavras_reservadas_1.palavrasReservadas
|
|
12769
|
+
const tipo = codigo in palavras_reservadas_1.palavrasReservadas
|
|
12770
|
+
? palavras_reservadas_1.palavrasReservadas[codigo]
|
|
12771
|
+
: delegua_1.default.IDENTIFICADOR;
|
|
12453
12772
|
this.adicionarSimbolo(tipo);
|
|
12454
12773
|
}
|
|
12455
12774
|
analisarToken() {
|
|
@@ -12815,7 +13134,9 @@ class MicroLexador {
|
|
|
12815
13134
|
this.atual++;
|
|
12816
13135
|
}
|
|
12817
13136
|
const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
|
|
12818
|
-
const tipo = codigo in palavras_reservadas_1.palavrasReservadasMicroGramatica
|
|
13137
|
+
const tipo = codigo in palavras_reservadas_1.palavrasReservadasMicroGramatica
|
|
13138
|
+
? palavras_reservadas_1.palavrasReservadasMicroGramatica[codigo]
|
|
13139
|
+
: delegua_1.default.IDENTIFICADOR;
|
|
12819
13140
|
this.adicionarSimbolo(tipo);
|
|
12820
13141
|
}
|
|
12821
13142
|
analisarToken() {
|
|
@@ -13729,7 +14050,8 @@ class Python3Lexer extends Lexer_1.Lexer {
|
|
|
13729
14050
|
}
|
|
13730
14051
|
else {
|
|
13731
14052
|
// Possibly emit more than 1 DEDENT token.
|
|
13732
|
-
while (this.indents.length &&
|
|
14053
|
+
while (this.indents.length &&
|
|
14054
|
+
this.indents[this.indents.length - 1] > indent) {
|
|
13733
14055
|
this.emit(this.createDedent());
|
|
13734
14056
|
this.indents.pop();
|
|
13735
14057
|
}
|
|
@@ -15445,7 +15767,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
15445
15767
|
this.state = 269;
|
|
15446
15768
|
this._errHandler.sync(this);
|
|
15447
15769
|
_alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx);
|
|
15448
|
-
while (_alt !== 2 &&
|
|
15770
|
+
while (_alt !== 2 &&
|
|
15771
|
+
_alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
|
|
15449
15772
|
if (_alt === 1) {
|
|
15450
15773
|
{
|
|
15451
15774
|
{
|
|
@@ -15758,7 +16081,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
15758
16081
|
this.state = 357;
|
|
15759
16082
|
this._errHandler.sync(this);
|
|
15760
16083
|
_alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx);
|
|
15761
|
-
while (_alt !== 2 &&
|
|
16084
|
+
while (_alt !== 2 &&
|
|
16085
|
+
_alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
|
|
15762
16086
|
if (_alt === 1) {
|
|
15763
16087
|
{
|
|
15764
16088
|
{
|
|
@@ -16996,12 +17320,14 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
16996
17320
|
this.state = 526;
|
|
16997
17321
|
this._errHandler.sync(this);
|
|
16998
17322
|
_la = this._input.LA(1);
|
|
16999
|
-
while (_la === Python3Parser.DOT ||
|
|
17323
|
+
while (_la === Python3Parser.DOT ||
|
|
17324
|
+
_la === Python3Parser.ELLIPSIS) {
|
|
17000
17325
|
{
|
|
17001
17326
|
{
|
|
17002
17327
|
this.state = 523;
|
|
17003
17328
|
_la = this._input.LA(1);
|
|
17004
|
-
if (!(_la === Python3Parser.DOT ||
|
|
17329
|
+
if (!(_la === Python3Parser.DOT ||
|
|
17330
|
+
_la === Python3Parser.ELLIPSIS)) {
|
|
17005
17331
|
this._errHandler.recoverInline(this);
|
|
17006
17332
|
}
|
|
17007
17333
|
else {
|
|
@@ -17031,7 +17357,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
17031
17357
|
{
|
|
17032
17358
|
this.state = 530;
|
|
17033
17359
|
_la = this._input.LA(1);
|
|
17034
|
-
if (!(_la === Python3Parser.DOT ||
|
|
17360
|
+
if (!(_la === Python3Parser.DOT ||
|
|
17361
|
+
_la === Python3Parser.ELLIPSIS)) {
|
|
17035
17362
|
this._errHandler.recoverInline(this);
|
|
17036
17363
|
}
|
|
17037
17364
|
else {
|
|
@@ -17046,7 +17373,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
17046
17373
|
this.state = 533;
|
|
17047
17374
|
this._errHandler.sync(this);
|
|
17048
17375
|
_la = this._input.LA(1);
|
|
17049
|
-
} while (_la === Python3Parser.DOT ||
|
|
17376
|
+
} while (_la === Python3Parser.DOT ||
|
|
17377
|
+
_la === Python3Parser.ELLIPSIS);
|
|
17050
17378
|
}
|
|
17051
17379
|
break;
|
|
17052
17380
|
}
|
|
@@ -18506,7 +18834,9 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
18506
18834
|
_la = this._input.LA(1);
|
|
18507
18835
|
while (((_la & ~0x1f) === 0 &&
|
|
18508
18836
|
((1 << _la) &
|
|
18509
|
-
((1 << Python3Parser.IN) |
|
|
18837
|
+
((1 << Python3Parser.IN) |
|
|
18838
|
+
(1 << Python3Parser.NOT) |
|
|
18839
|
+
(1 << Python3Parser.IS))) !==
|
|
18510
18840
|
0) ||
|
|
18511
18841
|
(((_la - 74) & ~0x1f) === 0 &&
|
|
18512
18842
|
((1 << (_la - 74)) &
|
|
@@ -18828,7 +19158,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
18828
19158
|
{
|
|
18829
19159
|
this.state = 828;
|
|
18830
19160
|
_la = this._input.LA(1);
|
|
18831
|
-
if (!(_la === Python3Parser.LEFT_SHIFT ||
|
|
19161
|
+
if (!(_la === Python3Parser.LEFT_SHIFT ||
|
|
19162
|
+
_la === Python3Parser.RIGHT_SHIFT)) {
|
|
18832
19163
|
this._errHandler.recoverInline(this);
|
|
18833
19164
|
}
|
|
18834
19165
|
else {
|
|
@@ -26221,7 +26552,8 @@ class TradutorAssemblyScript {
|
|
|
26221
26552
|
resultado += ' '.repeat(this.indentacao);
|
|
26222
26553
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
26223
26554
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
26224
|
-
resultado +=
|
|
26555
|
+
resultado +=
|
|
26556
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26225
26557
|
}
|
|
26226
26558
|
}
|
|
26227
26559
|
else {
|
|
@@ -26235,7 +26567,8 @@ class TradutorAssemblyScript {
|
|
|
26235
26567
|
if (declaracaoTente.caminhoFinalmente !== null) {
|
|
26236
26568
|
resultado += '\nfinally {\n';
|
|
26237
26569
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
26238
|
-
resultado +=
|
|
26570
|
+
resultado +=
|
|
26571
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
26239
26572
|
}
|
|
26240
26573
|
resultado += ' '.repeat(this.indentacao);
|
|
26241
26574
|
resultado += '}';
|
|
@@ -26265,7 +26598,10 @@ class TradutorAssemblyScript {
|
|
|
26265
26598
|
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
26266
26599
|
this.indentacao += 4;
|
|
26267
26600
|
let resultado = ' '.repeat(this.indentacao);
|
|
26268
|
-
resultado +=
|
|
26601
|
+
resultado +=
|
|
26602
|
+
metodoClasse.simbolo.lexema === 'construtor'
|
|
26603
|
+
? 'constructor('
|
|
26604
|
+
: metodoClasse.simbolo.lexema + '(';
|
|
26269
26605
|
for (let parametro of metodoClasse.funcao.parametros) {
|
|
26270
26606
|
resultado += parametro.nome.lexema + ', ';
|
|
26271
26607
|
}
|
|
@@ -26385,7 +26721,8 @@ class TradutorAssemblyScript {
|
|
|
26385
26721
|
this.indentacao += 4;
|
|
26386
26722
|
resultado += ' '.repeat(this.indentacao);
|
|
26387
26723
|
for (let condicao of caminho.condicoes) {
|
|
26388
|
-
resultado +=
|
|
26724
|
+
resultado +=
|
|
26725
|
+
'case ' + this.dicionarioConstrutos[condicao.constructor.name](condicao) + ':\n';
|
|
26389
26726
|
resultado += ' '.repeat(this.indentacao);
|
|
26390
26727
|
}
|
|
26391
26728
|
for (let declaracao of caminho.declaracoes) {
|
|
@@ -26398,7 +26735,8 @@ class TradutorAssemblyScript {
|
|
|
26398
26735
|
this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
|
|
26399
26736
|
break;
|
|
26400
26737
|
default:
|
|
26401
|
-
resultado +=
|
|
26738
|
+
resultado +=
|
|
26739
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26402
26740
|
break;
|
|
26403
26741
|
}
|
|
26404
26742
|
resultado += ' '.repeat(this.indentacao + 4);
|
|
@@ -26538,20 +26876,27 @@ class TradutorAssemblyScript {
|
|
|
26538
26876
|
traduzirConstrutoBinario(binario) {
|
|
26539
26877
|
let resultado = '';
|
|
26540
26878
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
26541
|
-
resultado +=
|
|
26879
|
+
resultado +=
|
|
26880
|
+
'(' +
|
|
26881
|
+
this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
|
|
26882
|
+
')';
|
|
26542
26883
|
else
|
|
26543
26884
|
resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
26544
26885
|
let operador = this.traduzirSimboloOperador(binario.operador);
|
|
26545
26886
|
resultado += ` ${operador} `;
|
|
26546
26887
|
if (binario.direita.constructor.name === 'Agrupamento')
|
|
26547
|
-
resultado +=
|
|
26888
|
+
resultado +=
|
|
26889
|
+
'(' +
|
|
26890
|
+
this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
|
|
26891
|
+
')';
|
|
26548
26892
|
else
|
|
26549
26893
|
resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
26550
26894
|
return resultado;
|
|
26551
26895
|
}
|
|
26552
26896
|
traduzirConstrutoAtribuir(atribuir) {
|
|
26553
26897
|
let resultado = this.dicionarioConstrutos[atribuir.alvo.constructor.name](atribuir.alvo);
|
|
26554
|
-
resultado +=
|
|
26898
|
+
resultado +=
|
|
26899
|
+
' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
26555
26900
|
return resultado;
|
|
26556
26901
|
}
|
|
26557
26902
|
// TODO: Eliminar o soft cast para `any`.
|
|
@@ -26767,13 +27112,19 @@ class TradutorJavaScript {
|
|
|
26767
27112
|
traduzirConstrutoBinario(binario) {
|
|
26768
27113
|
let resultado = '';
|
|
26769
27114
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
26770
|
-
resultado +=
|
|
27115
|
+
resultado +=
|
|
27116
|
+
'(' +
|
|
27117
|
+
this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
|
|
27118
|
+
')';
|
|
26771
27119
|
else
|
|
26772
27120
|
resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
26773
27121
|
let operador = this.traduzirSimboloOperador(binario.operador);
|
|
26774
27122
|
resultado += ` ${operador} `;
|
|
26775
27123
|
if (binario.direita.constructor.name === 'Agrupamento')
|
|
26776
|
-
resultado +=
|
|
27124
|
+
resultado +=
|
|
27125
|
+
'(' +
|
|
27126
|
+
this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
|
|
27127
|
+
')';
|
|
26777
27128
|
else
|
|
26778
27129
|
resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
26779
27130
|
return resultado;
|
|
@@ -26811,7 +27162,8 @@ class TradutorJavaScript {
|
|
|
26811
27162
|
for (let i = 0; i < dicionario.chaves.length; i++) {
|
|
26812
27163
|
resultado += this.dicionarioConstrutos[dicionario.chaves[i].constructor.name](dicionario.chaves[i]);
|
|
26813
27164
|
resultado += ':';
|
|
26814
|
-
resultado +=
|
|
27165
|
+
resultado +=
|
|
27166
|
+
this.dicionarioConstrutos[dicionario.valores[i].constructor.name](dicionario.valores[i]) + ',';
|
|
26815
27167
|
}
|
|
26816
27168
|
resultado += '}';
|
|
26817
27169
|
return resultado;
|
|
@@ -26884,7 +27236,10 @@ class TradutorJavaScript {
|
|
|
26884
27236
|
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
26885
27237
|
this.indentacao += 4;
|
|
26886
27238
|
let resultado = ' '.repeat(this.indentacao);
|
|
26887
|
-
resultado +=
|
|
27239
|
+
resultado +=
|
|
27240
|
+
metodoClasse.simbolo.lexema === 'construtor'
|
|
27241
|
+
? 'constructor('
|
|
27242
|
+
: metodoClasse.simbolo.lexema + '(';
|
|
26888
27243
|
for (let parametro of metodoClasse.funcao.parametros) {
|
|
26889
27244
|
resultado += parametro.nome.lexema + ', ';
|
|
26890
27245
|
}
|
|
@@ -26922,7 +27277,10 @@ class TradutorJavaScript {
|
|
|
26922
27277
|
resultado += ' '.repeat(this.indentacao);
|
|
26923
27278
|
if (caminho.condicoes && caminho.condicoes.length > 0) {
|
|
26924
27279
|
for (let condicao of caminho.condicoes) {
|
|
26925
|
-
resultado +=
|
|
27280
|
+
resultado +=
|
|
27281
|
+
'case ' +
|
|
27282
|
+
this.dicionarioConstrutos[condicao.constructor.name](condicao) +
|
|
27283
|
+
':\n';
|
|
26926
27284
|
resultado += ' '.repeat(this.indentacao);
|
|
26927
27285
|
}
|
|
26928
27286
|
}
|
|
@@ -26940,7 +27298,8 @@ class TradutorJavaScript {
|
|
|
26940
27298
|
this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
|
|
26941
27299
|
break;
|
|
26942
27300
|
default:
|
|
26943
|
-
resultado +=
|
|
27301
|
+
resultado +=
|
|
27302
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26944
27303
|
break;
|
|
26945
27304
|
}
|
|
26946
27305
|
}
|
|
@@ -27074,7 +27433,8 @@ class TradutorJavaScript {
|
|
|
27074
27433
|
resultado += ' '.repeat(this.indentacao);
|
|
27075
27434
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
27076
27435
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
27077
|
-
resultado +=
|
|
27436
|
+
resultado +=
|
|
27437
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
27078
27438
|
}
|
|
27079
27439
|
}
|
|
27080
27440
|
else {
|
|
@@ -27088,7 +27448,8 @@ class TradutorJavaScript {
|
|
|
27088
27448
|
if (declaracaoTente.caminhoFinalmente !== null) {
|
|
27089
27449
|
resultado += '\nfinally {\n';
|
|
27090
27450
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
27091
|
-
resultado +=
|
|
27451
|
+
resultado +=
|
|
27452
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
27092
27453
|
}
|
|
27093
27454
|
resultado += ' '.repeat(this.indentacao);
|
|
27094
27455
|
resultado += '}';
|
|
@@ -28207,7 +28568,8 @@ class TradutorPython {
|
|
|
28207
28568
|
case 'texto':
|
|
28208
28569
|
return `str(${textoArgumentos})`;
|
|
28209
28570
|
default:
|
|
28210
|
-
if (argumentosValidados.length === 0 &&
|
|
28571
|
+
if (argumentosValidados.length === 0 &&
|
|
28572
|
+
!this.classesConhecidas.includes(variavel.simbolo.lexema)) {
|
|
28211
28573
|
return `${variavel.simbolo.lexema}`;
|
|
28212
28574
|
}
|
|
28213
28575
|
return `${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
@@ -28343,8 +28705,7 @@ class TradutorPython {
|
|
|
28343
28705
|
if (Array.isArray(declaracaoPara.inicializador)) {
|
|
28344
28706
|
for (const declaracaoInicializador of declaracaoPara.inicializador) {
|
|
28345
28707
|
resultado +=
|
|
28346
|
-
this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) +
|
|
28347
|
-
`\n`;
|
|
28708
|
+
this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
|
|
28348
28709
|
}
|
|
28349
28710
|
}
|
|
28350
28711
|
else {
|
|
@@ -28420,7 +28781,8 @@ class TradutorPython {
|
|
|
28420
28781
|
resultado += ' '.repeat(this.indentacao);
|
|
28421
28782
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
28422
28783
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
28423
|
-
resultado +=
|
|
28784
|
+
resultado +=
|
|
28785
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
28424
28786
|
}
|
|
28425
28787
|
}
|
|
28426
28788
|
else {
|
|
@@ -28434,7 +28796,8 @@ class TradutorPython {
|
|
|
28434
28796
|
resultado += '\nfinally:\n';
|
|
28435
28797
|
resultado += ' '.repeat(this.indentacao);
|
|
28436
28798
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
28437
|
-
resultado +=
|
|
28799
|
+
resultado +=
|
|
28800
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
28438
28801
|
}
|
|
28439
28802
|
}
|
|
28440
28803
|
return resultado;
|
|
@@ -28680,7 +29043,8 @@ class TradutorReversoJavaScript {
|
|
|
28680
29043
|
let resultado = '';
|
|
28681
29044
|
let emOuDe = declaracao.type === 'ForInStatement' ? 'em' : 'de';
|
|
28682
29045
|
resultado += `para (${this.traduzirDeclaracao(declaracao.left)} ${emOuDe} `;
|
|
28683
|
-
resultado +=
|
|
29046
|
+
resultado +=
|
|
29047
|
+
this.dicionarioConstrutos[declaracao.right.constructor.name](declaracao.right) + ') ';
|
|
28684
29048
|
resultado += this.logicaComumBlocoEscopo(declaracao.body);
|
|
28685
29049
|
return resultado;
|
|
28686
29050
|
}
|