@designliquido/delegua 1.18.3 → 1.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +152 -16
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +4 -5
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.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.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +21 -15
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +17 -9
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.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.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +3 -6
- 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 +4 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +3 -6
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +1 -4
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js +15 -16
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
- package/bibliotecas/dialetos/prisma/biblioteca-global.js +4 -12
- package/bibliotecas/dialetos/prisma/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/tenda/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/tenda/biblioteca-global.js +141 -47
- package/bibliotecas/dialetos/tenda/biblioteca-global.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/ajuda-como-construto.d.ts.map +1 -1
- package/construtos/ajuda-como-construto.js.map +1 -1
- package/estilizador/quebrador-linha.d.ts.map +1 -1
- package/estilizador/quebrador-linha.js.map +1 -1
- package/estilizador/regras/regra-convencao-nomenclatura.d.ts.map +1 -1
- package/estilizador/regras/regra-convencao-nomenclatura.js.map +1 -1
- package/estilizador/regras/regra-explicitar-tipos-parametros.d.ts.map +1 -1
- package/estilizador/regras/regra-explicitar-tipos-parametros.js.map +1 -1
- package/estilizador/regras/regra-paradigma-consistente.d.ts.map +1 -1
- package/estilizador/regras/regra-paradigma-consistente.js.map +1 -1
- package/interfaces/declaracoes/caminho-se-senao-interface.d.ts +2 -2
- package/interfaces/estilizador/opcoes-paradigma-consistente-interface.d.ts +1 -1
- package/interfaces/estilizador/regra-estilizacao-interface.d.ts +2 -2
- package/interfaces/formatador/index.d.ts +1 -1
- package/interfaces/formatador/opcoes-formatador-delegua-interface.d.ts +1 -1
- package/interpretador/dialetos/calango/interpretador-calango.d.ts.map +1 -1
- package/interpretador/dialetos/calango/interpretador-calango.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +10 -14
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +1 -0
- package/interpretador/dialetos/pitugues/interpretador-pitugues.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 +91 -39
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/dialetos/tenda/interpretador-tenda.d.ts.map +1 -1
- package/interpretador/dialetos/tenda/interpretador-tenda.js.map +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +1 -1
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +29 -13
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +20 -10
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +3 -5
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/dialetos/lexador-calango.d.ts.map +1 -1
- package/lexador/dialetos/lexador-calango.js +3 -1
- package/lexador/dialetos/lexador-calango.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +4 -2
- package/lexador/lexador.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-elixir.d.ts.map +1 -1
- package/tradutores/tradutor-elixir.js +18 -8
- package/tradutores/tradutor-elixir.js.map +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
- package/tradutores/tradutor-portugol-ipt.js +65 -35
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/tradutores/tradutor-reverso-calango.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-calango.js +3 -1
- package/tradutores/tradutor-reverso-calango.js.map +1 -1
- package/tradutores/tradutor-reverso-python.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-python.js +37 -14
- package/tradutores/tradutor-reverso-python.js.map +1 -1
- package/umd/delegua.js +366 -134
package/umd/delegua.js
CHANGED
|
@@ -642,13 +642,47 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
642
642
|
visitarChamadaPorVariavel(entidadeChamadaVariavel, argumentos) {
|
|
643
643
|
const variavel = entidadeChamadaVariavel;
|
|
644
644
|
const nomeFuncao = variavel.simbolo.lexema;
|
|
645
|
-
const funcoesNativas = [
|
|
645
|
+
const funcoesNativas = [
|
|
646
|
+
'aleatorio',
|
|
647
|
+
'aleatorioEntre',
|
|
648
|
+
'algum',
|
|
649
|
+
'arredondar',
|
|
650
|
+
'clonar',
|
|
651
|
+
'encontrar',
|
|
652
|
+
'encontrarIndice',
|
|
653
|
+
'encontrarUltimo',
|
|
654
|
+
'encontrarUltimoIndice',
|
|
655
|
+
'escreva',
|
|
656
|
+
'filtrarPor',
|
|
657
|
+
'incluido',
|
|
658
|
+
'inteiro',
|
|
659
|
+
'intervalo',
|
|
660
|
+
'leia',
|
|
661
|
+
'longo',
|
|
662
|
+
'mapear',
|
|
663
|
+
'maximo',
|
|
664
|
+
'minimo',
|
|
665
|
+
'numero',
|
|
666
|
+
'número',
|
|
667
|
+
'ordenar',
|
|
668
|
+
'paraCada',
|
|
669
|
+
'primeiroEmCondicao',
|
|
670
|
+
'real',
|
|
671
|
+
'reduzir',
|
|
672
|
+
'somar',
|
|
673
|
+
'tamanho',
|
|
674
|
+
'texto',
|
|
675
|
+
'tipo',
|
|
676
|
+
'todos',
|
|
677
|
+
'todosEmCondicao',
|
|
678
|
+
'tupla',
|
|
679
|
+
'vetor',
|
|
680
|
+
];
|
|
646
681
|
const pareceSerClasse = nomeFuncao[0] === nomeFuncao[0].toUpperCase();
|
|
647
682
|
if (funcoesNativas.includes(nomeFuncao) || pareceSerClasse) {
|
|
648
683
|
return Promise.resolve();
|
|
649
684
|
}
|
|
650
|
-
const funcaoChamada = this.gerenciadorEscopos.buscar(nomeFuncao) ||
|
|
651
|
-
this.funcoes[nomeFuncao];
|
|
685
|
+
const funcaoChamada = this.gerenciadorEscopos.buscar(nomeFuncao) || this.funcoes[nomeFuncao];
|
|
652
686
|
if (!funcaoChamada) {
|
|
653
687
|
this.erro(entidadeChamadaVariavel.simbolo, `Chamada da função '${nomeFuncao}' não existe.`);
|
|
654
688
|
return Promise.resolve();
|
|
@@ -819,11 +853,15 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
819
853
|
}
|
|
820
854
|
return Promise.resolve();
|
|
821
855
|
}
|
|
822
|
-
visitarDeclaracaoEscolha(declaracao) {
|
|
856
|
+
async visitarDeclaracaoEscolha(declaracao) {
|
|
823
857
|
const identificadorOuLiteral = declaracao.identificadorOuLiteral;
|
|
824
858
|
const tipo = identificadorOuLiteral.tipo || 'qualquer';
|
|
825
859
|
const tiposLiteraisCasos = [];
|
|
860
|
+
this.marcarVariaveisUsadasEmExpressao(identificadorOuLiteral);
|
|
826
861
|
for (let caminho of declaracao.caminhos) {
|
|
862
|
+
for (const declaracao of caminho.declaracoes) {
|
|
863
|
+
await declaracao.aceitar(this);
|
|
864
|
+
}
|
|
827
865
|
for (let condicao of caminho.condicoes) {
|
|
828
866
|
switch (condicao.constructor) {
|
|
829
867
|
case construtos_1.Literal:
|
|
@@ -831,7 +869,9 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
831
869
|
const tiposNumericos = ['inteiro', 'número', 'real'];
|
|
832
870
|
const ambosSaoNumericos = tiposNumericos.includes(condicaoLiteral.tipo) &&
|
|
833
871
|
tiposNumericos.includes(tipo);
|
|
834
|
-
if (condicaoLiteral.tipo !== tipo &&
|
|
872
|
+
if (condicaoLiteral.tipo !== tipo &&
|
|
873
|
+
!ambosSaoNumericos &&
|
|
874
|
+
tipo !== 'qualquer') {
|
|
835
875
|
this.erro({
|
|
836
876
|
lexema: condicaoLiteral.valor,
|
|
837
877
|
tipo: condicaoLiteral.tipo,
|
|
@@ -852,23 +892,32 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
852
892
|
}
|
|
853
893
|
}
|
|
854
894
|
}
|
|
855
|
-
if (tipo === 'qualquer' &&
|
|
895
|
+
if (tipo === 'qualquer' &&
|
|
896
|
+
tiposLiteraisCasos.length > 0 &&
|
|
897
|
+
identificadorOuLiteral instanceof construtos_1.Variavel) {
|
|
856
898
|
const tiposUnicos = [...new Set(tiposLiteraisCasos)];
|
|
857
899
|
if (tiposUnicos.length === 1) {
|
|
858
900
|
const tipoInferido = tiposUnicos[0];
|
|
859
901
|
const variavelEscopo = this.gerenciadorEscopos.buscar(identificadorOuLiteral.simbolo.lexema);
|
|
860
902
|
if (variavelEscopo) {
|
|
861
|
-
this.sugestao(identificadorOuLiteral.simbolo, `Um tipo melhor pode ser inferido para '${identificadorOuLiteral.simbolo.lexema}': '${tipoInferido}'`, [
|
|
903
|
+
this.sugestao(identificadorOuLiteral.simbolo, `Um tipo melhor pode ser inferido para '${identificadorOuLiteral.simbolo.lexema}': '${tipoInferido}'`, [
|
|
904
|
+
{
|
|
862
905
|
titulo: `Alterar tipo de '${identificadorOuLiteral.simbolo.lexema}' para '${tipoInferido}'`,
|
|
863
906
|
textoOriginal: 'qualquer',
|
|
864
907
|
textoSubstituto: tipoInferido,
|
|
865
908
|
linha: variavelEscopo.linha,
|
|
866
909
|
colunaInicio: 0,
|
|
867
910
|
colunaFim: 0,
|
|
868
|
-
}
|
|
911
|
+
},
|
|
912
|
+
]);
|
|
869
913
|
}
|
|
870
914
|
}
|
|
871
915
|
}
|
|
916
|
+
if (declaracao.caminhoPadrao) {
|
|
917
|
+
for (const decl of declaracao.caminhoPadrao.declaracoes) {
|
|
918
|
+
await decl.aceitar(this);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
872
921
|
return Promise.resolve();
|
|
873
922
|
}
|
|
874
923
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
@@ -921,9 +970,48 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
921
970
|
}
|
|
922
971
|
return Promise.resolve();
|
|
923
972
|
}
|
|
924
|
-
visitarDeclaracaoParaCada(declaracao) {
|
|
925
|
-
// Marca o vetor/dicionário como usado
|
|
973
|
+
async visitarDeclaracaoParaCada(declaracao) {
|
|
926
974
|
this.marcarVariaveisUsadasEmExpressao(declaracao.vetorOuDicionario);
|
|
975
|
+
this.gerenciadorEscopos.empilharEscopo();
|
|
976
|
+
try {
|
|
977
|
+
if (declaracao.variavelIteracao instanceof construtos_1.Variavel) {
|
|
978
|
+
const nome = declaracao.variavelIteracao.simbolo.lexema;
|
|
979
|
+
this.gerenciadorEscopos.declarar(nome, {
|
|
980
|
+
nome,
|
|
981
|
+
tipo: 'qualquer',
|
|
982
|
+
imutavel: false,
|
|
983
|
+
valor: null,
|
|
984
|
+
inicializada: true,
|
|
985
|
+
usada: false,
|
|
986
|
+
hashArquivo: declaracao.hashArquivo,
|
|
987
|
+
linha: declaracao.linha,
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
else if (declaracao.variavelIteracao instanceof construtos_1.Dupla) {
|
|
991
|
+
const dupla = declaracao.variavelIteracao;
|
|
992
|
+
for (const parte of [dupla.primeiro, dupla.segundo]) {
|
|
993
|
+
if (parte instanceof construtos_1.Variavel) {
|
|
994
|
+
const nome = parte.simbolo.lexema;
|
|
995
|
+
this.gerenciadorEscopos.declarar(nome, {
|
|
996
|
+
nome,
|
|
997
|
+
tipo: 'qualquer',
|
|
998
|
+
imutavel: false,
|
|
999
|
+
valor: null,
|
|
1000
|
+
inicializada: true,
|
|
1001
|
+
usada: false,
|
|
1002
|
+
hashArquivo: declaracao.hashArquivo,
|
|
1003
|
+
linha: declaracao.linha,
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
if (declaracao.corpo) {
|
|
1009
|
+
await declaracao.corpo.aceitar(this);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
finally {
|
|
1013
|
+
this.gerenciadorEscopos.desempilharEscopo();
|
|
1014
|
+
}
|
|
927
1015
|
return Promise.resolve();
|
|
928
1016
|
}
|
|
929
1017
|
async visitarDeclaracaoSe(declaracao) {
|
|
@@ -1202,14 +1290,40 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1202
1290
|
const nomeFuncao = entidadeChamadaVariavel.simbolo.lexema;
|
|
1203
1291
|
// Lista de funções embutidas que não precisam ser declaradas
|
|
1204
1292
|
const funcoesEmbutidas = [
|
|
1293
|
+
'aleatorio',
|
|
1294
|
+
'aleatorioEntre',
|
|
1295
|
+
'algum',
|
|
1296
|
+
'arredondar',
|
|
1297
|
+
'clonar',
|
|
1298
|
+
'encontrar',
|
|
1299
|
+
'encontrarIndice',
|
|
1300
|
+
'encontrarUltimo',
|
|
1301
|
+
'encontrarUltimoIndice',
|
|
1302
|
+
'escreva',
|
|
1303
|
+
'filtrarPor',
|
|
1304
|
+
'incluido',
|
|
1205
1305
|
'inteiro',
|
|
1206
|
-
'
|
|
1306
|
+
'intervalo',
|
|
1307
|
+
'leia',
|
|
1308
|
+
'longo',
|
|
1309
|
+
'mapear',
|
|
1310
|
+
'maximo',
|
|
1311
|
+
'minimo',
|
|
1207
1312
|
'numero',
|
|
1208
1313
|
'número',
|
|
1314
|
+
'ordenar',
|
|
1315
|
+
'paraCada',
|
|
1316
|
+
'primeiroEmCondicao',
|
|
1317
|
+
'real',
|
|
1318
|
+
'reduzir',
|
|
1319
|
+
'somar',
|
|
1320
|
+
'tamanho',
|
|
1209
1321
|
'texto',
|
|
1210
|
-
'leia',
|
|
1211
|
-
'escreva',
|
|
1212
1322
|
'tipo',
|
|
1323
|
+
'todos',
|
|
1324
|
+
'todosEmCondicao',
|
|
1325
|
+
'tupla',
|
|
1326
|
+
'vetor',
|
|
1213
1327
|
];
|
|
1214
1328
|
// Classes/construtores geralmente começam com letra maiúscula
|
|
1215
1329
|
const pareceSerClasse = nomeFuncao[0] === nomeFuncao[0].toUpperCase();
|
|
@@ -1435,6 +1549,9 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1435
1549
|
return Promise.resolve();
|
|
1436
1550
|
}
|
|
1437
1551
|
visitarExpressaoRetornar(declaracao) {
|
|
1552
|
+
if (declaracao.valor) {
|
|
1553
|
+
this.marcarVariaveisUsadasEmExpressao(declaracao.valor);
|
|
1554
|
+
}
|
|
1438
1555
|
return Promise.resolve(undefined);
|
|
1439
1556
|
}
|
|
1440
1557
|
visitarExpressaoDeVariavel(expressao) {
|
|
@@ -1517,7 +1634,8 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1517
1634
|
if (nomeSuperclasse === declaracao.simbolo.lexema) {
|
|
1518
1635
|
this.erro(superClasseVariavel.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
|
|
1519
1636
|
}
|
|
1520
|
-
else if (!this.classesDeclaradas.has(nomeSuperclasse) &&
|
|
1637
|
+
else if (!this.classesDeclaradas.has(nomeSuperclasse) &&
|
|
1638
|
+
!this.classesExternasConhecidas.has(nomeSuperclasse)) {
|
|
1521
1639
|
this.erro(superClasseVariavel.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
|
|
1522
1640
|
}
|
|
1523
1641
|
}
|
|
@@ -1554,8 +1672,26 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1554
1672
|
metodo.funcao.corpo.length === 0) {
|
|
1555
1673
|
this.aviso(metodo.simbolo, `Método especifica tipo de retorno '${tipoRetornoMetodo}', mas não há qualquer retorno correspondente no corpo do método.`);
|
|
1556
1674
|
}
|
|
1557
|
-
|
|
1558
|
-
|
|
1675
|
+
this.gerenciadorEscopos.empilharEscopo();
|
|
1676
|
+
try {
|
|
1677
|
+
for (const parametro of metodo.funcao.parametros) {
|
|
1678
|
+
this.gerenciadorEscopos.declarar(parametro.nome.lexema, {
|
|
1679
|
+
nome: parametro.nome.lexema,
|
|
1680
|
+
tipo: parametro.tipoDado || 'qualquer',
|
|
1681
|
+
imutavel: false,
|
|
1682
|
+
valor: undefined,
|
|
1683
|
+
inicializada: true,
|
|
1684
|
+
usada: true,
|
|
1685
|
+
hashArquivo: parametro.nome.hashArquivo,
|
|
1686
|
+
linha: parametro.nome.linha,
|
|
1687
|
+
});
|
|
1688
|
+
}
|
|
1689
|
+
for (const declaracao of metodo.funcao.corpo) {
|
|
1690
|
+
await declaracao.aceitar(this);
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
finally {
|
|
1694
|
+
this.gerenciadorEscopos.desempilharEscopo();
|
|
1559
1695
|
}
|
|
1560
1696
|
}
|
|
1561
1697
|
}
|
|
@@ -2676,7 +2812,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2676
2812
|
construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
|
|
2677
2813
|
break;
|
|
2678
2814
|
default:
|
|
2679
|
-
if (construtoTipado.tipo &&
|
|
2815
|
+
if (construtoTipado.tipo &&
|
|
2816
|
+
construtoTipado.tipo in this.tiposDefinidosEmCodigo) {
|
|
2680
2817
|
const tipoCorrespondente = this.tiposDefinidosEmCodigo[construtoTipado.tipo];
|
|
2681
2818
|
const possivelMetodo = tipoCorrespondente.metodos.filter((m) => m.simbolo.lexema === construtoTipado.simbolo.lexema);
|
|
2682
2819
|
if (possivelMetodo.length > 0) {
|
|
@@ -3407,7 +3544,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3407
3544
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
|
|
3408
3545
|
const declaracoes = [];
|
|
3409
3546
|
do {
|
|
3410
|
-
declaracoes.push(await this.resolverDeclaracao());
|
|
3547
|
+
declaracoes.push((await this.resolverDeclaracao()));
|
|
3411
3548
|
} while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
|
|
3412
3549
|
!this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
|
|
3413
3550
|
!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
|
|
@@ -3480,7 +3617,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3480
3617
|
const simboloNao = new simbolo_1.Simbolo(delegua_2.default.NEGACAO, 'nao', null, Number(simboloAssercao.linha), simboloAssercao.hashArquivo, simboloAssercao.colunaInicio, simboloAssercao.colunaFim);
|
|
3481
3618
|
const condicaoNegada = new construtos_1.Unario(simboloAssercao.hashArquivo, simboloNao, condicao, 'ANTES');
|
|
3482
3619
|
const declaracaoFalhar = new declaracoes_1.Falhar(simboloAssercao, mensagemFalha);
|
|
3483
|
-
const blocoFalha = new declaracoes_1.Bloco(simboloAssercao.hashArquivo, Number(simboloAssercao.linha), [
|
|
3620
|
+
const blocoFalha = new declaracoes_1.Bloco(simboloAssercao.hashArquivo, Number(simboloAssercao.linha), [
|
|
3621
|
+
declaracaoFalhar,
|
|
3622
|
+
]);
|
|
3484
3623
|
return new declaracoes_1.Se(condicaoNegada, blocoFalha);
|
|
3485
3624
|
}
|
|
3486
3625
|
async logicaComumFazer() {
|
|
@@ -3540,7 +3679,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3540
3679
|
construtoCaminhoModulo = new construtos_1.Literal(identificadorModulo.hashArquivo, Number(identificadorModulo.linha), identificadorModulo.lexema);
|
|
3541
3680
|
break;
|
|
3542
3681
|
default:
|
|
3543
|
-
throw this.erro(this.simbolos[this.atual],
|
|
3682
|
+
throw this.erro(this.simbolos[this.atual], 'Esperado caminho do módulo como texto ou identificador em declaração de importação.');
|
|
3544
3683
|
}
|
|
3545
3684
|
const importar = new declaracoes_1.Importar(construtoCaminhoModulo);
|
|
3546
3685
|
if (identificadorDeTudo !== null) {
|
|
@@ -3713,7 +3852,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3713
3852
|
const caminhoEntao = (await this.resolverDeclaracao());
|
|
3714
3853
|
let caminhoSenao = undefined;
|
|
3715
3854
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
|
|
3716
|
-
caminhoSenao = await this.resolverDeclaracao();
|
|
3855
|
+
caminhoSenao = (await this.resolverDeclaracao());
|
|
3717
3856
|
}
|
|
3718
3857
|
return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
|
|
3719
3858
|
}
|
|
@@ -3848,11 +3987,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3848
3987
|
const classeDefinida = this.tiposDefinidosEmCodigo[tipoObjeto];
|
|
3849
3988
|
if (classeDefinida instanceof declaracoes_1.Classe) {
|
|
3850
3989
|
const nomeMembro = entidadeChamada.simbolo.lexema;
|
|
3851
|
-
const metodo = classeDefinida.metodos?.find(m => m.simbolo.lexema === nomeMembro);
|
|
3990
|
+
const metodo = classeDefinida.metodos?.find((m) => m.simbolo.lexema === nomeMembro);
|
|
3852
3991
|
if (metodo) {
|
|
3853
3992
|
return metodo.tipo || 'qualquer';
|
|
3854
3993
|
}
|
|
3855
|
-
const propriedade = classeDefinida.propriedades?.find(p => p.nome.lexema === nomeMembro);
|
|
3994
|
+
const propriedade = classeDefinida.propriedades?.find((p) => p.nome.lexema === nomeMembro);
|
|
3856
3995
|
if (propriedade) {
|
|
3857
3996
|
return propriedade.tipo || 'qualquer';
|
|
3858
3997
|
}
|
|
@@ -3878,7 +4017,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3878
4017
|
if (entidadeChamada.objeto instanceof construtos_1.Isto) {
|
|
3879
4018
|
if (this.metodosClasseAtualEmAnalise) {
|
|
3880
4019
|
const nomeMembro = entidadeChamada.simbolo.lexema;
|
|
3881
|
-
const metodo = this.metodosClasseAtualEmAnalise.find(m => m.simbolo.lexema === nomeMembro);
|
|
4020
|
+
const metodo = this.metodosClasseAtualEmAnalise.find((m) => m.simbolo.lexema === nomeMembro);
|
|
3882
4021
|
if (metodo) {
|
|
3883
4022
|
return metodo.tipo || 'qualquer';
|
|
3884
4023
|
}
|
|
@@ -4027,7 +4166,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4027
4166
|
}
|
|
4028
4167
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
4029
4168
|
const tipoOriginal = tipo; // Preserva o tipo antes da inferência
|
|
4030
|
-
tipo =
|
|
4169
|
+
tipo =
|
|
4170
|
+
this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
|
|
4031
4171
|
if (tipo !== 'dicionário') {
|
|
4032
4172
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
4033
4173
|
}
|
|
@@ -4095,7 +4235,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4095
4235
|
let retorno = [];
|
|
4096
4236
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
4097
4237
|
// Se tipo ainda não foi definido, infere.
|
|
4098
|
-
tipo =
|
|
4238
|
+
tipo =
|
|
4239
|
+
this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
|
|
4099
4240
|
if (tipo !== 'dicionário') {
|
|
4100
4241
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
4101
4242
|
}
|
|
@@ -4404,7 +4545,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4404
4545
|
this.erros.push(erro);
|
|
4405
4546
|
}
|
|
4406
4547
|
if (this.erros.length > quantidadeErrosAntesCorpoOp) {
|
|
4407
|
-
this.atual =
|
|
4548
|
+
this.atual =
|
|
4549
|
+
this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoOp);
|
|
4408
4550
|
corpoOp = [];
|
|
4409
4551
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
4410
4552
|
}
|
|
@@ -4442,7 +4584,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4442
4584
|
// Método de classe estrangeira não pode ter corpo.
|
|
4443
4585
|
if (ehEstrangeira &&
|
|
4444
4586
|
this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
4445
|
-
throw this.erro(this.simbolos[this.atual],
|
|
4587
|
+
throw this.erro(this.simbolos[this.atual], 'Métodos de classe estrangeira não podem ter corpo.');
|
|
4446
4588
|
}
|
|
4447
4589
|
// Método é abstrato quando: (a) está dentro de um bloco `abstrato {}`,
|
|
4448
4590
|
// ou (b) a classe é abstrata/estrangeira e o próximo token não é `{`.
|
|
@@ -4475,7 +4617,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4475
4617
|
this.erros.push(erro);
|
|
4476
4618
|
}
|
|
4477
4619
|
if (this.erros.length > quantidadeErrosAntesCorpo) {
|
|
4478
|
-
this.atual =
|
|
4620
|
+
this.atual =
|
|
4621
|
+
this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpo);
|
|
4479
4622
|
corpo = [];
|
|
4480
4623
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
4481
4624
|
}
|
|
@@ -4553,8 +4696,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4553
4696
|
catch (erro) {
|
|
4554
4697
|
this.erros.push(erro);
|
|
4555
4698
|
}
|
|
4556
|
-
if (this.erros.length >
|
|
4557
|
-
quantidadeErrosAntesCorpoAcessor) {
|
|
4699
|
+
if (this.erros.length > quantidadeErrosAntesCorpoAcessor) {
|
|
4558
4700
|
this.atual = this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoAcessor);
|
|
4559
4701
|
corpoAcessor = [];
|
|
4560
4702
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
@@ -6400,9 +6542,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6400
6542
|
}
|
|
6401
6543
|
// Modo formatação: {expressao:formato}
|
|
6402
6544
|
if (mioloLimpo.includes(':')) {
|
|
6403
|
-
const [variavel, formato] = mioloLimpo
|
|
6404
|
-
.split(':')
|
|
6405
|
-
.map(s => s.trim());
|
|
6545
|
+
const [variavel, formato] = mioloLimpo.split(':').map((s) => s.trim());
|
|
6406
6546
|
if (variavel) {
|
|
6407
6547
|
return `" + "{:${formato}}".formatar(${variavel}) + "`;
|
|
6408
6548
|
}
|
|
@@ -6526,8 +6666,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6526
6666
|
case pitugues_2.default.INTERPOLACAO:
|
|
6527
6667
|
const simboloInterpolacao = this.avancarEDevolverAnterior();
|
|
6528
6668
|
const conteudoOriginal = simboloInterpolacao.literal;
|
|
6529
|
-
const codigoTransformado = this
|
|
6530
|
-
.transformarInterpolacaoEmFormatacao(conteudoOriginal);
|
|
6669
|
+
const codigoTransformado = this.transformarInterpolacaoEmFormatacao(conteudoOriginal);
|
|
6531
6670
|
const microLexador = new micro_lexador_pitugues_1.MicroLexadorPitugues();
|
|
6532
6671
|
const retornoMicroLexador = microLexador.mapear(codigoTransformado);
|
|
6533
6672
|
const microAvaliadorSintatico = new micro_avaliador_sintatico_pitugues_1.MicroAvaliadorSintaticoPitugues();
|
|
@@ -6740,7 +6879,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6740
6879
|
while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
|
|
6741
6880
|
const operador = this.simbolos[this.atual - 1];
|
|
6742
6881
|
const expressaoOuCondicao = await this.seTernario();
|
|
6743
|
-
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6882
|
+
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6744
6883
|
${this.simbolos[this.atual].lexema}.`);
|
|
6745
6884
|
const expressaoSenao = await this.seTernario();
|
|
6746
6885
|
expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
|
|
@@ -8052,7 +8191,10 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
|
|
|
8052
8191
|
else if (this.verificarSeSimboloAtualEIgualA(portugol_ipt_1.default.DEFEITO)) {
|
|
8053
8192
|
this.consumir(portugol_ipt_1.default.DOIS_PONTOS, "Esperado ':' após 'defeito'.");
|
|
8054
8193
|
this.consumirQuebrasLinha();
|
|
8055
|
-
const bloco = await this.resolverBloco([
|
|
8194
|
+
const bloco = await this.resolverBloco([
|
|
8195
|
+
portugol_ipt_1.default.FIMESCOLHE,
|
|
8196
|
+
portugol_ipt_1.default.FIM,
|
|
8197
|
+
]);
|
|
8056
8198
|
caminhoPadrao = { condicoes: [], declaracoes: bloco.declaracoes };
|
|
8057
8199
|
}
|
|
8058
8200
|
else {
|
|
@@ -8781,11 +8923,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8781
8923
|
const simboloTente = this.simboloAnterior();
|
|
8782
8924
|
const blocoTente = [];
|
|
8783
8925
|
while (!this.estaNoFinal() &&
|
|
8784
|
-
![
|
|
8785
|
-
prisma_1.default.PEGUE,
|
|
8786
|
-
prisma_1.default.FINALMENTE,
|
|
8787
|
-
prisma_1.default.FIM,
|
|
8788
|
-
].includes(this.simbolos[this.atual].tipo)) {
|
|
8926
|
+
![prisma_1.default.PEGUE, prisma_1.default.FINALMENTE, prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo)) {
|
|
8789
8927
|
blocoTente.push(await this.resolverDeclaracaoForaDeBloco());
|
|
8790
8928
|
}
|
|
8791
8929
|
let blocoPegue = null;
|
|
@@ -9053,7 +9191,8 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
9053
9191
|
this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
9054
9192
|
this.consumir(prisma_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
|
|
9055
9193
|
const declaracoesCorpo = [];
|
|
9056
|
-
while (!this.estaNoFinal() &&
|
|
9194
|
+
while (!this.estaNoFinal() &&
|
|
9195
|
+
!this.verificarTipoSimboloAtual(prisma_1.default.CHAVE_DIREITA)) {
|
|
9057
9196
|
declaracoesCorpo.push(await this.resolverDeclaracaoForaDeBloco());
|
|
9058
9197
|
}
|
|
9059
9198
|
this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após o corpo do método.");
|
|
@@ -19403,7 +19542,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
19403
19542
|
this.eInicializador = eInicializador;
|
|
19404
19543
|
}
|
|
19405
19544
|
aridade() {
|
|
19406
|
-
return this.declaracao?.parametros?.filter(p => p.abrangencia !== 'multiplo').length || 0;
|
|
19545
|
+
return this.declaracao?.parametros?.filter((p) => p.abrangencia !== 'multiplo').length || 0;
|
|
19407
19546
|
}
|
|
19408
19547
|
/**
|
|
19409
19548
|
* Método utilizado por Delégua para representar esta função quando impressa.
|
|
@@ -20823,7 +20962,8 @@ class InterpretadorBase {
|
|
|
20823
20962
|
];
|
|
20824
20963
|
const valores = [];
|
|
20825
20964
|
for (let propriedade of propriedadesValidas) {
|
|
20826
|
-
if (expressao.hasOwnProperty(propriedade) &&
|
|
20965
|
+
if (expressao.hasOwnProperty(propriedade) &&
|
|
20966
|
+
expressao[propriedade] !== undefined) {
|
|
20827
20967
|
const valor = await this.avaliar(expressao[propriedade]);
|
|
20828
20968
|
valores.push(valor);
|
|
20829
20969
|
}
|
|
@@ -21172,7 +21312,9 @@ class InterpretadorBase {
|
|
|
21172
21312
|
valor: valorDireito,
|
|
21173
21313
|
imutavel: false,
|
|
21174
21314
|
};
|
|
21175
|
-
return await metodoASerChamado.chamar(this, [
|
|
21315
|
+
return await metodoASerChamado.chamar(this, [
|
|
21316
|
+
{ nome: null, valor: argumentoOperador },
|
|
21317
|
+
]);
|
|
21176
21318
|
}
|
|
21177
21319
|
}
|
|
21178
21320
|
const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
|
|
@@ -21186,7 +21328,8 @@ class InterpretadorBase {
|
|
|
21186
21328
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21187
21329
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21188
21330
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21189
|
-
return this.converterParaBigInt(valorEsquerdo) **
|
|
21331
|
+
return (this.converterParaBigInt(valorEsquerdo) **
|
|
21332
|
+
this.converterParaBigInt(valorDireito));
|
|
21190
21333
|
}
|
|
21191
21334
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
21192
21335
|
return resultadoExponenciacao;
|
|
@@ -21213,7 +21356,8 @@ class InterpretadorBase {
|
|
|
21213
21356
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21214
21357
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21215
21358
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21216
|
-
return this.converterParaBigInt(valorEsquerdo) -
|
|
21359
|
+
return (this.converterParaBigInt(valorEsquerdo) -
|
|
21360
|
+
this.converterParaBigInt(valorDireito));
|
|
21217
21361
|
}
|
|
21218
21362
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
21219
21363
|
case delegua_1.default.ADICAO:
|
|
@@ -21248,8 +21392,10 @@ class InterpretadorBase {
|
|
|
21248
21392
|
}
|
|
21249
21393
|
// TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
|
|
21250
21394
|
// tradicionais do JavaScript?
|
|
21251
|
-
if (tipoEsquerdo === 'qualquer' ||
|
|
21252
|
-
|
|
21395
|
+
if (tipoEsquerdo === 'qualquer' ||
|
|
21396
|
+
tipoDireito === 'qualquer' ||
|
|
21397
|
+
tipoEsquerdo === 'nulo' ||
|
|
21398
|
+
tipoDireito === 'nulo') {
|
|
21253
21399
|
return valorEsquerdo + valorDireito;
|
|
21254
21400
|
}
|
|
21255
21401
|
return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
|
|
@@ -21338,7 +21484,8 @@ class InterpretadorBase {
|
|
|
21338
21484
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21339
21485
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21340
21486
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21341
|
-
return this.converterParaBigInt(valorEsquerdo) &
|
|
21487
|
+
return (this.converterParaBigInt(valorEsquerdo) &
|
|
21488
|
+
this.converterParaBigInt(valorDireito));
|
|
21342
21489
|
}
|
|
21343
21490
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
21344
21491
|
case delegua_1.default.CIRCUMFLEXO:
|
|
@@ -21348,7 +21495,8 @@ class InterpretadorBase {
|
|
|
21348
21495
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21349
21496
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21350
21497
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21351
|
-
return this.converterParaBigInt(valorEsquerdo) ^
|
|
21498
|
+
return (this.converterParaBigInt(valorEsquerdo) ^
|
|
21499
|
+
this.converterParaBigInt(valorDireito));
|
|
21352
21500
|
}
|
|
21353
21501
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
21354
21502
|
case delegua_1.default.BIT_OR:
|
|
@@ -21358,21 +21506,28 @@ class InterpretadorBase {
|
|
|
21358
21506
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21359
21507
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21360
21508
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21361
|
-
return this.converterParaBigInt(valorEsquerdo) |
|
|
21509
|
+
return (this.converterParaBigInt(valorEsquerdo) |
|
|
21510
|
+
this.converterParaBigInt(valorDireito));
|
|
21362
21511
|
}
|
|
21363
21512
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
21364
21513
|
case delegua_1.default.MENOR_MENOR:
|
|
21365
21514
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21366
21515
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
21367
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
21368
|
-
|
|
21516
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
21517
|
+
typeof valorDireito === 'bigint' ||
|
|
21518
|
+
Number(valorDireito) >= 32) {
|
|
21519
|
+
return (this.converterParaBigInt(valorEsquerdo) <<
|
|
21520
|
+
this.converterParaBigInt(valorDireito));
|
|
21369
21521
|
}
|
|
21370
21522
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
21371
21523
|
case delegua_1.default.MAIOR_MAIOR:
|
|
21372
21524
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21373
21525
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
21374
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
21375
|
-
|
|
21526
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
21527
|
+
typeof valorDireito === 'bigint' ||
|
|
21528
|
+
Number(valorDireito) >= 32) {
|
|
21529
|
+
return (this.converterParaBigInt(valorEsquerdo) >>
|
|
21530
|
+
this.converterParaBigInt(valorDireito));
|
|
21376
21531
|
}
|
|
21377
21532
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
21378
21533
|
case delegua_1.default.DIFERENTE:
|
|
@@ -23519,7 +23674,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23519
23674
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23520
23675
|
if (objeto.constructor === Object) {
|
|
23521
23676
|
if (expressao.nomeMetodo in primitivas_dicionario_1.default) {
|
|
23522
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomeMetodo]
|
|
23677
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomeMetodo]
|
|
23678
|
+
.implementacao;
|
|
23523
23679
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.nomeMetodo, 'dicionário');
|
|
23524
23680
|
}
|
|
23525
23681
|
return objeto[expressao.nomeMetodo] || null;
|
|
@@ -23558,7 +23714,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23558
23714
|
case delegua_1.default.NUMERO:
|
|
23559
23715
|
case delegua_1.default.NÚMERO:
|
|
23560
23716
|
if (expressao.nomeMetodo in primitivas_numero_1.default) {
|
|
23561
|
-
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.nomeMetodo]
|
|
23717
|
+
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.nomeMetodo]
|
|
23718
|
+
.implementacao;
|
|
23562
23719
|
if (metodoDePrimitivaNumero) {
|
|
23563
23720
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaNumero, expressao.nomeMetodo, tipoObjeto);
|
|
23564
23721
|
}
|
|
@@ -23571,7 +23728,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23571
23728
|
break;
|
|
23572
23729
|
case delegua_1.default.TEXTO:
|
|
23573
23730
|
if (expressao.nomeMetodo in primitivas_texto_1.default) {
|
|
23574
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.nomeMetodo]
|
|
23731
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.nomeMetodo]
|
|
23732
|
+
.implementacao;
|
|
23575
23733
|
if (metodoDePrimitivaTexto) {
|
|
23576
23734
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.nomeMetodo, 'texto');
|
|
23577
23735
|
}
|
|
@@ -23591,7 +23749,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23591
23749
|
case delegua_1.default.VETOR_QUALQUER:
|
|
23592
23750
|
case delegua_1.default.VETOR_TEXTO:
|
|
23593
23751
|
if (expressao.nomeMetodo in primitivas_vetor_1.default) {
|
|
23594
|
-
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.nomeMetodo]
|
|
23752
|
+
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.nomeMetodo]
|
|
23753
|
+
.implementacao;
|
|
23595
23754
|
if (metodoDePrimitivaVetor) {
|
|
23596
23755
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaVetor, expressao.nomeMetodo, tipoObjeto);
|
|
23597
23756
|
}
|
|
@@ -23692,7 +23851,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23692
23851
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23693
23852
|
if (objeto.constructor === Object) {
|
|
23694
23853
|
if (expressao.simbolo.lexema in primitivas_dicionario_1.default) {
|
|
23695
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema]
|
|
23854
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema]
|
|
23855
|
+
.implementacao;
|
|
23696
23856
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.simbolo.lexema, 'dicionário');
|
|
23697
23857
|
}
|
|
23698
23858
|
return objeto[expressao.simbolo.lexema];
|
|
@@ -23705,7 +23865,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23705
23865
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23706
23866
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo texto.`);
|
|
23707
23867
|
}
|
|
23708
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23868
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23869
|
+
.implementacao;
|
|
23709
23870
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.simbolo.lexema, 'texto');
|
|
23710
23871
|
}
|
|
23711
23872
|
// A partir daqui, presume-se que o objeto é uma das estruturas
|
|
@@ -23730,7 +23891,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23730
23891
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23731
23892
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23732
23893
|
}
|
|
23733
|
-
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema]
|
|
23894
|
+
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema]
|
|
23895
|
+
.implementacao;
|
|
23734
23896
|
if (metodoDePrimitivaNumero) {
|
|
23735
23897
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaNumero, expressao.simbolo.lexema, 'número');
|
|
23736
23898
|
}
|
|
@@ -23743,7 +23905,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23743
23905
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23744
23906
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23745
23907
|
}
|
|
23746
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23908
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23909
|
+
.implementacao;
|
|
23747
23910
|
if (metodoDePrimitivaTexto) {
|
|
23748
23911
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.simbolo.lexema, 'texto');
|
|
23749
23912
|
}
|
|
@@ -23763,7 +23926,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23763
23926
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23764
23927
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23765
23928
|
}
|
|
23766
|
-
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema]
|
|
23929
|
+
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema]
|
|
23930
|
+
.implementacao;
|
|
23767
23931
|
if (metodoDePrimitivaVetor) {
|
|
23768
23932
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaVetor, expressao.simbolo.lexema, tipoObjeto);
|
|
23769
23933
|
}
|
|
@@ -23811,7 +23975,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23811
23975
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23812
23976
|
if (objeto.constructor === Object) {
|
|
23813
23977
|
if (expressao.nomePropriedade in primitivas_dicionario_1.default) {
|
|
23814
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade]
|
|
23978
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade]
|
|
23979
|
+
.implementacao;
|
|
23815
23980
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.nomePropriedade, 'dicionário');
|
|
23816
23981
|
}
|
|
23817
23982
|
return objeto[expressao.nomePropriedade] || null;
|
|
@@ -24487,9 +24652,9 @@ class PilhaEscoposExecucao {
|
|
|
24487
24652
|
}
|
|
24488
24653
|
espacoMemoriaAncestral.valores[simbolo.lexema] = {
|
|
24489
24654
|
valor,
|
|
24490
|
-
tipo:
|
|
24655
|
+
tipo: variavel.tipo === 'nulo' && !variavel.tipoExplicito
|
|
24491
24656
|
? (0, inferenciador_1.inferirTipoVariavel)(valor)
|
|
24492
|
-
:
|
|
24657
|
+
: variavel.tipo || (0, inferenciador_1.inferirTipoVariavel)(valor),
|
|
24493
24658
|
imutavel: false,
|
|
24494
24659
|
tipoExplicito: variavel.tipoExplicito,
|
|
24495
24660
|
};
|
|
@@ -24510,9 +24675,7 @@ class PilhaEscoposExecucao {
|
|
|
24510
24675
|
}
|
|
24511
24676
|
const tipoAtual = variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : null;
|
|
24512
24677
|
const deveLiberarTipo = tipoAtual === 'nulo' && !variavel.tipoExplicito;
|
|
24513
|
-
const tipoInferido = tipoAtual && !deveLiberarTipo
|
|
24514
|
-
? tipoAtual
|
|
24515
|
-
: (0, inferenciador_1.inferirTipoVariavel)(valor);
|
|
24678
|
+
const tipoInferido = tipoAtual && !deveLiberarTipo ? tipoAtual : (0, inferenciador_1.inferirTipoVariavel)(valor);
|
|
24516
24679
|
const tipo = (tipoInferido || 'objeto').toLowerCase();
|
|
24517
24680
|
const valorResolvido = this.converterValor(tipo, valor);
|
|
24518
24681
|
if (indice !== undefined && indice !== null) {
|
|
@@ -24784,7 +24947,9 @@ class LexadorCalango {
|
|
|
24784
24947
|
const linhaPrimeiroCaracter = this.linha;
|
|
24785
24948
|
// Restringe leitura à linha atual (como analisarNumero), evitando
|
|
24786
24949
|
// que avancar() mude this.linha e corrompa o cálculo do substring.
|
|
24787
|
-
while (this.simboloAtual() !== "'" &&
|
|
24950
|
+
while (this.simboloAtual() !== "'" &&
|
|
24951
|
+
this.linha === linhaPrimeiroCaracter &&
|
|
24952
|
+
!this.eFinalDoCodigo()) {
|
|
24788
24953
|
this.avancar();
|
|
24789
24954
|
}
|
|
24790
24955
|
if (this.linha !== linhaPrimeiroCaracter || this.eFinalDoCodigo()) {
|
|
@@ -27860,10 +28025,12 @@ class Lexador {
|
|
|
27860
28025
|
break;
|
|
27861
28026
|
}
|
|
27862
28027
|
}
|
|
27863
|
-
valor +=
|
|
28028
|
+
valor +=
|
|
28029
|
+
hex.length === 2 ? String.fromCharCode(parseInt(hex, 16)) : '\\x' + hex;
|
|
27864
28030
|
break;
|
|
27865
28031
|
}
|
|
27866
|
-
case '\0':
|
|
28032
|
+
case '\0':
|
|
28033
|
+
break; // barra invertida no fim de linha: ignora e continua na próxima linha
|
|
27867
28034
|
default:
|
|
27868
28035
|
valor += '\\' + proximoCaractere;
|
|
27869
28036
|
break;
|
|
@@ -45975,13 +46142,19 @@ class TradutorElixir {
|
|
|
45975
46142
|
}
|
|
45976
46143
|
mapearTipoParaTypespec(tipo) {
|
|
45977
46144
|
switch (tipo) {
|
|
45978
|
-
case 'texto':
|
|
46145
|
+
case 'texto':
|
|
46146
|
+
return 'String.t()';
|
|
45979
46147
|
case 'numero':
|
|
45980
|
-
case 'inteiro':
|
|
45981
|
-
|
|
45982
|
-
case '
|
|
45983
|
-
|
|
45984
|
-
|
|
46148
|
+
case 'inteiro':
|
|
46149
|
+
return 'integer()';
|
|
46150
|
+
case 'real':
|
|
46151
|
+
return 'float()';
|
|
46152
|
+
case 'logico':
|
|
46153
|
+
return 'boolean()';
|
|
46154
|
+
case 'vazio':
|
|
46155
|
+
return 'no_return()';
|
|
46156
|
+
default:
|
|
46157
|
+
return 'term()';
|
|
45985
46158
|
}
|
|
45986
46159
|
}
|
|
45987
46160
|
/**
|
|
@@ -46070,11 +46243,15 @@ class TradutorElixir {
|
|
|
46070
46243
|
this.moduloAtual = nomeModulo;
|
|
46071
46244
|
if (declaracao.estrangeira) {
|
|
46072
46245
|
// Classe estrangeira: emitir @callback para cada método, definindo a interface esperada do módulo.
|
|
46073
|
-
resultado +=
|
|
46246
|
+
resultado +=
|
|
46247
|
+
this.adicionarIndentacao() +
|
|
46248
|
+
`@moduledoc "Classe estrangeira — implementação externa."\n`;
|
|
46074
46249
|
for (const metodo of declaracao.metodos) {
|
|
46075
46250
|
const params = metodo.funcao.parametros.map(() => 'term()').join(', ');
|
|
46076
46251
|
const retorno = this.mapearTipoParaTypespec(metodo.funcao.tipo);
|
|
46077
|
-
resultado +=
|
|
46252
|
+
resultado +=
|
|
46253
|
+
this.adicionarIndentacao() +
|
|
46254
|
+
`@callback ${metodo.simbolo.lexema}(${params}) :: ${retorno}\n`;
|
|
46078
46255
|
}
|
|
46079
46256
|
}
|
|
46080
46257
|
else {
|
|
@@ -48551,22 +48728,38 @@ class TradutorPortugolIpt {
|
|
|
48551
48728
|
// ── Operadores ───────────────────────────────────────────────────────────────
|
|
48552
48729
|
traduzirOperador(tipo) {
|
|
48553
48730
|
switch (tipo) {
|
|
48554
|
-
case portugol_ipt_1.default.ADICAO:
|
|
48555
|
-
|
|
48556
|
-
case portugol_ipt_1.default.
|
|
48557
|
-
|
|
48558
|
-
case portugol_ipt_1.default.
|
|
48559
|
-
|
|
48560
|
-
case portugol_ipt_1.default.
|
|
48561
|
-
|
|
48562
|
-
case portugol_ipt_1.default.
|
|
48563
|
-
|
|
48564
|
-
case portugol_ipt_1.default.
|
|
48565
|
-
|
|
48566
|
-
case portugol_ipt_1.default.
|
|
48567
|
-
|
|
48568
|
-
case portugol_ipt_1.default.
|
|
48569
|
-
|
|
48731
|
+
case portugol_ipt_1.default.ADICAO:
|
|
48732
|
+
return '+';
|
|
48733
|
+
case portugol_ipt_1.default.SUBTRACAO:
|
|
48734
|
+
return '-';
|
|
48735
|
+
case portugol_ipt_1.default.MULTIPLICACAO:
|
|
48736
|
+
return '*';
|
|
48737
|
+
case portugol_ipt_1.default.DIVISAO:
|
|
48738
|
+
return '/';
|
|
48739
|
+
case portugol_ipt_1.default.MODULO:
|
|
48740
|
+
return '%';
|
|
48741
|
+
case portugol_ipt_1.default.EXPONENCIACAO:
|
|
48742
|
+
return '**';
|
|
48743
|
+
case portugol_ipt_1.default.IGUAL:
|
|
48744
|
+
return '==';
|
|
48745
|
+
case portugol_ipt_1.default.DIFERENTE:
|
|
48746
|
+
return '!=';
|
|
48747
|
+
case portugol_ipt_1.default.MAIOR:
|
|
48748
|
+
return '>';
|
|
48749
|
+
case portugol_ipt_1.default.MAIOR_IGUAL:
|
|
48750
|
+
return '>=';
|
|
48751
|
+
case portugol_ipt_1.default.MENOR:
|
|
48752
|
+
return '<';
|
|
48753
|
+
case portugol_ipt_1.default.MENOR_IGUAL:
|
|
48754
|
+
return '<=';
|
|
48755
|
+
case portugol_ipt_1.default.E:
|
|
48756
|
+
return '&&';
|
|
48757
|
+
case portugol_ipt_1.default.OU:
|
|
48758
|
+
return '||';
|
|
48759
|
+
case portugol_ipt_1.default.XOU:
|
|
48760
|
+
return '^^';
|
|
48761
|
+
default:
|
|
48762
|
+
return tipo;
|
|
48570
48763
|
}
|
|
48571
48764
|
}
|
|
48572
48765
|
// ── Construtos ───────────────────────────────────────────────────────────────
|
|
@@ -48608,10 +48801,13 @@ class TradutorPortugolIpt {
|
|
|
48608
48801
|
traduzirConstrutoUnario(unario) {
|
|
48609
48802
|
const operando = this.traduzirConstruto(unario.operando);
|
|
48610
48803
|
switch (unario.operador.tipo) {
|
|
48611
|
-
case portugol_ipt_1.default.SUBTRACAO:
|
|
48804
|
+
case portugol_ipt_1.default.SUBTRACAO:
|
|
48805
|
+
return `-${operando}`;
|
|
48612
48806
|
case portugol_ipt_1.default.NEGACAO:
|
|
48613
|
-
case portugol_ipt_1.default.NAO:
|
|
48614
|
-
|
|
48807
|
+
case portugol_ipt_1.default.NAO:
|
|
48808
|
+
return `!(${operando})`;
|
|
48809
|
+
default:
|
|
48810
|
+
return `!(${operando})`;
|
|
48615
48811
|
}
|
|
48616
48812
|
}
|
|
48617
48813
|
traduzirConstrutoAtribuir(atribuir) {
|
|
@@ -48656,24 +48852,36 @@ class TradutorPortugolIpt {
|
|
|
48656
48852
|
}
|
|
48657
48853
|
tipoParaDelégua(tipo) {
|
|
48658
48854
|
switch (tipo) {
|
|
48659
|
-
case 'inteiro':
|
|
48660
|
-
|
|
48661
|
-
case '
|
|
48855
|
+
case 'inteiro':
|
|
48856
|
+
return 'inteiro';
|
|
48857
|
+
case 'texto':
|
|
48858
|
+
return 'texto';
|
|
48859
|
+
case 'real':
|
|
48860
|
+
return 'real';
|
|
48662
48861
|
case 'lógico':
|
|
48663
|
-
case 'logico':
|
|
48664
|
-
|
|
48665
|
-
|
|
48862
|
+
case 'logico':
|
|
48863
|
+
return 'logico';
|
|
48864
|
+
case 'caracter':
|
|
48865
|
+
return 'caracter';
|
|
48866
|
+
default:
|
|
48867
|
+
return tipo;
|
|
48666
48868
|
}
|
|
48667
48869
|
}
|
|
48668
48870
|
valorPadraoPorTipo(tipo) {
|
|
48669
48871
|
switch (tipo) {
|
|
48670
|
-
case 'inteiro':
|
|
48671
|
-
|
|
48672
|
-
case '
|
|
48872
|
+
case 'inteiro':
|
|
48873
|
+
return '0';
|
|
48874
|
+
case 'texto':
|
|
48875
|
+
return "''";
|
|
48876
|
+
case 'real':
|
|
48877
|
+
return '0.0';
|
|
48673
48878
|
case 'lógico':
|
|
48674
|
-
case 'logico':
|
|
48675
|
-
|
|
48676
|
-
|
|
48879
|
+
case 'logico':
|
|
48880
|
+
return 'falso';
|
|
48881
|
+
case 'caracter':
|
|
48882
|
+
return "' '";
|
|
48883
|
+
default:
|
|
48884
|
+
return 'nulo';
|
|
48677
48885
|
}
|
|
48678
48886
|
}
|
|
48679
48887
|
traduzirDeclaracaoVar(declaracaoVar) {
|
|
@@ -48766,9 +48974,7 @@ class TradutorPortugolIpt {
|
|
|
48766
48974
|
init = this.traduzirDeclaracao(ini);
|
|
48767
48975
|
}
|
|
48768
48976
|
}
|
|
48769
|
-
const cond = declaracaoPara.condicao
|
|
48770
|
-
? this.traduzirConstruto(declaracaoPara.condicao)
|
|
48771
|
-
: '';
|
|
48977
|
+
const cond = declaracaoPara.condicao ? this.traduzirConstruto(declaracaoPara.condicao) : '';
|
|
48772
48978
|
const incr = declaracaoPara.incrementar
|
|
48773
48979
|
? this.traduzirConstruto(declaracaoPara.incrementar)
|
|
48774
48980
|
: '';
|
|
@@ -48788,7 +48994,8 @@ class TradutorPortugolIpt {
|
|
|
48788
48994
|
this.indentacao += 4;
|
|
48789
48995
|
if (caminho.condicoes && caminho.condicoes.length > 0) {
|
|
48790
48996
|
for (const cond of caminho.condicoes) {
|
|
48791
|
-
resultado +=
|
|
48997
|
+
resultado +=
|
|
48998
|
+
' '.repeat(this.indentacao) + `caso ${this.traduzirConstruto(cond)}:\n`;
|
|
48792
48999
|
}
|
|
48793
49000
|
}
|
|
48794
49001
|
else {
|
|
@@ -49802,7 +50009,9 @@ class TradutorReversoCalango {
|
|
|
49802
50009
|
.map((parametro) => this.traduzirParametro(parametro))
|
|
49803
50010
|
.filter((p) => p)
|
|
49804
50011
|
.join(', ');
|
|
49805
|
-
const tipoRetorno = declaracaoFuncao.tipo &&
|
|
50012
|
+
const tipoRetorno = declaracaoFuncao.tipo &&
|
|
50013
|
+
declaracaoFuncao.tipo !== 'qualquer' &&
|
|
50014
|
+
declaracaoFuncao.tipo !== 'vazio'
|
|
49806
50015
|
? `: ${declaracaoFuncao.tipo}`
|
|
49807
50016
|
: '';
|
|
49808
50017
|
let resultado = `funcao ${declaracaoFuncao.simbolo.lexema}(${parametros})${tipoRetorno} `;
|
|
@@ -50330,10 +50539,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50330
50539
|
return node.text;
|
|
50331
50540
|
}
|
|
50332
50541
|
visitFile_input(ctx) {
|
|
50333
|
-
return ctx
|
|
50542
|
+
return ctx
|
|
50543
|
+
.stmt()
|
|
50544
|
+
.map((s) => this.visit(s))
|
|
50545
|
+
.join('\n');
|
|
50334
50546
|
}
|
|
50335
50547
|
visitSimple_stmt(ctx) {
|
|
50336
|
-
return ctx
|
|
50548
|
+
return ctx
|
|
50549
|
+
.small_stmt()
|
|
50550
|
+
.map((s) => this.visit(s))
|
|
50551
|
+
.join('; ');
|
|
50337
50552
|
}
|
|
50338
50553
|
visitExpr_stmt(ctx) {
|
|
50339
50554
|
const lhs = this.visit(ctx.testlist_star_expr());
|
|
@@ -50348,11 +50563,7 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50348
50563
|
const op = this.visitAugassign(ctx.augassign());
|
|
50349
50564
|
const testlist = ctx.testlist();
|
|
50350
50565
|
const yieldExpr = ctx.yield_expr();
|
|
50351
|
-
const rhs = testlist
|
|
50352
|
-
? this.visit(testlist)
|
|
50353
|
-
: yieldExpr
|
|
50354
|
-
? this.visit(yieldExpr)
|
|
50355
|
-
: '';
|
|
50566
|
+
const rhs = testlist ? this.visit(testlist) : yieldExpr ? this.visit(yieldExpr) : '';
|
|
50356
50567
|
return `${lhs} ${op} ${rhs}`;
|
|
50357
50568
|
}
|
|
50358
50569
|
return lhs;
|
|
@@ -50389,10 +50600,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50389
50600
|
return ctx.text;
|
|
50390
50601
|
}
|
|
50391
50602
|
visitTestlist_star_expr(ctx) {
|
|
50392
|
-
return ctx
|
|
50603
|
+
return ctx
|
|
50604
|
+
.test()
|
|
50605
|
+
.map((t) => this.visit(t))
|
|
50606
|
+
.join(', ');
|
|
50393
50607
|
}
|
|
50394
50608
|
visitTestlist(ctx) {
|
|
50395
|
-
return ctx
|
|
50609
|
+
return ctx
|
|
50610
|
+
.test()
|
|
50611
|
+
.map((t) => this.visit(t))
|
|
50612
|
+
.join(', ');
|
|
50396
50613
|
}
|
|
50397
50614
|
visitTest(ctx) {
|
|
50398
50615
|
const orTests = ctx.or_test();
|
|
@@ -50405,10 +50622,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50405
50622
|
return this.visitChildren(ctx);
|
|
50406
50623
|
}
|
|
50407
50624
|
visitOr_test(ctx) {
|
|
50408
|
-
return ctx
|
|
50625
|
+
return ctx
|
|
50626
|
+
.and_test()
|
|
50627
|
+
.map((t) => this.visit(t))
|
|
50628
|
+
.join(' ou ');
|
|
50409
50629
|
}
|
|
50410
50630
|
visitAnd_test(ctx) {
|
|
50411
|
-
return ctx
|
|
50631
|
+
return ctx
|
|
50632
|
+
.not_test()
|
|
50633
|
+
.map((t) => this.visit(t))
|
|
50634
|
+
.join(' e ');
|
|
50412
50635
|
}
|
|
50413
50636
|
visitNot_test(ctx) {
|
|
50414
50637
|
if (ctx.NOT()) {
|
|
@@ -50594,7 +50817,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50594
50817
|
return ctx.text;
|
|
50595
50818
|
}
|
|
50596
50819
|
visitArglist(ctx) {
|
|
50597
|
-
return ctx
|
|
50820
|
+
return ctx
|
|
50821
|
+
.argument()
|
|
50822
|
+
.map((a) => this.visit(a))
|
|
50823
|
+
.join(', ');
|
|
50598
50824
|
}
|
|
50599
50825
|
visitArgument(ctx) {
|
|
50600
50826
|
const testes = ctx.test();
|
|
@@ -50612,7 +50838,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50612
50838
|
if (compFor) {
|
|
50613
50839
|
return this.traduzirCompreensao(ctx.test(0), compFor);
|
|
50614
50840
|
}
|
|
50615
|
-
return ctx
|
|
50841
|
+
return ctx
|
|
50842
|
+
.test()
|
|
50843
|
+
.map((t) => this.visit(t))
|
|
50844
|
+
.join(', ');
|
|
50616
50845
|
}
|
|
50617
50846
|
traduzirCompreensao(exprCtx, compFor) {
|
|
50618
50847
|
const variavel = this.visit(compFor.exprlist());
|
|
@@ -50669,7 +50898,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50669
50898
|
return tests.map((t) => this.visit(t)).join(', ');
|
|
50670
50899
|
}
|
|
50671
50900
|
visitSubscriptlist(ctx) {
|
|
50672
|
-
return ctx
|
|
50901
|
+
return ctx
|
|
50902
|
+
.subscript()
|
|
50903
|
+
.map((s) => this.visitSubscript(s))
|
|
50904
|
+
.join(', ');
|
|
50673
50905
|
}
|
|
50674
50906
|
visitSubscript(ctx) {
|
|
50675
50907
|
const tests = ctx.test();
|