@designliquido/delegua 0.42.2 → 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 +57 -40
- 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 +257 -58
- 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/dialetos/palavras-reservadas/pitugues.d.ts +0 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.js +0 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.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/tipos-de-simbolos/pitugues.d.ts +0 -1
- package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
- package/tipos-de-simbolos/pitugues.js +0 -1
- package/tipos-de-simbolos/pitugues.js.map +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 +628 -258
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,8 +1323,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1314
1323
|
}
|
|
1315
1324
|
switch (inicializador.constructor.name) {
|
|
1316
1325
|
case 'AcessoIndiceVariavel':
|
|
1317
|
-
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
1318
|
-
|
|
1326
|
+
const entidadeChamadaAcessoIndiceVariavel = inicializador
|
|
1327
|
+
.entidadeChamada;
|
|
1328
|
+
// Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
|
|
1329
|
+
if (entidadeChamadaAcessoIndiceVariavel.constructor.name === 'AcessoIndiceVariavel') {
|
|
1330
|
+
return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
|
|
1331
|
+
}
|
|
1332
|
+
if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
|
|
1333
|
+
return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
|
|
1334
|
+
}
|
|
1335
|
+
// Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
|
|
1336
|
+
return 'qualquer';
|
|
1319
1337
|
case 'Chamada':
|
|
1320
1338
|
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
1321
1339
|
switch (entidadeChamadaChamada.constructor.name) {
|
|
@@ -1323,8 +1341,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1323
1341
|
const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
|
|
1324
1342
|
return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
|
|
1325
1343
|
case 'AcessoMetodoOuPropriedade':
|
|
1326
|
-
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
1327
|
-
// 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.
|
|
1328
1346
|
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
1329
1347
|
const entidadeChamadaAcessoMetodoOuPropriedade = entidadeChamadaChamada;
|
|
1330
1348
|
if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaAcessoMetodoOuPropriedade.simbolo.lexema)) {
|
|
@@ -1360,9 +1378,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1360
1378
|
case 'Noneto':
|
|
1361
1379
|
case 'Deceto':
|
|
1362
1380
|
return delegua_1.default.TUPLA;
|
|
1363
|
-
case
|
|
1364
|
-
case
|
|
1365
|
-
return
|
|
1381
|
+
case 'ImportarBiblioteca':
|
|
1382
|
+
case 'ModuloDeclaracoes':
|
|
1383
|
+
return 'módulo';
|
|
1366
1384
|
default:
|
|
1367
1385
|
return inicializador.tipo;
|
|
1368
1386
|
}
|
|
@@ -1403,7 +1421,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1403
1421
|
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1404
1422
|
}
|
|
1405
1423
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1406
|
-
// Se tipo ainda não foi definido, infere.
|
|
1407
1424
|
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
1408
1425
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
1409
1426
|
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
@@ -1621,7 +1638,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1621
1638
|
this.pilhaDecoradores = [];
|
|
1622
1639
|
const metodos = [];
|
|
1623
1640
|
const propriedades = [];
|
|
1624
|
-
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
1641
|
+
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
1642
|
+
!this.estaNoFinal()) {
|
|
1625
1643
|
// Se o símbolo atual é arroba, é um decorador.
|
|
1626
1644
|
// Caso contrário, verificamos o próximo símbolo.
|
|
1627
1645
|
if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
|
|
@@ -1713,92 +1731,91 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1713
1731
|
}
|
|
1714
1732
|
/**
|
|
1715
1733
|
* Inicializa o primeiro nível da pilha de escopos, normalmente com ítens da biblioteca global.
|
|
1716
|
-
* TODO: Esta abordagem deve ser depreciada, em favor do novo suporte a referências de funções.
|
|
1717
1734
|
*/
|
|
1718
1735
|
inicializarPilhaEscopos() {
|
|
1719
1736
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
1720
1737
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
1721
1738
|
// Funções nativas de Delégua
|
|
1722
1739
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorio', 'inteiro', [
|
|
1723
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número')
|
|
1740
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número'),
|
|
1724
1741
|
]));
|
|
1725
1742
|
this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('aleatorioEntre', 'inteiro', [
|
|
1726
1743
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('minimo', 'número'),
|
|
1727
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número')
|
|
1744
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('maximo', 'número'),
|
|
1728
1745
|
]));
|
|
1729
1746
|
this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('algum', 'lógico', [
|
|
1730
1747
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1731
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1748
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1732
1749
|
]));
|
|
1733
1750
|
this.pilhaEscopos.definirInformacoesVariavel('encontrar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrar', 'qualquer', [
|
|
1734
1751
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1735
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1752
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1736
1753
|
]));
|
|
1737
1754
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarIndice', 'inteiro', [
|
|
1738
1755
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1739
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1756
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1740
1757
|
]));
|
|
1741
1758
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimo', 'inteiro', [
|
|
1742
1759
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1743
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1760
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1744
1761
|
]));
|
|
1745
1762
|
this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('encontrarUltimoIndice', 'inteiro', [
|
|
1746
1763
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1747
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função')
|
|
1764
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoPesquisa', 'função'),
|
|
1748
1765
|
]));
|
|
1749
1766
|
this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('filtrarPor', 'qualquer[]', [
|
|
1750
1767
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1751
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1768
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1752
1769
|
]));
|
|
1753
1770
|
this.pilhaEscopos.definirInformacoesVariavel('incluido', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('incluido', 'lógico', [
|
|
1754
1771
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1755
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1772
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
1756
1773
|
]));
|
|
1757
1774
|
this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inteiro', 'inteiro', [
|
|
1758
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer')
|
|
1775
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valor', 'qualquer'),
|
|
1759
1776
|
]));
|
|
1760
1777
|
this.pilhaEscopos.definirInformacoesVariavel('mapear', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('mapear', 'qualquer[]', [
|
|
1761
1778
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1762
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função')
|
|
1779
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoMapeamento', 'função'),
|
|
1763
1780
|
]));
|
|
1764
1781
|
this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1765
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1782
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1766
1783
|
]));
|
|
1767
1784
|
this.pilhaEscopos.definirInformacoesVariavel('número', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('número', 'número', [
|
|
1768
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1785
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1769
1786
|
]));
|
|
1770
1787
|
this.pilhaEscopos.definirInformacoesVariavel('ordenar', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('ordenar', 'qualquer[]', [
|
|
1771
1788
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1772
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
1789
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função'),
|
|
1773
1790
|
]));
|
|
1774
1791
|
this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('paraCada', 'qualquer[]', [
|
|
1775
1792
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1776
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1793
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1777
1794
|
]));
|
|
1778
1795
|
this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('primeiroEmCondicao', 'qualquer', [
|
|
1779
1796
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1780
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função')
|
|
1797
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoFiltragem', 'função'),
|
|
1781
1798
|
]));
|
|
1782
1799
|
this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('real', 'número', [
|
|
1783
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1800
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1784
1801
|
]));
|
|
1785
1802
|
this.pilhaEscopos.definirInformacoesVariavel('reduzir', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('reduzir', 'qualquer', [
|
|
1786
1803
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1787
1804
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoReducao', 'função'),
|
|
1788
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer')
|
|
1805
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorInicial', 'qualquer'),
|
|
1789
1806
|
]));
|
|
1790
1807
|
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tamanho', 'inteiro', [
|
|
1791
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer')
|
|
1808
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('objeto', 'qualquer'),
|
|
1792
1809
|
]));
|
|
1793
1810
|
this.pilhaEscopos.definirInformacoesVariavel('texto', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('texto', 'texto', [
|
|
1794
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer')
|
|
1811
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('valorParaConverter', 'qualquer'),
|
|
1795
1812
|
]));
|
|
1796
1813
|
this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('todosEmCondicao', 'lógico', [
|
|
1797
1814
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1798
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função')
|
|
1815
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoCondicional', 'função'),
|
|
1799
1816
|
]));
|
|
1800
1817
|
this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('tupla', 'tupla', [
|
|
1801
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]')
|
|
1818
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('vetor', 'qualquer[]'),
|
|
1802
1819
|
]));
|
|
1803
1820
|
// TODO: Escrever algum tipo de validação aqui.
|
|
1804
1821
|
for (const tipos of Object.values(this.tiposDeFerramentasExternas)) {
|
|
@@ -2183,7 +2200,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2183
2200
|
}
|
|
2184
2201
|
blocoEscopo() {
|
|
2185
2202
|
const declaracoes = [];
|
|
2186
|
-
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2203
|
+
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2204
|
+
!this.estaNoFinal()) {
|
|
2187
2205
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
2188
2206
|
}
|
|
2189
2207
|
this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
|
|
@@ -2288,7 +2306,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2288
2306
|
this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
|
|
2289
2307
|
const caminhos = [];
|
|
2290
2308
|
let caminhoPadrao = null;
|
|
2291
|
-
while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2309
|
+
while (!this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2310
|
+
!this.estaNoFinal()) {
|
|
2292
2311
|
if (this.verificarSeSimboloAtualEIgualA(egua_classico_1.default.CASO)) {
|
|
2293
2312
|
const caminhoCondicoes = [this.expressao()];
|
|
2294
2313
|
this.consumir(egua_classico_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
@@ -2450,7 +2469,8 @@ class AvaliadorSintaticoEguaClassico {
|
|
|
2450
2469
|
}
|
|
2451
2470
|
this.consumir(egua_classico_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
|
|
2452
2471
|
const metodos = [];
|
|
2453
|
-
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2472
|
+
while (!this.verificarTipoSimboloAtual(egua_classico_1.default.CHAVE_DIREITA) &&
|
|
2473
|
+
!this.estaNoFinal()) {
|
|
2454
2474
|
metodos.push(this.funcao('método'));
|
|
2455
2475
|
}
|
|
2456
2476
|
this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
@@ -2504,9 +2524,12 @@ const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime
|
|
|
2504
2524
|
const construtos_1 = require("../../construtos");
|
|
2505
2525
|
const declaracoes_1 = require("../../declaracoes");
|
|
2506
2526
|
const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
|
|
2507
|
-
const pitugues_1 = __importDefault(require("../../tipos-de-simbolos/pitugues"));
|
|
2508
2527
|
const lexador_1 = require("../../lexador");
|
|
2509
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");
|
|
2532
|
+
const pitugues_1 = __importDefault(require("../../tipos-de-simbolos/pitugues"));
|
|
2510
2533
|
/**
|
|
2511
2534
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
2512
2535
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
@@ -2521,6 +2544,77 @@ class AvaliadorSintaticoPitugues {
|
|
|
2521
2544
|
this.blocos = 0;
|
|
2522
2545
|
this.performance = performance;
|
|
2523
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
|
+
}
|
|
2524
2618
|
}
|
|
2525
2619
|
expressaoLeia() {
|
|
2526
2620
|
const simboloLeia = this.simbolos[this.atual];
|
|
@@ -2566,8 +2660,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
2566
2660
|
let retorno = [];
|
|
2567
2661
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2568
2662
|
// Se tipo ainda não foi definido, infere.
|
|
2569
|
-
|
|
2570
|
-
|
|
2663
|
+
tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
|
|
2664
|
+
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(identificador.lexema, tipo));
|
|
2571
2665
|
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo
|
|
2572
2666
|
// TODO: Discutir decoradores com comunidade.
|
|
2573
2667
|
// Array.from(this.pilhaDecoradores)
|
|
@@ -2582,10 +2676,12 @@ class AvaliadorSintaticoPitugues {
|
|
|
2582
2676
|
declaracaoDeVariaveis() {
|
|
2583
2677
|
const identificadores = [];
|
|
2584
2678
|
let retorno = [];
|
|
2679
|
+
let tipo = 'qualquer';
|
|
2585
2680
|
do {
|
|
2586
2681
|
identificadores.push(this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
2587
2682
|
} while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
|
|
2588
2683
|
if (!this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
|
|
2684
|
+
// Inicialização de variáveis sem valor.
|
|
2589
2685
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2590
2686
|
retorno.push(new declaracoes_1.Var(identificador, null));
|
|
2591
2687
|
}
|
|
@@ -2600,9 +2696,11 @@ class AvaliadorSintaticoPitugues {
|
|
|
2600
2696
|
throw this.erro(this.simboloAtual(), 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
2601
2697
|
}
|
|
2602
2698
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
2603
|
-
|
|
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));
|
|
2604
2703
|
}
|
|
2605
|
-
this.verificarSeSimboloAtualEIgualA(pitugues_1.default.PONTO_E_VIRGULA);
|
|
2606
2704
|
return retorno;
|
|
2607
2705
|
}
|
|
2608
2706
|
sincronizar() {
|
|
@@ -2674,9 +2772,6 @@ class AvaliadorSintaticoPitugues {
|
|
|
2674
2772
|
const simboloAtual = this.simbolos[this.atual];
|
|
2675
2773
|
let valores = [];
|
|
2676
2774
|
switch (simboloAtual.tipo) {
|
|
2677
|
-
case pitugues_1.default.SUPER:
|
|
2678
|
-
const simboloSuper = this.avancarEDevolverAnterior();
|
|
2679
|
-
return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
|
|
2680
2775
|
case pitugues_1.default.COLCHETE_ESQUERDO:
|
|
2681
2776
|
this.avancarEDevolverAnterior();
|
|
2682
2777
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.COLCHETE_DIREITO)) {
|
|
@@ -2716,14 +2811,18 @@ class AvaliadorSintaticoPitugues {
|
|
|
2716
2811
|
case pitugues_1.default.FUNÇÃO:
|
|
2717
2812
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
2718
2813
|
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
2719
|
-
|
|
2814
|
+
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(simboloFuncao.lexema, 'função'));
|
|
2720
2815
|
return corpoDaFuncao;
|
|
2816
|
+
case pitugues_1.default.IMPORTAR:
|
|
2817
|
+
return this.declaracaoImportar();
|
|
2721
2818
|
case pitugues_1.default.NULO:
|
|
2722
2819
|
this.avancarEDevolverAnterior();
|
|
2723
2820
|
return new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, null);
|
|
2724
2821
|
case pitugues_1.default.ISTO:
|
|
2725
2822
|
const simboloIsto = this.avancarEDevolverAnterior();
|
|
2726
2823
|
return new construtos_1.Isto(this.hashArquivo, simboloAtual.linha, simboloIsto);
|
|
2824
|
+
case pitugues_1.default.LEIA:
|
|
2825
|
+
return this.expressaoLeia();
|
|
2727
2826
|
case pitugues_1.default.NUMERO:
|
|
2728
2827
|
case pitugues_1.default.TEXTO:
|
|
2729
2828
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
@@ -2732,14 +2831,22 @@ class AvaliadorSintaticoPitugues {
|
|
|
2732
2831
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
|
|
2733
2832
|
case pitugues_1.default.IDENTIFICADOR:
|
|
2734
2833
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
2735
|
-
|
|
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);
|
|
2736
2842
|
case pitugues_1.default.PARENTESE_ESQUERDO:
|
|
2737
2843
|
this.avancarEDevolverAnterior();
|
|
2738
2844
|
const expressao = this.expressao();
|
|
2739
2845
|
this.consumir(pitugues_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
2740
2846
|
return new construtos_1.Agrupamento(this.hashArquivo, simboloAtual.linha, expressao);
|
|
2741
|
-
case pitugues_1.default.
|
|
2742
|
-
|
|
2847
|
+
case pitugues_1.default.SUPER:
|
|
2848
|
+
const simboloSuper = this.avancarEDevolverAnterior();
|
|
2849
|
+
return new construtos_1.Super(this.hashArquivo, simboloSuper, this.superclasseAtual);
|
|
2743
2850
|
}
|
|
2744
2851
|
throw this.erro(this.simboloAtual(), 'Esperado expressão.');
|
|
2745
2852
|
}
|
|
@@ -2903,9 +3010,8 @@ class AvaliadorSintaticoPitugues {
|
|
|
2903
3010
|
}
|
|
2904
3011
|
return expressao;
|
|
2905
3012
|
}
|
|
3013
|
+
// TODO: Depreciar.
|
|
2906
3014
|
expressao() {
|
|
2907
|
-
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.LEIA))
|
|
2908
|
-
return this.expressaoLeia();
|
|
2909
3015
|
return this.atribuir();
|
|
2910
3016
|
}
|
|
2911
3017
|
declaracaoEscreva() {
|
|
@@ -2923,6 +3029,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
2923
3029
|
return new declaracoes_1.Expressao(expressao);
|
|
2924
3030
|
}
|
|
2925
3031
|
blocoEscopo() {
|
|
3032
|
+
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
2926
3033
|
let declaracoes = [];
|
|
2927
3034
|
let simboloAtual = this.simboloAtual();
|
|
2928
3035
|
const simboloAnterior = this.simboloAnterior();
|
|
@@ -2946,28 +3053,27 @@ class AvaliadorSintaticoPitugues {
|
|
|
2946
3053
|
`Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
|
|
2947
3054
|
`Atual: ${espacosIndentacaoLinhaAtual}`);
|
|
2948
3055
|
}
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
2960
|
-
}
|
|
2961
|
-
else {
|
|
2962
|
-
declaracoes.push(retornoDeclaracao);
|
|
2963
|
-
}
|
|
2964
|
-
simboloAtual = this.simboloAtual();
|
|
2965
|
-
if (!simboloAtual)
|
|
2966
|
-
break;
|
|
2967
|
-
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);
|
|
2968
3066
|
}
|
|
3067
|
+
else {
|
|
3068
|
+
declaracoes.push(retornoDeclaracao);
|
|
3069
|
+
}
|
|
3070
|
+
simboloAtual = this.simboloAtual();
|
|
3071
|
+
if (!simboloAtual)
|
|
3072
|
+
break;
|
|
3073
|
+
espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
2969
3074
|
}
|
|
2970
3075
|
}
|
|
3076
|
+
this.pilhaEscopos.removerUltimo();
|
|
2971
3077
|
return declaracoes;
|
|
2972
3078
|
}
|
|
2973
3079
|
declaracaoEnquanto() {
|
|
@@ -3033,30 +3139,54 @@ class AvaliadorSintaticoPitugues {
|
|
|
3033
3139
|
this.blocos -= 1;
|
|
3034
3140
|
}
|
|
3035
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
|
+
}
|
|
3036
3182
|
declaracaoPara() {
|
|
3037
3183
|
try {
|
|
3038
3184
|
const simboloPara = this.simboloAnterior();
|
|
3039
3185
|
this.blocos += 1;
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
inicializador = null;
|
|
3043
|
-
}
|
|
3044
|
-
else if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VARIAVEL)) {
|
|
3045
|
-
inicializador = this.declaracaoDeVariaveis();
|
|
3046
|
-
}
|
|
3047
|
-
else {
|
|
3048
|
-
inicializador = this.declaracaoExpressao();
|
|
3049
|
-
}
|
|
3050
|
-
let condicao = null;
|
|
3051
|
-
if (!this.verificarTipoSimboloAtual(pitugues_1.default.PONTO_E_VIRGULA)) {
|
|
3052
|
-
condicao = this.expressao();
|
|
3053
|
-
}
|
|
3054
|
-
let incrementar = null;
|
|
3055
|
-
if (this.simbolos[this.atual].tipo !== pitugues_1.default.DOIS_PONTOS) {
|
|
3056
|
-
incrementar = this.expressao();
|
|
3186
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.CADA)) {
|
|
3187
|
+
return this.declaracaoParaCada(simboloPara);
|
|
3057
3188
|
}
|
|
3058
|
-
|
|
3059
|
-
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
3189
|
+
return this.declaracaoParaTradicional(simboloPara);
|
|
3060
3190
|
}
|
|
3061
3191
|
catch (erro) {
|
|
3062
3192
|
throw erro;
|
|
@@ -3166,7 +3296,6 @@ class AvaliadorSintaticoPitugues {
|
|
|
3166
3296
|
case pitugues_1.default.PARA:
|
|
3167
3297
|
this.avancarEDevolverAnterior();
|
|
3168
3298
|
return this.declaracaoPara();
|
|
3169
|
-
case pitugues_1.default.PAUSA:
|
|
3170
3299
|
case pitugues_1.default.SUSTAR:
|
|
3171
3300
|
this.avancarEDevolverAnterior();
|
|
3172
3301
|
return this.declaracaoSustar();
|
|
@@ -3200,17 +3329,18 @@ class AvaliadorSintaticoPitugues {
|
|
|
3200
3329
|
const parametro = {};
|
|
3201
3330
|
if (this.simboloAtual().tipo === pitugues_1.default.MULTIPLICACAO) {
|
|
3202
3331
|
this.consumir(pitugues_1.default.MULTIPLICACAO, null);
|
|
3203
|
-
parametro
|
|
3332
|
+
parametro.abrangencia = 'multiplo';
|
|
3204
3333
|
}
|
|
3205
3334
|
else {
|
|
3206
|
-
parametro
|
|
3335
|
+
parametro.abrangencia = 'padrao';
|
|
3207
3336
|
}
|
|
3208
|
-
parametro
|
|
3337
|
+
parametro.nome = this.consumir(pitugues_1.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
|
|
3209
3338
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.IGUAL)) {
|
|
3210
|
-
parametro
|
|
3339
|
+
parametro.valorPadrao = this.primario();
|
|
3211
3340
|
}
|
|
3341
|
+
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
3212
3342
|
parametros.push(parametro);
|
|
3213
|
-
if (parametro
|
|
3343
|
+
if (parametro.abrangencia === 'multiplo')
|
|
3214
3344
|
break;
|
|
3215
3345
|
} while (this.verificarSeSimboloAtualEIgualA(pitugues_1.default.VIRGULA));
|
|
3216
3346
|
return parametros;
|
|
@@ -3270,12 +3400,100 @@ class AvaliadorSintaticoPitugues {
|
|
|
3270
3400
|
return null;
|
|
3271
3401
|
}
|
|
3272
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
|
+
}
|
|
3273
3489
|
analisar(retornoLexador, hashArquivo) {
|
|
3274
3490
|
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
3275
3491
|
this.erros = [];
|
|
3276
3492
|
this.atual = 0;
|
|
3277
3493
|
this.blocos = 0;
|
|
3278
3494
|
this.escopos = [];
|
|
3495
|
+
this.registrarTiposBibliotecasEPrimitivas();
|
|
3496
|
+
this.tiposDefinidosEmCodigo = {};
|
|
3279
3497
|
this.hashArquivo = hashArquivo || 0;
|
|
3280
3498
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
3281
3499
|
this.pragmas = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.pragmas) || {};
|
|
@@ -3291,6 +3509,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
3291
3509
|
}
|
|
3292
3510
|
if (this.performance) {
|
|
3293
3511
|
const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
|
|
3512
|
+
// eslint-disable-next-line no-undef
|
|
3294
3513
|
console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
|
|
3295
3514
|
}
|
|
3296
3515
|
return {
|
|
@@ -3301,7 +3520,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
3301
3520
|
}
|
|
3302
3521
|
exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
|
|
3303
3522
|
|
|
3304
|
-
},{"../../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){
|
|
3305
3524
|
"use strict";
|
|
3306
3525
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3307
3526
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -3993,7 +4212,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
3993
4212
|
if (arguments.length <= 0) {
|
|
3994
4213
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A função recebe ao menos um parâmetro.'));
|
|
3995
4214
|
}
|
|
3996
|
-
const valorMinimo = minimo.hasOwnProperty('valor')
|
|
4215
|
+
const valorMinimo = minimo.hasOwnProperty('valor')
|
|
4216
|
+
? minimo.valor
|
|
4217
|
+
: minimo;
|
|
3997
4218
|
if (arguments.length === 2) {
|
|
3998
4219
|
if (typeof valorMinimo !== 'number') {
|
|
3999
4220
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'O parâmetro deve ser um número.'));
|
|
@@ -4003,7 +4224,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
4003
4224
|
if (arguments.length > 3) {
|
|
4004
4225
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'A quantidade de parâmetros máxima para esta função é 2.'));
|
|
4005
4226
|
}
|
|
4006
|
-
const valorMaximo = maximo.hasOwnProperty('valor')
|
|
4227
|
+
const valorMaximo = maximo.hasOwnProperty('valor')
|
|
4228
|
+
? maximo.valor
|
|
4229
|
+
: maximo;
|
|
4007
4230
|
if (typeof valorMinimo !== 'number' || typeof valorMaximo !== 'number') {
|
|
4008
4231
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Os dois parâmetros devem ser do tipo número.'));
|
|
4009
4232
|
}
|
|
@@ -4018,7 +4241,9 @@ async function aleatorioEntre(interpretador, minimo, maximo) {
|
|
|
4018
4241
|
*/
|
|
4019
4242
|
async function algum(interpretador, vetor, funcaoPesquisa) {
|
|
4020
4243
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4021
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4244
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4245
|
+
? funcaoPesquisa.valor
|
|
4246
|
+
: funcaoPesquisa;
|
|
4022
4247
|
if (!Array.isArray(valorVetor)) {
|
|
4023
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.'));
|
|
4024
4249
|
}
|
|
@@ -4042,7 +4267,9 @@ async function algum(interpretador, vetor, funcaoPesquisa) {
|
|
|
4042
4267
|
*/
|
|
4043
4268
|
async function encontrar(interpretador, vetor, funcaoPesquisa) {
|
|
4044
4269
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4045
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4270
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4271
|
+
? funcaoPesquisa.valor
|
|
4272
|
+
: funcaoPesquisa;
|
|
4046
4273
|
if (!Array.isArray(valorVetor)) {
|
|
4047
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.'));
|
|
4048
4275
|
}
|
|
@@ -4066,7 +4293,9 @@ async function encontrar(interpretador, vetor, funcaoPesquisa) {
|
|
|
4066
4293
|
*/
|
|
4067
4294
|
async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
|
|
4068
4295
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4069
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4296
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4297
|
+
? funcaoPesquisa.valor
|
|
4298
|
+
: funcaoPesquisa;
|
|
4070
4299
|
if (!Array.isArray(valorVetor)) {
|
|
4071
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.'));
|
|
4072
4301
|
}
|
|
@@ -4090,7 +4319,9 @@ async function encontrarIndice(interpretador, vetor, funcaoPesquisa) {
|
|
|
4090
4319
|
*/
|
|
4091
4320
|
async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
|
|
4092
4321
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4093
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4322
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4323
|
+
? funcaoPesquisa.valor
|
|
4324
|
+
: funcaoPesquisa;
|
|
4094
4325
|
if (!Array.isArray(valorVetor)) {
|
|
4095
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.'));
|
|
4096
4327
|
}
|
|
@@ -4113,7 +4344,9 @@ async function encontrarUltimo(interpretador, vetor, funcaoPesquisa) {
|
|
|
4113
4344
|
*/
|
|
4114
4345
|
async function encontrarUltimoIndice(interpretador, vetor, funcaoPesquisa) {
|
|
4115
4346
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4116
|
-
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4347
|
+
const valorFuncaoPesquisa = funcaoPesquisa.hasOwnProperty('valor')
|
|
4348
|
+
? funcaoPesquisa.valor
|
|
4349
|
+
: funcaoPesquisa;
|
|
4117
4350
|
if (!Array.isArray(valorVetor)) {
|
|
4118
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.'));
|
|
4119
4352
|
}
|
|
@@ -4138,7 +4371,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
4138
4371
|
if (vetor === null || vetor === undefined)
|
|
4139
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.'));
|
|
4140
4373
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4141
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4374
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4375
|
+
? funcaoFiltragem.valor
|
|
4376
|
+
: funcaoFiltragem;
|
|
4142
4377
|
if (!Array.isArray(valorVetor)) {
|
|
4143
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.'));
|
|
4144
4379
|
}
|
|
@@ -4147,7 +4382,9 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
4147
4382
|
}
|
|
4148
4383
|
const resultados = [];
|
|
4149
4384
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
4150
|
-
const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4385
|
+
const deveRetornarValor = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4386
|
+
valorVetor[indice],
|
|
4387
|
+
]);
|
|
4151
4388
|
if (deveRetornarValor === false)
|
|
4152
4389
|
continue;
|
|
4153
4390
|
resultados.push(valorVetor[indice]);
|
|
@@ -4192,28 +4429,34 @@ function validacaoComumNumeros(valorParaConverter) {
|
|
|
4192
4429
|
async function inteiro(interpretador, valorParaConverter) {
|
|
4193
4430
|
if (valorParaConverter === null || valorParaConverter === undefined)
|
|
4194
4431
|
return Promise.resolve(0);
|
|
4195
|
-
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4432
|
+
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4433
|
+
? valorParaConverter.valor
|
|
4434
|
+
: valorParaConverter;
|
|
4196
4435
|
const resultadoValidacao = validacaoComumNumeros(valor);
|
|
4197
4436
|
return resultadoValidacao || Promise.resolve(parseInt(valor));
|
|
4198
4437
|
}
|
|
4199
4438
|
/**
|
|
4200
|
-
*
|
|
4201
|
-
*
|
|
4202
|
-
* @param
|
|
4203
|
-
* @param
|
|
4204
|
-
* @
|
|
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.
|
|
4205
4445
|
*/
|
|
4206
4446
|
async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
4207
4447
|
if (vetor === null || vetor === undefined)
|
|
4208
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.'));
|
|
4209
4449
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4210
|
-
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
4450
|
+
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
4451
|
+
? funcaoMapeamento.valor
|
|
4452
|
+
: funcaoMapeamento;
|
|
4211
4453
|
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
4212
4454
|
// na avaliação sintática. Estudar remoção.
|
|
4213
4455
|
if (!Array.isArray(valorVetor)) {
|
|
4214
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.'));
|
|
4215
4457
|
}
|
|
4216
|
-
|
|
4458
|
+
const nomeConstrutorFuncaoMapeamento = valorFuncaoMapeamento.constructor.name.replaceAll('_', '');
|
|
4459
|
+
if (nomeConstrutorFuncaoMapeamento !== 'DeleguaFuncao') {
|
|
4217
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.'));
|
|
4218
4461
|
}
|
|
4219
4462
|
const resultados = [];
|
|
@@ -4231,7 +4474,9 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
4231
4474
|
async function numero(interpretador, valorParaConverter) {
|
|
4232
4475
|
if (valorParaConverter === null || valorParaConverter === undefined)
|
|
4233
4476
|
return Promise.resolve(0);
|
|
4234
|
-
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4477
|
+
const valor = valorParaConverter.hasOwnProperty('valor')
|
|
4478
|
+
? valorParaConverter.valor
|
|
4479
|
+
: valorParaConverter;
|
|
4235
4480
|
const resultadoValidacao = validacaoComumNumeros(valor);
|
|
4236
4481
|
return resultadoValidacao || Promise.resolve(Number(valor));
|
|
4237
4482
|
}
|
|
@@ -4271,7 +4516,9 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
4271
4516
|
if (vetor === null || vetor === undefined)
|
|
4272
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.'));
|
|
4273
4518
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4274
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4519
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4520
|
+
? funcaoFiltragem.valor
|
|
4521
|
+
: funcaoFiltragem;
|
|
4275
4522
|
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
4276
4523
|
// na avaliação sintática. Estudar remoção.
|
|
4277
4524
|
if (!Array.isArray(valorVetor)) {
|
|
@@ -4295,7 +4542,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
4295
4542
|
if (vetor === null || vetor === undefined)
|
|
4296
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.'));
|
|
4297
4544
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4298
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4545
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
4546
|
+
? funcaoFiltragem.valor
|
|
4547
|
+
: funcaoFiltragem;
|
|
4299
4548
|
if (!Array.isArray(valorVetor)) {
|
|
4300
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.'));
|
|
4301
4550
|
}
|
|
@@ -4303,7 +4552,9 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
4303
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.'));
|
|
4304
4553
|
}
|
|
4305
4554
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
4306
|
-
const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4555
|
+
const valorResolvido = await valorFuncaoFiltragem.chamar(interpretador, [
|
|
4556
|
+
valorVetor[indice],
|
|
4557
|
+
]);
|
|
4307
4558
|
if (valorResolvido !== null) {
|
|
4308
4559
|
return valorResolvido;
|
|
4309
4560
|
}
|
|
@@ -4335,7 +4586,9 @@ async function real(interpretador, numero) {
|
|
|
4335
4586
|
*/
|
|
4336
4587
|
async function reduzir(interpretador, vetor, funcaoReducao, valorInicial = null) {
|
|
4337
4588
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
4338
|
-
const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor')
|
|
4589
|
+
const valorFuncaoReducao = funcaoReducao.hasOwnProperty('valor')
|
|
4590
|
+
? funcaoReducao.valor
|
|
4591
|
+
: funcaoReducao;
|
|
4339
4592
|
const valorPadrao = valorInicial.hasOwnProperty('valor') ? valorInicial.valor : valorInicial;
|
|
4340
4593
|
if (!Array.isArray(valorVetor)) {
|
|
4341
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.'));
|
|
@@ -4536,7 +4789,7 @@ exports.default = {
|
|
|
4536
4789
|
tipoRetorno: 'texto[]',
|
|
4537
4790
|
argumentos: [
|
|
4538
4791
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('divisor', 'texto'),
|
|
4539
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número')
|
|
4792
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('limite', 'número'),
|
|
4540
4793
|
],
|
|
4541
4794
|
implementacao: (interpretador, texto, divisor, limite) => {
|
|
4542
4795
|
if (limite) {
|
|
@@ -4549,15 +4802,13 @@ exports.default = {
|
|
|
4549
4802
|
tipoRetorno: 'texto',
|
|
4550
4803
|
argumentos: [
|
|
4551
4804
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4552
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4805
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4553
4806
|
],
|
|
4554
4807
|
implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
|
|
4555
4808
|
},
|
|
4556
4809
|
inclui: {
|
|
4557
4810
|
tipoRetorno: 'texto',
|
|
4558
|
-
argumentos: [
|
|
4559
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')
|
|
4560
|
-
],
|
|
4811
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto')],
|
|
4561
4812
|
implementacao: (interpretador, texto, elemento) => Promise.resolve(texto.includes(elemento)),
|
|
4562
4813
|
},
|
|
4563
4814
|
inverter: {
|
|
@@ -4579,7 +4830,7 @@ exports.default = {
|
|
|
4579
4830
|
tipoRetorno: 'texto',
|
|
4580
4831
|
argumentos: [
|
|
4581
4832
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'texto'),
|
|
4582
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto')
|
|
4833
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('substituto', 'texto'),
|
|
4583
4834
|
],
|
|
4584
4835
|
implementacao: (interpretador, texto, elemento, substituto) => Promise.resolve(texto.replace(elemento, substituto)),
|
|
4585
4836
|
},
|
|
@@ -4587,7 +4838,7 @@ exports.default = {
|
|
|
4587
4838
|
tipoRetorno: 'texto',
|
|
4588
4839
|
argumentos: [
|
|
4589
4840
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4590
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4841
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4591
4842
|
],
|
|
4592
4843
|
implementacao: (interpretador, texto, inicio, fim) => Promise.resolve(texto.slice(inicio, fim)),
|
|
4593
4844
|
},
|
|
@@ -4605,9 +4856,7 @@ const informacao_variavel_ou_constante_1 = require("../informacao-variavel-ou-co
|
|
|
4605
4856
|
exports.default = {
|
|
4606
4857
|
adicionar: {
|
|
4607
4858
|
tipoRetorno: 'qualquer[]',
|
|
4608
|
-
argumentos: [
|
|
4609
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4610
|
-
],
|
|
4859
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4611
4860
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4612
4861
|
vetor.push(elemento);
|
|
4613
4862
|
return Promise.resolve(vetor);
|
|
@@ -4615,18 +4864,14 @@ exports.default = {
|
|
|
4615
4864
|
},
|
|
4616
4865
|
concatenar: {
|
|
4617
4866
|
tipoRetorno: 'qualquer[]',
|
|
4618
|
-
argumentos: [
|
|
4619
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')
|
|
4620
|
-
],
|
|
4867
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('outroVetor', 'qualquer[]')],
|
|
4621
4868
|
implementacao: (interpretador, vetor, outroVetor) => {
|
|
4622
4869
|
return Promise.resolve(vetor.concat(outroVetor));
|
|
4623
4870
|
},
|
|
4624
4871
|
},
|
|
4625
4872
|
empilhar: {
|
|
4626
4873
|
tipoRetorno: 'qualquer[]',
|
|
4627
|
-
argumentos: [
|
|
4628
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4629
|
-
],
|
|
4874
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4630
4875
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4631
4876
|
vetor.push(elemento);
|
|
4632
4877
|
return Promise.resolve(vetor);
|
|
@@ -4637,7 +4882,7 @@ exports.default = {
|
|
|
4637
4882
|
argumentos: [
|
|
4638
4883
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'qualquer'),
|
|
4639
4884
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('excluirQuantidade', 'número'),
|
|
4640
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]')
|
|
4885
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('itens', 'qualquer[]'),
|
|
4641
4886
|
],
|
|
4642
4887
|
implementacao: (interpretador, vetor, inicio, excluirQuantidade, ...itens) => {
|
|
4643
4888
|
let elementos = [];
|
|
@@ -4656,15 +4901,13 @@ exports.default = {
|
|
|
4656
4901
|
tipoRetorno: 'qualquer[]',
|
|
4657
4902
|
argumentos: [
|
|
4658
4903
|
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('inicio', 'número'),
|
|
4659
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número')
|
|
4904
|
+
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('fim', 'número'),
|
|
4660
4905
|
],
|
|
4661
4906
|
implementacao: (interpretador, vetor, inicio, fim) => Promise.resolve(vetor.slice(inicio, fim)),
|
|
4662
4907
|
},
|
|
4663
4908
|
filtrarPor: {
|
|
4664
4909
|
tipoRetorno: 'qualquer[]',
|
|
4665
|
-
argumentos: [
|
|
4666
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
|
|
4667
|
-
],
|
|
4910
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
|
|
4668
4911
|
implementacao: async (interpretador, vetor, funcao) => {
|
|
4669
4912
|
if (funcao === undefined || funcao === null) {
|
|
4670
4913
|
return Promise.reject("É necessário passar uma função para o método 'filtrarPor'");
|
|
@@ -4680,9 +4923,7 @@ exports.default = {
|
|
|
4680
4923
|
},
|
|
4681
4924
|
inclui: {
|
|
4682
4925
|
tipoRetorno: 'lógico',
|
|
4683
|
-
argumentos: [
|
|
4684
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4685
|
-
],
|
|
4926
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4686
4927
|
implementacao: (interpretador, vetor, elemento) => Promise.resolve(vetor.includes(elemento)),
|
|
4687
4928
|
},
|
|
4688
4929
|
inverter: {
|
|
@@ -4692,16 +4933,12 @@ exports.default = {
|
|
|
4692
4933
|
},
|
|
4693
4934
|
juntar: {
|
|
4694
4935
|
tipoRetorno: 'texto',
|
|
4695
|
-
argumentos: [
|
|
4696
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')
|
|
4697
|
-
],
|
|
4936
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('separador', 'texto')],
|
|
4698
4937
|
implementacao: (interpretador, vetor, separador) => Promise.resolve(vetor.join(separador)),
|
|
4699
4938
|
},
|
|
4700
4939
|
mapear: {
|
|
4701
4940
|
tipoRetorno: 'qualquer[]',
|
|
4702
|
-
argumentos: [
|
|
4703
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')
|
|
4704
|
-
],
|
|
4941
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcao', 'função')],
|
|
4705
4942
|
implementacao: async (interpretador, vetor, funcao) => {
|
|
4706
4943
|
if (funcao === undefined || funcao === null) {
|
|
4707
4944
|
return Promise.reject("É necessário passar uma função para o método 'mapear'");
|
|
@@ -4716,14 +4953,15 @@ exports.default = {
|
|
|
4716
4953
|
},
|
|
4717
4954
|
ordenar: {
|
|
4718
4955
|
tipoRetorno: 'qualquer[]',
|
|
4719
|
-
argumentos: [
|
|
4720
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')
|
|
4721
|
-
],
|
|
4956
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('funcaoOrdenacao', 'função')],
|
|
4722
4957
|
implementacao: async (interpretador, vetor, funcaoOrdenacao) => {
|
|
4723
4958
|
if (funcaoOrdenacao !== undefined && funcaoOrdenacao !== null) {
|
|
4724
4959
|
for (let i = 0; i < vetor.length - 1; i++) {
|
|
4725
4960
|
for (let j = 1; j < vetor.length; j++) {
|
|
4726
|
-
if ((await funcaoOrdenacao.chamar(interpretador, [
|
|
4961
|
+
if ((await funcaoOrdenacao.chamar(interpretador, [
|
|
4962
|
+
vetor[j - 1],
|
|
4963
|
+
vetor[j],
|
|
4964
|
+
])) > 0) {
|
|
4727
4965
|
const aux = vetor[j];
|
|
4728
4966
|
vetor[j] = vetor[j - 1];
|
|
4729
4967
|
vetor[j - 1] = aux;
|
|
@@ -4740,9 +4978,7 @@ exports.default = {
|
|
|
4740
4978
|
},
|
|
4741
4979
|
remover: {
|
|
4742
4980
|
tipoRetorno: 'qualquer[]',
|
|
4743
|
-
argumentos: [
|
|
4744
|
-
new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')
|
|
4745
|
-
],
|
|
4981
|
+
argumentos: [new informacao_variavel_ou_constante_1.InformacaoVariavelOuConstante('elemento', 'qualquer')],
|
|
4746
4982
|
implementacao: (interpretador, vetor, elemento) => {
|
|
4747
4983
|
const index = vetor.indexOf(elemento);
|
|
4748
4984
|
if (index !== -1)
|
|
@@ -5028,7 +5264,8 @@ class Binario {
|
|
|
5028
5264
|
this.tipo = this.deduzirTipo();
|
|
5029
5265
|
}
|
|
5030
5266
|
deduzirTipo() {
|
|
5031
|
-
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)) {
|
|
5032
5269
|
return 'lógico';
|
|
5033
5270
|
}
|
|
5034
5271
|
if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
|
|
@@ -5037,7 +5274,8 @@ class Binario {
|
|
|
5037
5274
|
if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
|
|
5038
5275
|
return 'inteiro';
|
|
5039
5276
|
}
|
|
5040
|
-
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)) {
|
|
5041
5279
|
return 'número';
|
|
5042
5280
|
}
|
|
5043
5281
|
return 'qualquer';
|
|
@@ -7586,7 +7824,7 @@ class InformacaoVariavelOuConstante {
|
|
|
7586
7824
|
this.argumentos = argumentos;
|
|
7587
7825
|
}
|
|
7588
7826
|
toString() {
|
|
7589
|
-
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(', ')})`;
|
|
7590
7828
|
}
|
|
7591
7829
|
}
|
|
7592
7830
|
exports.InformacaoVariavelOuConstante = InformacaoVariavelOuConstante;
|
|
@@ -7937,7 +8175,9 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7937
8175
|
const argumentosResolvidos = [];
|
|
7938
8176
|
for (let i = indiceArgumentoAtual; i < argumentos.length; i++) {
|
|
7939
8177
|
const argumentoAtual = argumentos[i];
|
|
7940
|
-
argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor')
|
|
8178
|
+
argumentosResolvidos.push(argumentoAtual && argumentoAtual.hasOwnProperty('valor')
|
|
8179
|
+
? argumentoAtual.valor
|
|
8180
|
+
: argumentoAtual);
|
|
7941
8181
|
}
|
|
7942
8182
|
return argumentosResolvidos;
|
|
7943
8183
|
}
|
|
@@ -7950,14 +8190,19 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7950
8190
|
if (parametro.abrangencia === 'multiplo') {
|
|
7951
8191
|
const argumentosResolvidos = this.resolverParametrosEspalhados(argumentos, i);
|
|
7952
8192
|
// TODO: Verificar se `imutavel` é `true` aqui mesmo.
|
|
7953
|
-
ambiente.valores[nome] = {
|
|
8193
|
+
ambiente.valores[nome] = {
|
|
8194
|
+
tipo: 'vetor',
|
|
8195
|
+
valor: argumentosResolvidos,
|
|
8196
|
+
imutavel: true,
|
|
8197
|
+
};
|
|
7954
8198
|
}
|
|
7955
8199
|
else {
|
|
7956
8200
|
let argumento = argumentos[i];
|
|
7957
8201
|
if (argumento.valor === null) {
|
|
7958
8202
|
argumentos[i].valor = parametro['padrao'] ? parametro['padrao'].valor : null;
|
|
7959
8203
|
}
|
|
7960
|
-
ambiente.valores[nome] =
|
|
8204
|
+
ambiente.valores[nome] =
|
|
8205
|
+
argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
|
|
7961
8206
|
// Se o argumento é `DeleguaFuncao`, para habilitar o recurso de _currying_,
|
|
7962
8207
|
// copiamos seu valor para o escopo atual. Nem sempre podemos contar com a tipagem explícita aqui.
|
|
7963
8208
|
if (argumento.valor && ['funcao', 'função'].includes(argumento.valor.tipo)) {
|
|
@@ -7977,7 +8222,8 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
7977
8222
|
};
|
|
7978
8223
|
// TODO: Apenass Potigol usa isso até então.
|
|
7979
8224
|
// Estudar mover isso para o dialeto.
|
|
7980
|
-
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
8225
|
+
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
8226
|
+
this.nome !== 'construtor') {
|
|
7981
8227
|
for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
|
|
7982
8228
|
ambiente.valores[nomeCampo] = {
|
|
7983
8229
|
valor: valorCampo,
|
|
@@ -8278,7 +8524,8 @@ class ObjetoDeleguaClasse {
|
|
|
8278
8524
|
throw new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade "${nomePropriedade}" não existe neste objeto.`);
|
|
8279
8525
|
}
|
|
8280
8526
|
definir(simbolo, valor) {
|
|
8281
|
-
if (this.classe.dialetoRequerDeclaracaoPropriedades &&
|
|
8527
|
+
if (this.classe.dialetoRequerDeclaracaoPropriedades &&
|
|
8528
|
+
!this.propriedades.hasOwnProperty(simbolo.lexema)) {
|
|
8282
8529
|
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Propriedade "${simbolo.lexema}" não foi definida na declaração da classe ${this.classe.simboloOriginal.lexema}.`);
|
|
8283
8530
|
}
|
|
8284
8531
|
this.propriedades[simbolo.lexema] = valor;
|
|
@@ -8408,7 +8655,8 @@ class InterpretadorBase {
|
|
|
8408
8655
|
this.diretorioBase = diretorioBase;
|
|
8409
8656
|
this.performance = performance;
|
|
8410
8657
|
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
8411
|
-
this.funcaoDeRetornoMesmaLinha =
|
|
8658
|
+
this.funcaoDeRetornoMesmaLinha =
|
|
8659
|
+
funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
|
|
8412
8660
|
this.erros = [];
|
|
8413
8661
|
this.declaracoes = [];
|
|
8414
8662
|
this.resultadoInterpretador = [];
|
|
@@ -8542,7 +8790,9 @@ class InterpretadorBase {
|
|
|
8542
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));
|
|
8543
8791
|
}
|
|
8544
8792
|
else {
|
|
8545
|
-
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;
|
|
8546
8796
|
textoFinal = textoFinal.replace('${' + elemento.variavel + '}', `${this.paraTexto(valor)}`);
|
|
8547
8797
|
}
|
|
8548
8798
|
});
|
|
@@ -8594,7 +8844,8 @@ class InterpretadorBase {
|
|
|
8594
8844
|
return true;
|
|
8595
8845
|
}
|
|
8596
8846
|
verificarOperandoNumero(operador, operando) {
|
|
8597
|
-
if (typeof operando === primitivos_1.default.NUMERO ||
|
|
8847
|
+
if (typeof operando === primitivos_1.default.NUMERO ||
|
|
8848
|
+
operando.tipo === delegua_2.default.NUMERO)
|
|
8598
8849
|
return;
|
|
8599
8850
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operando precisa ser um número.', Number(operador.linha));
|
|
8600
8851
|
}
|
|
@@ -8647,11 +8898,15 @@ class InterpretadorBase {
|
|
|
8647
8898
|
let resultado = '';
|
|
8648
8899
|
const conteudo = await this.avaliar(declaracao.expressao);
|
|
8649
8900
|
const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
|
|
8650
|
-
const tipoConteudo = conteudo.hasOwnProperty('tipo')
|
|
8901
|
+
const tipoConteudo = conteudo.hasOwnProperty('tipo')
|
|
8902
|
+
? conteudo.tipo
|
|
8903
|
+
: typeof conteudo;
|
|
8651
8904
|
resultado = valorConteudo;
|
|
8652
8905
|
if ([delegua_2.default.NUMERO, primitivos_1.default.NUMERO].includes(tipoConteudo) &&
|
|
8653
8906
|
declaracao.casasDecimais > 0) {
|
|
8654
|
-
resultado = valorConteudo.toLocaleString('pt', {
|
|
8907
|
+
resultado = valorConteudo.toLocaleString('pt', {
|
|
8908
|
+
maximumFractionDigits: declaracao.casasDecimais,
|
|
8909
|
+
});
|
|
8655
8910
|
}
|
|
8656
8911
|
if (declaracao.espacos > 0) {
|
|
8657
8912
|
resultado += ' '.repeat(declaracao.espacos);
|
|
@@ -8710,14 +8965,19 @@ class InterpretadorBase {
|
|
|
8710
8965
|
const direita = await this.avaliar(expressao.direita);
|
|
8711
8966
|
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
|
|
8712
8967
|
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
|
|
8713
|
-
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
8714
|
-
|
|
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);
|
|
8715
8974
|
switch (expressao.operador.tipo) {
|
|
8716
8975
|
case delegua_1.default.EXPONENCIACAO:
|
|
8717
8976
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
8718
8977
|
return Math.pow(valorEsquerdo, valorDireito);
|
|
8719
8978
|
case delegua_1.default.MAIOR:
|
|
8720
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8979
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8980
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8721
8981
|
return Number(valorEsquerdo) > Number(valorDireito);
|
|
8722
8982
|
}
|
|
8723
8983
|
return String(valorEsquerdo) > String(valorDireito);
|
|
@@ -8725,7 +8985,8 @@ class InterpretadorBase {
|
|
|
8725
8985
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
8726
8986
|
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
8727
8987
|
case delegua_1.default.MENOR:
|
|
8728
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8988
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
8989
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8729
8990
|
return Number(valorEsquerdo) < Number(valorDireito);
|
|
8730
8991
|
}
|
|
8731
8992
|
return String(valorEsquerdo) < String(valorDireito);
|
|
@@ -8738,7 +8999,8 @@ class InterpretadorBase {
|
|
|
8738
8999
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
8739
9000
|
case delegua_1.default.ADICAO:
|
|
8740
9001
|
case delegua_1.default.MAIS_IGUAL:
|
|
8741
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
9002
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
9003
|
+
this.tiposNumericos.includes(tipoDireito)) {
|
|
8742
9004
|
return Number(valorEsquerdo) + Number(valorDireito);
|
|
8743
9005
|
}
|
|
8744
9006
|
// TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
|
|
@@ -8757,11 +9019,13 @@ class InterpretadorBase {
|
|
|
8757
9019
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
8758
9020
|
case delegua_1.default.MULTIPLICACAO:
|
|
8759
9021
|
case delegua_1.default.MULTIPLICACAO_IGUAL:
|
|
8760
|
-
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
9022
|
+
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
9023
|
+
tipoDireito === delegua_2.default.TEXTO) {
|
|
8761
9024
|
// Sem ambos os valores resolvem como texto, multiplica normal.
|
|
8762
9025
|
// Se apenas um resolve como texto, o outro repete o
|
|
8763
9026
|
// texto n vezes, sendo n o valor do outro.
|
|
8764
|
-
if (tipoEsquerdo === delegua_2.default.TEXTO &&
|
|
9027
|
+
if (tipoEsquerdo === delegua_2.default.TEXTO &&
|
|
9028
|
+
tipoDireito === delegua_2.default.TEXTO) {
|
|
8765
9029
|
return Number(valorEsquerdo) * Number(valorDireito);
|
|
8766
9030
|
}
|
|
8767
9031
|
if (tipoEsquerdo === delegua_2.default.TEXTO) {
|
|
@@ -8833,7 +9097,8 @@ class InterpretadorBase {
|
|
|
8833
9097
|
try {
|
|
8834
9098
|
const variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
|
|
8835
9099
|
if (variavelEntidadeChamada === null) {
|
|
8836
|
-
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));
|
|
8837
9102
|
}
|
|
8838
9103
|
const entidadeChamada = variavelEntidadeChamada.hasOwnProperty('valor')
|
|
8839
9104
|
? variavelEntidadeChamada.valor
|
|
@@ -8845,7 +9110,9 @@ class InterpretadorBase {
|
|
|
8845
9110
|
return await this.chamarMetodoPrimitiva(expressao, entidadeChamada);
|
|
8846
9111
|
}
|
|
8847
9112
|
const argumentos = await this.resolverArgumentosChamada(expressao);
|
|
8848
|
-
const aridade = entidadeChamada.aridade
|
|
9113
|
+
const aridade = entidadeChamada.aridade
|
|
9114
|
+
? entidadeChamada.aridade()
|
|
9115
|
+
: entidadeChamada.length;
|
|
8849
9116
|
// Completar os argumentos não preenchidos com valores indefinidos.
|
|
8850
9117
|
if (argumentos.length < aridade) {
|
|
8851
9118
|
const diferenca = aridade - argumentos.length;
|
|
@@ -8858,7 +9125,9 @@ class InterpretadorBase {
|
|
|
8858
9125
|
}
|
|
8859
9126
|
if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
|
|
8860
9127
|
try {
|
|
8861
|
-
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);
|
|
8862
9131
|
}
|
|
8863
9132
|
catch (erro) {
|
|
8864
9133
|
this.erros.push({
|
|
@@ -8871,7 +9140,8 @@ class InterpretadorBase {
|
|
|
8871
9140
|
// Por algum motivo misterioso, `entidadeChamada instanceof Chamavel` dá `false` em Liquido,
|
|
8872
9141
|
// mesmo que esteja tudo certo com `DeleguaFuncao`,
|
|
8873
9142
|
// então precisamos testar o nome do construtor também.
|
|
8874
|
-
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
9143
|
+
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
9144
|
+
entidadeChamada.constructor.name === 'DeleguaFuncao') {
|
|
8875
9145
|
const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
|
|
8876
9146
|
return retornoEntidadeChamada;
|
|
8877
9147
|
}
|
|
@@ -8924,7 +9194,9 @@ class InterpretadorBase {
|
|
|
8924
9194
|
// Nunca será método aqui: apenas propriedade.
|
|
8925
9195
|
const alvoPropriedade = expressao.alvo;
|
|
8926
9196
|
const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
|
|
8927
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9197
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9198
|
+
? variavelObjeto.valor
|
|
9199
|
+
: variavelObjeto;
|
|
8928
9200
|
const valor = await this.avaliar(expressao.valor);
|
|
8929
9201
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
8930
9202
|
const objetoDeleguaClasse = objeto;
|
|
@@ -8953,7 +9225,8 @@ class InterpretadorBase {
|
|
|
8953
9225
|
return direita.includes(esquerda);
|
|
8954
9226
|
}
|
|
8955
9227
|
else if (direita !== null && typeof direita === 'object') {
|
|
8956
|
-
return esquerda in direita ||
|
|
9228
|
+
return (esquerda in direita ||
|
|
9229
|
+
(direita.valor !== undefined && esquerda in direita.valor));
|
|
8957
9230
|
}
|
|
8958
9231
|
throw new excecoes_1.ErroEmTempoDeExecucao(esquerda, "Tipo de chamada inválida com 'em'.", expressao.linha);
|
|
8959
9232
|
}
|
|
@@ -8978,7 +9251,8 @@ class InterpretadorBase {
|
|
|
8978
9251
|
}
|
|
8979
9252
|
let retornoExecucao;
|
|
8980
9253
|
while (!(retornoExecucao instanceof quebras_1.Quebra)) {
|
|
8981
|
-
if (declaracao.condicao !== null &&
|
|
9254
|
+
if (declaracao.condicao !== null &&
|
|
9255
|
+
!this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
8982
9256
|
break;
|
|
8983
9257
|
}
|
|
8984
9258
|
try {
|
|
@@ -9010,11 +9284,14 @@ class InterpretadorBase {
|
|
|
9010
9284
|
// laço de repetição.
|
|
9011
9285
|
declaracao.posicaoAtual = 0;
|
|
9012
9286
|
const vetorResolvido = await this.avaliar(declaracao.vetor);
|
|
9013
|
-
const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
|
|
9287
|
+
const valorVetorResolvido = vetorResolvido.hasOwnProperty('valor')
|
|
9288
|
+
? vetorResolvido.valor
|
|
9289
|
+
: vetorResolvido;
|
|
9014
9290
|
if (!Array.isArray(valorVetorResolvido)) {
|
|
9015
9291
|
return Promise.reject("Variável ou literal provida em instrução 'para cada' não é um vetor.");
|
|
9016
9292
|
}
|
|
9017
|
-
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9293
|
+
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9294
|
+
declaracao.posicaoAtual < valorVetorResolvido.length) {
|
|
9018
9295
|
try {
|
|
9019
9296
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.nomeVariavelIteracao, valorVetorResolvido[declaracao.posicaoAtual]);
|
|
9020
9297
|
retornoExecucao = await this.executar(declaracao.corpo);
|
|
@@ -9060,7 +9337,8 @@ class InterpretadorBase {
|
|
|
9060
9337
|
}
|
|
9061
9338
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
9062
9339
|
let retornoExecucao;
|
|
9063
|
-
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9340
|
+
while (!(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9341
|
+
this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
9064
9342
|
try {
|
|
9065
9343
|
retornoExecucao = await this.executar(declaracao.corpo);
|
|
9066
9344
|
if (retornoExecucao instanceof quebras_1.SustarQuebra) {
|
|
@@ -9083,7 +9361,9 @@ class InterpretadorBase {
|
|
|
9083
9361
|
}
|
|
9084
9362
|
async visitarDeclaracaoEscolha(declaracao) {
|
|
9085
9363
|
const condicaoEscolha = await this.avaliar(declaracao.identificadorOuLiteral);
|
|
9086
|
-
const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
|
|
9364
|
+
const valorCondicaoEscolha = condicaoEscolha.hasOwnProperty('valor')
|
|
9365
|
+
? condicaoEscolha.valor
|
|
9366
|
+
: condicaoEscolha;
|
|
9087
9367
|
const caminhos = declaracao.caminhos;
|
|
9088
9368
|
const caminhoPadrao = declaracao.caminhoPadrao;
|
|
9089
9369
|
let encontrado = false;
|
|
@@ -9165,9 +9445,7 @@ class InterpretadorBase {
|
|
|
9165
9445
|
}
|
|
9166
9446
|
else {
|
|
9167
9447
|
const literalErro = new construtos_1.Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
|
|
9168
|
-
const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [
|
|
9169
|
-
literalErro,
|
|
9170
|
-
]);
|
|
9448
|
+
const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [literalErro]);
|
|
9171
9449
|
valorRetorno = await chamadaPegue.aceitar(this);
|
|
9172
9450
|
}
|
|
9173
9451
|
}
|
|
@@ -9187,7 +9465,9 @@ class InterpretadorBase {
|
|
|
9187
9465
|
let formatoTexto = '';
|
|
9188
9466
|
for (const argumento of argumentos) {
|
|
9189
9467
|
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
9190
|
-
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;
|
|
9191
9471
|
formatoTexto += `${this.paraTexto(valor)} `;
|
|
9192
9472
|
}
|
|
9193
9473
|
return formatoTexto.trimEnd();
|
|
@@ -9348,10 +9628,15 @@ class InterpretadorBase {
|
|
|
9348
9628
|
}
|
|
9349
9629
|
}
|
|
9350
9630
|
async visitarExpressaoAcessoIndiceVariavel(expressao) {
|
|
9351
|
-
const promises = await Promise.all([
|
|
9631
|
+
const promises = await Promise.all([
|
|
9632
|
+
this.avaliar(expressao.entidadeChamada),
|
|
9633
|
+
this.avaliar(expressao.indice),
|
|
9634
|
+
]);
|
|
9352
9635
|
const variavelObjeto = promises[0];
|
|
9353
9636
|
const indice = promises[1];
|
|
9354
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9637
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9638
|
+
? variavelObjeto.valor
|
|
9639
|
+
: variavelObjeto;
|
|
9355
9640
|
let valorIndice = indice.hasOwnProperty('valor') ? indice.valor : indice;
|
|
9356
9641
|
if (Array.isArray(objeto)) {
|
|
9357
9642
|
if (!Number.isInteger(valorIndice)) {
|
|
@@ -9397,7 +9682,9 @@ class InterpretadorBase {
|
|
|
9397
9682
|
}
|
|
9398
9683
|
async visitarExpressaoDefinirValor(expressao) {
|
|
9399
9684
|
const variavelObjeto = await this.avaliar(expressao.objeto);
|
|
9400
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9685
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9686
|
+
? variavelObjeto.valor
|
|
9687
|
+
: variavelObjeto;
|
|
9401
9688
|
if (objeto.constructor.name !== 'ObjetoDeleguaClasse' && objeto.constructor !== Object) {
|
|
9402
9689
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.nome, 'Somente instâncias e dicionários podem possuir campos.', expressao.linha));
|
|
9403
9690
|
}
|
|
@@ -9464,10 +9751,13 @@ class InterpretadorBase {
|
|
|
9464
9751
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
9465
9752
|
variavelObjeto = variavelObjeto.valor;
|
|
9466
9753
|
}
|
|
9467
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9754
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
9755
|
+
? variavelObjeto.valor
|
|
9756
|
+
: variavelObjeto;
|
|
9468
9757
|
// Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
|
|
9469
9758
|
// então testamos também o nome do construtor.
|
|
9470
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
9759
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
9760
|
+
objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
9471
9761
|
const valor = objeto.obter(expressao.simbolo);
|
|
9472
9762
|
if (valor === 0)
|
|
9473
9763
|
return 0;
|
|
@@ -9512,13 +9802,18 @@ class InterpretadorBase {
|
|
|
9512
9802
|
async visitarExpressaoDicionario(expressao) {
|
|
9513
9803
|
const dicionario = {};
|
|
9514
9804
|
for (let i = 0; i < expressao.chaves.length; i++) {
|
|
9515
|
-
const promises = await Promise.all([
|
|
9805
|
+
const promises = await Promise.all([
|
|
9806
|
+
this.avaliar(expressao.chaves[i]),
|
|
9807
|
+
this.avaliar(expressao.valores[i]),
|
|
9808
|
+
]);
|
|
9516
9809
|
if (typeof promises[0] === 'boolean') {
|
|
9517
9810
|
const chaveLogico = promises[0] === true ? 'verdadeiro' : 'falso';
|
|
9518
9811
|
dicionario[chaveLogico] = promises[1];
|
|
9519
9812
|
continue;
|
|
9520
9813
|
}
|
|
9521
|
-
dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
|
|
9814
|
+
dicionario[promises[0]] = promises[1].hasOwnProperty('valor')
|
|
9815
|
+
? promises[1].valor
|
|
9816
|
+
: promises[1];
|
|
9522
9817
|
}
|
|
9523
9818
|
return dicionario;
|
|
9524
9819
|
}
|
|
@@ -9580,7 +9875,10 @@ class InterpretadorBase {
|
|
|
9580
9875
|
retornoVetor += `${JSON.stringify(elemento)}, `;
|
|
9581
9876
|
continue;
|
|
9582
9877
|
}
|
|
9583
|
-
retornoVetor +=
|
|
9878
|
+
retornoVetor +=
|
|
9879
|
+
typeof elemento === 'string'
|
|
9880
|
+
? `'${elemento}', `
|
|
9881
|
+
: `${this.paraTexto(elemento)}, `;
|
|
9584
9882
|
}
|
|
9585
9883
|
if (retornoVetor.length > 1) {
|
|
9586
9884
|
retornoVetor = retornoVetor.slice(0, -2);
|
|
@@ -9641,7 +9939,8 @@ class InterpretadorBase {
|
|
|
9641
9939
|
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
9642
9940
|
let retornoExecucao;
|
|
9643
9941
|
try {
|
|
9644
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9942
|
+
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
9943
|
+
ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
9645
9944
|
retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
|
|
9646
9945
|
}
|
|
9647
9946
|
return retornoExecucao;
|
|
@@ -9854,7 +10153,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
9854
10153
|
let formatoTexto = '';
|
|
9855
10154
|
for (const argumento of argumentos) {
|
|
9856
10155
|
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
9857
|
-
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;
|
|
9858
10159
|
formatoTexto += `${this.paraTexto(valor)} `;
|
|
9859
10160
|
}
|
|
9860
10161
|
return formatoTexto.trimEnd();
|
|
@@ -10054,7 +10355,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10054
10355
|
let i = this.pilhaEscoposExecucao.pilha.length - 1;
|
|
10055
10356
|
while (i > 0) {
|
|
10056
10357
|
let ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10057
|
-
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10358
|
+
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10359
|
+
ultimoEscopo.finalizado) {
|
|
10058
10360
|
this.pilhaEscoposExecucao.removerUltimo();
|
|
10059
10361
|
const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10060
10362
|
escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
|
|
@@ -10089,7 +10391,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10089
10391
|
if (!this.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
|
|
10090
10392
|
ultimoEscopo.declaracaoAtual++;
|
|
10091
10393
|
}
|
|
10092
|
-
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10394
|
+
if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
|
|
10395
|
+
ultimoEscopo.finalizado) {
|
|
10093
10396
|
if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
|
|
10094
10397
|
this.descartarEscopoPorRetornoFuncao();
|
|
10095
10398
|
}
|
|
@@ -10118,7 +10421,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10118
10421
|
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
10119
10422
|
let retornoExecucao;
|
|
10120
10423
|
try {
|
|
10121
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
10424
|
+
for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
|
|
10425
|
+
ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
10122
10426
|
if (naoVerificarPrimeiraExecucao) {
|
|
10123
10427
|
naoVerificarPrimeiraExecucao = false;
|
|
10124
10428
|
}
|
|
@@ -10197,7 +10501,8 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10197
10501
|
await this.instrucaoPasso(escopo + 1);
|
|
10198
10502
|
}
|
|
10199
10503
|
else {
|
|
10200
|
-
if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
|
|
10504
|
+
if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
|
|
10505
|
+
escopoVisitado.finalizado) {
|
|
10201
10506
|
this.pilhaEscoposExecucao.removerUltimo();
|
|
10202
10507
|
}
|
|
10203
10508
|
if (this.pilhaEscoposExecucao.elementos() === 1) {
|
|
@@ -10276,7 +10581,9 @@ class InterpretadorComDepuracao extends interpretador_1.Interpretador {
|
|
|
10276
10581
|
* @param nome O nome da variável.
|
|
10277
10582
|
*/
|
|
10278
10583
|
obterVariavel(nome) {
|
|
10279
|
-
const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({
|
|
10584
|
+
const valorOuVariavel = this.pilhaEscoposExecucao.obterValorVariavel({
|
|
10585
|
+
lexema: nome,
|
|
10586
|
+
});
|
|
10280
10587
|
return valorOuVariavel.hasOwnProperty('valor')
|
|
10281
10588
|
? valorOuVariavel
|
|
10282
10589
|
: {
|
|
@@ -10324,7 +10631,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10324
10631
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10325
10632
|
variavelObjeto = variavelObjeto.valor;
|
|
10326
10633
|
}
|
|
10327
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10634
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10635
|
+
? variavelObjeto.valor
|
|
10636
|
+
: variavelObjeto;
|
|
10328
10637
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10329
10638
|
return objeto.obterMetodo(expressao.nomeMetodo) || null;
|
|
10330
10639
|
}
|
|
@@ -10404,7 +10713,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10404
10713
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10405
10714
|
variavelObjeto = variavelObjeto.valor;
|
|
10406
10715
|
}
|
|
10407
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10716
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10717
|
+
? variavelObjeto.valor
|
|
10718
|
+
: variavelObjeto;
|
|
10408
10719
|
if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10409
10720
|
return objeto.obter(expressao.simbolo);
|
|
10410
10721
|
}
|
|
@@ -10468,10 +10779,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10468
10779
|
if (variavelObjeto.constructor.name === 'RetornoQuebra') {
|
|
10469
10780
|
variavelObjeto = variavelObjeto.valor;
|
|
10470
10781
|
}
|
|
10471
|
-
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10782
|
+
const objeto = variavelObjeto.hasOwnProperty('valor')
|
|
10783
|
+
? variavelObjeto.valor
|
|
10784
|
+
: variavelObjeto;
|
|
10472
10785
|
// Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
|
|
10473
10786
|
// então testamos também o nome do construtor.
|
|
10474
|
-
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
10787
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
10788
|
+
objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
10475
10789
|
return objeto.obterMetodo(expressao.nomePropriedade) || null;
|
|
10476
10790
|
}
|
|
10477
10791
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
@@ -10521,7 +10835,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
10521
10835
|
// Se o retorno for uma função anônima, o escopo precisa ser preservado.
|
|
10522
10836
|
// Como quebras matam o topo da pilha de escopos, precisamos dizer
|
|
10523
10837
|
// para a finalização para copiar as variáveis para o escopo de baixo.
|
|
10524
|
-
|
|
10838
|
+
const construtorRetorno = retornoQuebra.valor.constructor.name.replaceAll('_', '');
|
|
10839
|
+
if (construtorRetorno === 'DeleguaFuncao') {
|
|
10525
10840
|
retornoQuebra.preservarEscopo = true;
|
|
10526
10841
|
}
|
|
10527
10842
|
return retornoQuebra;
|
|
@@ -10990,7 +11305,9 @@ class LexadorEguaClassico {
|
|
|
10990
11305
|
this.avancar();
|
|
10991
11306
|
}
|
|
10992
11307
|
const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
|
|
10993
|
-
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;
|
|
10994
11311
|
this.adicionarSimbolo(tipo);
|
|
10995
11312
|
}
|
|
10996
11313
|
analisarToken() {
|
|
@@ -11185,8 +11502,12 @@ class LexadorGuarani extends lexador_base_1.LexadorBase {
|
|
|
11185
11502
|
while (this.eAlfabetoOuDigito(this.simboloAtual())) {
|
|
11186
11503
|
this.avancar();
|
|
11187
11504
|
}
|
|
11188
|
-
const codigo = this.codigo[this.linha]
|
|
11189
|
-
|
|
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;
|
|
11190
11511
|
this.adicionarSimbolo(tipo);
|
|
11191
11512
|
}
|
|
11192
11513
|
analisarToken() {
|
|
@@ -11340,7 +11661,8 @@ class LexadorPitugues {
|
|
|
11340
11661
|
eFinalDoCodigo() {
|
|
11341
11662
|
if (this.linha > this.codigo.length - 1)
|
|
11342
11663
|
return true;
|
|
11343
|
-
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);
|
|
11344
11666
|
}
|
|
11345
11667
|
avancar() {
|
|
11346
11668
|
this.atual += 1;
|
|
@@ -11409,7 +11731,8 @@ class LexadorPitugues {
|
|
|
11409
11731
|
}
|
|
11410
11732
|
identificarPalavraChave() {
|
|
11411
11733
|
const linhaPrimeiroCaracter = this.linha;
|
|
11412
|
-
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
11734
|
+
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
11735
|
+
this.linha === linhaPrimeiroCaracter) {
|
|
11413
11736
|
this.avancar();
|
|
11414
11737
|
}
|
|
11415
11738
|
let textoPalavraChave;
|
|
@@ -11709,7 +12032,8 @@ class LexadorPortugolIpt {
|
|
|
11709
12032
|
eFinalDoCodigo() {
|
|
11710
12033
|
if (this.linha > this.codigo.length - 1)
|
|
11711
12034
|
return true;
|
|
11712
|
-
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);
|
|
11713
12037
|
}
|
|
11714
12038
|
/**
|
|
11715
12039
|
* Indica se o código está na última linha.
|
|
@@ -11787,7 +12111,8 @@ class LexadorPortugolIpt {
|
|
|
11787
12111
|
}
|
|
11788
12112
|
identificarPalavraChave() {
|
|
11789
12113
|
const linhaPrimeiroCaracter = this.linha;
|
|
11790
|
-
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
12114
|
+
while (this.eAlfabetoOuDigito(this.simboloAtual()) &&
|
|
12115
|
+
this.linha === linhaPrimeiroCaracter) {
|
|
11791
12116
|
this.avancar();
|
|
11792
12117
|
}
|
|
11793
12118
|
let textoPalavraChave;
|
|
@@ -11988,7 +12313,6 @@ exports.palavrasReservadas = {
|
|
|
11988
12313
|
ou: pitugues_1.default.OU,
|
|
11989
12314
|
padrao: pitugues_1.default.PADRAO,
|
|
11990
12315
|
para: pitugues_1.default.PARA,
|
|
11991
|
-
pausa: pitugues_1.default.PAUSA,
|
|
11992
12316
|
pegue: pitugues_1.default.PEGUE,
|
|
11993
12317
|
retorna: pitugues_1.default.RETORNA,
|
|
11994
12318
|
se: pitugues_1.default.SE,
|
|
@@ -12442,7 +12766,9 @@ class Lexador {
|
|
|
12442
12766
|
this.avancar();
|
|
12443
12767
|
}
|
|
12444
12768
|
const codigo = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual);
|
|
12445
|
-
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;
|
|
12446
12772
|
this.adicionarSimbolo(tipo);
|
|
12447
12773
|
}
|
|
12448
12774
|
analisarToken() {
|
|
@@ -12808,7 +13134,9 @@ class MicroLexador {
|
|
|
12808
13134
|
this.atual++;
|
|
12809
13135
|
}
|
|
12810
13136
|
const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
|
|
12811
|
-
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;
|
|
12812
13140
|
this.adicionarSimbolo(tipo);
|
|
12813
13141
|
}
|
|
12814
13142
|
analisarToken() {
|
|
@@ -13410,7 +13738,6 @@ exports.default = {
|
|
|
13410
13738
|
PARA: 'PARA',
|
|
13411
13739
|
PARENTESE_DIREITO: 'PARENTESE_DIREITO',
|
|
13412
13740
|
PARENTESE_ESQUERDO: 'PARENTESE_ESQUERDO',
|
|
13413
|
-
PAUSA: 'PAUSA',
|
|
13414
13741
|
PEGUE: 'PEGUE',
|
|
13415
13742
|
PONTO: 'PONTO',
|
|
13416
13743
|
PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
|
|
@@ -13723,7 +14050,8 @@ class Python3Lexer extends Lexer_1.Lexer {
|
|
|
13723
14050
|
}
|
|
13724
14051
|
else {
|
|
13725
14052
|
// Possibly emit more than 1 DEDENT token.
|
|
13726
|
-
while (this.indents.length &&
|
|
14053
|
+
while (this.indents.length &&
|
|
14054
|
+
this.indents[this.indents.length - 1] > indent) {
|
|
13727
14055
|
this.emit(this.createDedent());
|
|
13728
14056
|
this.indents.pop();
|
|
13729
14057
|
}
|
|
@@ -15439,7 +15767,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
15439
15767
|
this.state = 269;
|
|
15440
15768
|
this._errHandler.sync(this);
|
|
15441
15769
|
_alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx);
|
|
15442
|
-
while (_alt !== 2 &&
|
|
15770
|
+
while (_alt !== 2 &&
|
|
15771
|
+
_alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
|
|
15443
15772
|
if (_alt === 1) {
|
|
15444
15773
|
{
|
|
15445
15774
|
{
|
|
@@ -15752,7 +16081,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
15752
16081
|
this.state = 357;
|
|
15753
16082
|
this._errHandler.sync(this);
|
|
15754
16083
|
_alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx);
|
|
15755
|
-
while (_alt !== 2 &&
|
|
16084
|
+
while (_alt !== 2 &&
|
|
16085
|
+
_alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
|
|
15756
16086
|
if (_alt === 1) {
|
|
15757
16087
|
{
|
|
15758
16088
|
{
|
|
@@ -16990,12 +17320,14 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
16990
17320
|
this.state = 526;
|
|
16991
17321
|
this._errHandler.sync(this);
|
|
16992
17322
|
_la = this._input.LA(1);
|
|
16993
|
-
while (_la === Python3Parser.DOT ||
|
|
17323
|
+
while (_la === Python3Parser.DOT ||
|
|
17324
|
+
_la === Python3Parser.ELLIPSIS) {
|
|
16994
17325
|
{
|
|
16995
17326
|
{
|
|
16996
17327
|
this.state = 523;
|
|
16997
17328
|
_la = this._input.LA(1);
|
|
16998
|
-
if (!(_la === Python3Parser.DOT ||
|
|
17329
|
+
if (!(_la === Python3Parser.DOT ||
|
|
17330
|
+
_la === Python3Parser.ELLIPSIS)) {
|
|
16999
17331
|
this._errHandler.recoverInline(this);
|
|
17000
17332
|
}
|
|
17001
17333
|
else {
|
|
@@ -17025,7 +17357,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
17025
17357
|
{
|
|
17026
17358
|
this.state = 530;
|
|
17027
17359
|
_la = this._input.LA(1);
|
|
17028
|
-
if (!(_la === Python3Parser.DOT ||
|
|
17360
|
+
if (!(_la === Python3Parser.DOT ||
|
|
17361
|
+
_la === Python3Parser.ELLIPSIS)) {
|
|
17029
17362
|
this._errHandler.recoverInline(this);
|
|
17030
17363
|
}
|
|
17031
17364
|
else {
|
|
@@ -17040,7 +17373,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
17040
17373
|
this.state = 533;
|
|
17041
17374
|
this._errHandler.sync(this);
|
|
17042
17375
|
_la = this._input.LA(1);
|
|
17043
|
-
} while (_la === Python3Parser.DOT ||
|
|
17376
|
+
} while (_la === Python3Parser.DOT ||
|
|
17377
|
+
_la === Python3Parser.ELLIPSIS);
|
|
17044
17378
|
}
|
|
17045
17379
|
break;
|
|
17046
17380
|
}
|
|
@@ -18500,7 +18834,9 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
18500
18834
|
_la = this._input.LA(1);
|
|
18501
18835
|
while (((_la & ~0x1f) === 0 &&
|
|
18502
18836
|
((1 << _la) &
|
|
18503
|
-
((1 << Python3Parser.IN) |
|
|
18837
|
+
((1 << Python3Parser.IN) |
|
|
18838
|
+
(1 << Python3Parser.NOT) |
|
|
18839
|
+
(1 << Python3Parser.IS))) !==
|
|
18504
18840
|
0) ||
|
|
18505
18841
|
(((_la - 74) & ~0x1f) === 0 &&
|
|
18506
18842
|
((1 << (_la - 74)) &
|
|
@@ -18822,7 +19158,8 @@ class Python3Parser extends Parser_1.Parser {
|
|
|
18822
19158
|
{
|
|
18823
19159
|
this.state = 828;
|
|
18824
19160
|
_la = this._input.LA(1);
|
|
18825
|
-
if (!(_la === Python3Parser.LEFT_SHIFT ||
|
|
19161
|
+
if (!(_la === Python3Parser.LEFT_SHIFT ||
|
|
19162
|
+
_la === Python3Parser.RIGHT_SHIFT)) {
|
|
18826
19163
|
this._errHandler.recoverInline(this);
|
|
18827
19164
|
}
|
|
18828
19165
|
else {
|
|
@@ -26215,7 +26552,8 @@ class TradutorAssemblyScript {
|
|
|
26215
26552
|
resultado += ' '.repeat(this.indentacao);
|
|
26216
26553
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
26217
26554
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
26218
|
-
resultado +=
|
|
26555
|
+
resultado +=
|
|
26556
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26219
26557
|
}
|
|
26220
26558
|
}
|
|
26221
26559
|
else {
|
|
@@ -26229,7 +26567,8 @@ class TradutorAssemblyScript {
|
|
|
26229
26567
|
if (declaracaoTente.caminhoFinalmente !== null) {
|
|
26230
26568
|
resultado += '\nfinally {\n';
|
|
26231
26569
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
26232
|
-
resultado +=
|
|
26570
|
+
resultado +=
|
|
26571
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
26233
26572
|
}
|
|
26234
26573
|
resultado += ' '.repeat(this.indentacao);
|
|
26235
26574
|
resultado += '}';
|
|
@@ -26259,7 +26598,10 @@ class TradutorAssemblyScript {
|
|
|
26259
26598
|
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
26260
26599
|
this.indentacao += 4;
|
|
26261
26600
|
let resultado = ' '.repeat(this.indentacao);
|
|
26262
|
-
resultado +=
|
|
26601
|
+
resultado +=
|
|
26602
|
+
metodoClasse.simbolo.lexema === 'construtor'
|
|
26603
|
+
? 'constructor('
|
|
26604
|
+
: metodoClasse.simbolo.lexema + '(';
|
|
26263
26605
|
for (let parametro of metodoClasse.funcao.parametros) {
|
|
26264
26606
|
resultado += parametro.nome.lexema + ', ';
|
|
26265
26607
|
}
|
|
@@ -26379,7 +26721,8 @@ class TradutorAssemblyScript {
|
|
|
26379
26721
|
this.indentacao += 4;
|
|
26380
26722
|
resultado += ' '.repeat(this.indentacao);
|
|
26381
26723
|
for (let condicao of caminho.condicoes) {
|
|
26382
|
-
resultado +=
|
|
26724
|
+
resultado +=
|
|
26725
|
+
'case ' + this.dicionarioConstrutos[condicao.constructor.name](condicao) + ':\n';
|
|
26383
26726
|
resultado += ' '.repeat(this.indentacao);
|
|
26384
26727
|
}
|
|
26385
26728
|
for (let declaracao of caminho.declaracoes) {
|
|
@@ -26392,7 +26735,8 @@ class TradutorAssemblyScript {
|
|
|
26392
26735
|
this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
|
|
26393
26736
|
break;
|
|
26394
26737
|
default:
|
|
26395
|
-
resultado +=
|
|
26738
|
+
resultado +=
|
|
26739
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26396
26740
|
break;
|
|
26397
26741
|
}
|
|
26398
26742
|
resultado += ' '.repeat(this.indentacao + 4);
|
|
@@ -26532,20 +26876,27 @@ class TradutorAssemblyScript {
|
|
|
26532
26876
|
traduzirConstrutoBinario(binario) {
|
|
26533
26877
|
let resultado = '';
|
|
26534
26878
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
26535
|
-
resultado +=
|
|
26879
|
+
resultado +=
|
|
26880
|
+
'(' +
|
|
26881
|
+
this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
|
|
26882
|
+
')';
|
|
26536
26883
|
else
|
|
26537
26884
|
resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
26538
26885
|
let operador = this.traduzirSimboloOperador(binario.operador);
|
|
26539
26886
|
resultado += ` ${operador} `;
|
|
26540
26887
|
if (binario.direita.constructor.name === 'Agrupamento')
|
|
26541
|
-
resultado +=
|
|
26888
|
+
resultado +=
|
|
26889
|
+
'(' +
|
|
26890
|
+
this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
|
|
26891
|
+
')';
|
|
26542
26892
|
else
|
|
26543
26893
|
resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
26544
26894
|
return resultado;
|
|
26545
26895
|
}
|
|
26546
26896
|
traduzirConstrutoAtribuir(atribuir) {
|
|
26547
26897
|
let resultado = this.dicionarioConstrutos[atribuir.alvo.constructor.name](atribuir.alvo);
|
|
26548
|
-
resultado +=
|
|
26898
|
+
resultado +=
|
|
26899
|
+
' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
26549
26900
|
return resultado;
|
|
26550
26901
|
}
|
|
26551
26902
|
// TODO: Eliminar o soft cast para `any`.
|
|
@@ -26761,13 +27112,19 @@ class TradutorJavaScript {
|
|
|
26761
27112
|
traduzirConstrutoBinario(binario) {
|
|
26762
27113
|
let resultado = '';
|
|
26763
27114
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
26764
|
-
resultado +=
|
|
27115
|
+
resultado +=
|
|
27116
|
+
'(' +
|
|
27117
|
+
this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
|
|
27118
|
+
')';
|
|
26765
27119
|
else
|
|
26766
27120
|
resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
26767
27121
|
let operador = this.traduzirSimboloOperador(binario.operador);
|
|
26768
27122
|
resultado += ` ${operador} `;
|
|
26769
27123
|
if (binario.direita.constructor.name === 'Agrupamento')
|
|
26770
|
-
resultado +=
|
|
27124
|
+
resultado +=
|
|
27125
|
+
'(' +
|
|
27126
|
+
this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
|
|
27127
|
+
')';
|
|
26771
27128
|
else
|
|
26772
27129
|
resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
26773
27130
|
return resultado;
|
|
@@ -26805,7 +27162,8 @@ class TradutorJavaScript {
|
|
|
26805
27162
|
for (let i = 0; i < dicionario.chaves.length; i++) {
|
|
26806
27163
|
resultado += this.dicionarioConstrutos[dicionario.chaves[i].constructor.name](dicionario.chaves[i]);
|
|
26807
27164
|
resultado += ':';
|
|
26808
|
-
resultado +=
|
|
27165
|
+
resultado +=
|
|
27166
|
+
this.dicionarioConstrutos[dicionario.valores[i].constructor.name](dicionario.valores[i]) + ',';
|
|
26809
27167
|
}
|
|
26810
27168
|
resultado += '}';
|
|
26811
27169
|
return resultado;
|
|
@@ -26878,7 +27236,10 @@ class TradutorJavaScript {
|
|
|
26878
27236
|
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
26879
27237
|
this.indentacao += 4;
|
|
26880
27238
|
let resultado = ' '.repeat(this.indentacao);
|
|
26881
|
-
resultado +=
|
|
27239
|
+
resultado +=
|
|
27240
|
+
metodoClasse.simbolo.lexema === 'construtor'
|
|
27241
|
+
? 'constructor('
|
|
27242
|
+
: metodoClasse.simbolo.lexema + '(';
|
|
26882
27243
|
for (let parametro of metodoClasse.funcao.parametros) {
|
|
26883
27244
|
resultado += parametro.nome.lexema + ', ';
|
|
26884
27245
|
}
|
|
@@ -26916,7 +27277,10 @@ class TradutorJavaScript {
|
|
|
26916
27277
|
resultado += ' '.repeat(this.indentacao);
|
|
26917
27278
|
if (caminho.condicoes && caminho.condicoes.length > 0) {
|
|
26918
27279
|
for (let condicao of caminho.condicoes) {
|
|
26919
|
-
resultado +=
|
|
27280
|
+
resultado +=
|
|
27281
|
+
'case ' +
|
|
27282
|
+
this.dicionarioConstrutos[condicao.constructor.name](condicao) +
|
|
27283
|
+
':\n';
|
|
26920
27284
|
resultado += ' '.repeat(this.indentacao);
|
|
26921
27285
|
}
|
|
26922
27286
|
}
|
|
@@ -26934,7 +27298,8 @@ class TradutorJavaScript {
|
|
|
26934
27298
|
this.dicionarioConstrutos[declaracaoRetorna.valor.constructor.name](declaracaoRetorna.valor);
|
|
26935
27299
|
break;
|
|
26936
27300
|
default:
|
|
26937
|
-
resultado +=
|
|
27301
|
+
resultado +=
|
|
27302
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
26938
27303
|
break;
|
|
26939
27304
|
}
|
|
26940
27305
|
}
|
|
@@ -27068,7 +27433,8 @@ class TradutorJavaScript {
|
|
|
27068
27433
|
resultado += ' '.repeat(this.indentacao);
|
|
27069
27434
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
27070
27435
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
27071
|
-
resultado +=
|
|
27436
|
+
resultado +=
|
|
27437
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
27072
27438
|
}
|
|
27073
27439
|
}
|
|
27074
27440
|
else {
|
|
@@ -27082,7 +27448,8 @@ class TradutorJavaScript {
|
|
|
27082
27448
|
if (declaracaoTente.caminhoFinalmente !== null) {
|
|
27083
27449
|
resultado += '\nfinally {\n';
|
|
27084
27450
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
27085
|
-
resultado +=
|
|
27451
|
+
resultado +=
|
|
27452
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
27086
27453
|
}
|
|
27087
27454
|
resultado += ' '.repeat(this.indentacao);
|
|
27088
27455
|
resultado += '}';
|
|
@@ -28201,7 +28568,8 @@ class TradutorPython {
|
|
|
28201
28568
|
case 'texto':
|
|
28202
28569
|
return `str(${textoArgumentos})`;
|
|
28203
28570
|
default:
|
|
28204
|
-
if (argumentosValidados.length === 0 &&
|
|
28571
|
+
if (argumentosValidados.length === 0 &&
|
|
28572
|
+
!this.classesConhecidas.includes(variavel.simbolo.lexema)) {
|
|
28205
28573
|
return `${variavel.simbolo.lexema}`;
|
|
28206
28574
|
}
|
|
28207
28575
|
return `${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
@@ -28337,8 +28705,7 @@ class TradutorPython {
|
|
|
28337
28705
|
if (Array.isArray(declaracaoPara.inicializador)) {
|
|
28338
28706
|
for (const declaracaoInicializador of declaracaoPara.inicializador) {
|
|
28339
28707
|
resultado +=
|
|
28340
|
-
this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) +
|
|
28341
|
-
`\n`;
|
|
28708
|
+
this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
|
|
28342
28709
|
}
|
|
28343
28710
|
}
|
|
28344
28711
|
else {
|
|
@@ -28414,7 +28781,8 @@ class TradutorPython {
|
|
|
28414
28781
|
resultado += ' '.repeat(this.indentacao);
|
|
28415
28782
|
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
28416
28783
|
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
28417
|
-
resultado +=
|
|
28784
|
+
resultado +=
|
|
28785
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
28418
28786
|
}
|
|
28419
28787
|
}
|
|
28420
28788
|
else {
|
|
@@ -28428,7 +28796,8 @@ class TradutorPython {
|
|
|
28428
28796
|
resultado += '\nfinally:\n';
|
|
28429
28797
|
resultado += ' '.repeat(this.indentacao);
|
|
28430
28798
|
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
28431
|
-
resultado +=
|
|
28799
|
+
resultado +=
|
|
28800
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
28432
28801
|
}
|
|
28433
28802
|
}
|
|
28434
28803
|
return resultado;
|
|
@@ -28674,7 +29043,8 @@ class TradutorReversoJavaScript {
|
|
|
28674
29043
|
let resultado = '';
|
|
28675
29044
|
let emOuDe = declaracao.type === 'ForInStatement' ? 'em' : 'de';
|
|
28676
29045
|
resultado += `para (${this.traduzirDeclaracao(declaracao.left)} ${emOuDe} `;
|
|
28677
|
-
resultado +=
|
|
29046
|
+
resultado +=
|
|
29047
|
+
this.dicionarioConstrutos[declaracao.right.constructor.name](declaracao.right) + ') ';
|
|
28678
29048
|
resultado += this.logicaComumBlocoEscopo(declaracao.body);
|
|
28679
29049
|
return resultado;
|
|
28680
29050
|
}
|