@designliquido/delegua 1.18.2 → 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 +2 -0
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +90 -13
- 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 +435 -132
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
|
}
|
|
@@ -3874,6 +4013,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3874
4013
|
const propriedadeCorrespondente = tipoCorrespondente.propriedades[entidadeChamada.simbolo.lexema];
|
|
3875
4014
|
return propriedadeCorrespondente.tipo;
|
|
3876
4015
|
}
|
|
4016
|
+
// Chamada via 'isto': verificar métodos da classe em análise antes de checar primitivas.
|
|
4017
|
+
if (entidadeChamada.objeto instanceof construtos_1.Isto) {
|
|
4018
|
+
if (this.metodosClasseAtualEmAnalise) {
|
|
4019
|
+
const nomeMembro = entidadeChamada.simbolo.lexema;
|
|
4020
|
+
const metodo = this.metodosClasseAtualEmAnalise.find((m) => m.simbolo.lexema === nomeMembro);
|
|
4021
|
+
if (metodo) {
|
|
4022
|
+
return metodo.tipo || 'qualquer';
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
4025
|
+
return 'qualquer';
|
|
4026
|
+
}
|
|
3877
4027
|
// Este caso ocorre quando a variável/constante é do tipo 'qualquer',
|
|
3878
4028
|
// e a chamada normalmente é feita para uma primitiva.
|
|
3879
4029
|
// A inferência, portanto, ocorre pelo uso da primitiva.
|
|
@@ -4016,7 +4166,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4016
4166
|
}
|
|
4017
4167
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
4018
4168
|
const tipoOriginal = tipo; // Preserva o tipo antes da inferência
|
|
4019
|
-
tipo =
|
|
4169
|
+
tipo =
|
|
4170
|
+
this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
|
|
4020
4171
|
if (tipo !== 'dicionário') {
|
|
4021
4172
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
4022
4173
|
}
|
|
@@ -4084,7 +4235,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4084
4235
|
let retorno = [];
|
|
4085
4236
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
4086
4237
|
// Se tipo ainda não foi definido, infere.
|
|
4087
|
-
tipo =
|
|
4238
|
+
tipo =
|
|
4239
|
+
this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
|
|
4088
4240
|
if (tipo !== 'dicionário') {
|
|
4089
4241
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
4090
4242
|
}
|
|
@@ -4383,7 +4535,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4383
4535
|
}
|
|
4384
4536
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros do operador.");
|
|
4385
4537
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do operador.");
|
|
4386
|
-
const
|
|
4538
|
+
const indiceAberturaCorpoOp = this.atual - 1;
|
|
4539
|
+
const quantidadeErrosAntesCorpoOp = this.erros.length;
|
|
4540
|
+
let corpoOp = [];
|
|
4541
|
+
try {
|
|
4542
|
+
corpoOp = await this.blocoEscopo();
|
|
4543
|
+
}
|
|
4544
|
+
catch (erro) {
|
|
4545
|
+
this.erros.push(erro);
|
|
4546
|
+
}
|
|
4547
|
+
if (this.erros.length > quantidadeErrosAntesCorpoOp) {
|
|
4548
|
+
this.atual =
|
|
4549
|
+
this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoOp);
|
|
4550
|
+
corpoOp = [];
|
|
4551
|
+
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
4552
|
+
}
|
|
4387
4553
|
const corpoFuncaoOp = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloNomeMetodo.linha, paramsOp, corpoOp);
|
|
4388
4554
|
const metodoOp = new declaracoes_1.FuncaoDeclaracao(simboloNomeMetodo, corpoFuncaoOp);
|
|
4389
4555
|
metodoOp.estatico = ehEstatico;
|
|
@@ -4418,7 +4584,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4418
4584
|
// Método de classe estrangeira não pode ter corpo.
|
|
4419
4585
|
if (ehEstrangeira &&
|
|
4420
4586
|
this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
4421
|
-
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.');
|
|
4422
4588
|
}
|
|
4423
4589
|
// Método é abstrato quando: (a) está dentro de um bloco `abstrato {}`,
|
|
4424
4590
|
// ou (b) a classe é abstrata/estrangeira e o próximo token não é `{`.
|
|
@@ -4441,7 +4607,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4441
4607
|
// Método concreto: com corpo.
|
|
4442
4608
|
// Inferência de tipo de retorno igual a corpoDaFuncao().
|
|
4443
4609
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
|
|
4444
|
-
const
|
|
4610
|
+
const indiceAberturaCorpo = this.atual - 1;
|
|
4611
|
+
const quantidadeErrosAntesCorpo = this.erros.length;
|
|
4612
|
+
let corpo = [];
|
|
4613
|
+
try {
|
|
4614
|
+
corpo = await this.blocoEscopo();
|
|
4615
|
+
}
|
|
4616
|
+
catch (erro) {
|
|
4617
|
+
this.erros.push(erro);
|
|
4618
|
+
}
|
|
4619
|
+
if (this.erros.length > quantidadeErrosAntesCorpo) {
|
|
4620
|
+
this.atual =
|
|
4621
|
+
this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpo);
|
|
4622
|
+
corpo = [];
|
|
4623
|
+
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
4624
|
+
}
|
|
4445
4625
|
let expressoesRetorna = [];
|
|
4446
4626
|
for (const declaracao of corpo) {
|
|
4447
4627
|
expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
|
|
@@ -4507,7 +4687,20 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4507
4687
|
}
|
|
4508
4688
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros do acessor.");
|
|
4509
4689
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do acessor.");
|
|
4510
|
-
const
|
|
4690
|
+
const indiceAberturaCorpoAcessor = this.atual - 1;
|
|
4691
|
+
const quantidadeErrosAntesCorpoAcessor = this.erros.length;
|
|
4692
|
+
let corpoAcessor = [];
|
|
4693
|
+
try {
|
|
4694
|
+
corpoAcessor = await this.blocoEscopo();
|
|
4695
|
+
}
|
|
4696
|
+
catch (erro) {
|
|
4697
|
+
this.erros.push(erro);
|
|
4698
|
+
}
|
|
4699
|
+
if (this.erros.length > quantidadeErrosAntesCorpoAcessor) {
|
|
4700
|
+
this.atual = this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoAcessor);
|
|
4701
|
+
corpoAcessor = [];
|
|
4702
|
+
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
4703
|
+
}
|
|
4511
4704
|
// Inferência de tipo de retorno
|
|
4512
4705
|
let tipoAcessor = 'qualquer';
|
|
4513
4706
|
let expressoesRetornaAcessor = [];
|
|
@@ -4572,6 +4765,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4572
4765
|
}
|
|
4573
4766
|
}
|
|
4574
4767
|
};
|
|
4768
|
+
this.metodosClasseAtualEmAnalise = metodos;
|
|
4575
4769
|
await compreenderMembros('publico', false);
|
|
4576
4770
|
this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
4577
4771
|
// Verificação em tempo de análise: classe deve implementar todos os contratos das interfaces.
|
|
@@ -4630,6 +4824,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4630
4824
|
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstrangeira, ehEstatica, implementaInterfaces, mesclas);
|
|
4631
4825
|
this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
|
|
4632
4826
|
this.superclasseAtual = undefined;
|
|
4827
|
+
this.metodosClasseAtualEmAnalise = undefined;
|
|
4633
4828
|
return definicaoClasse;
|
|
4634
4829
|
}
|
|
4635
4830
|
/**
|
|
@@ -4777,6 +4972,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4777
4972
|
* @returns Sempre retorna `void`.
|
|
4778
4973
|
*/
|
|
4779
4974
|
sincronizar() {
|
|
4975
|
+
if (this.estaNoFinal()) {
|
|
4976
|
+
return;
|
|
4977
|
+
}
|
|
4780
4978
|
this.avancarEDevolverAnterior(); // avança além do token com erro
|
|
4781
4979
|
while (!this.estaNoFinal()) {
|
|
4782
4980
|
// Um ponto-e-vírgula já consumido indica fronteira limpa entre declarações.
|
|
@@ -4800,6 +4998,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4800
4998
|
this.avancarEDevolverAnterior();
|
|
4801
4999
|
}
|
|
4802
5000
|
}
|
|
5001
|
+
encontrarIndiceAposFechamentoDeBloco(indiceAbertura) {
|
|
5002
|
+
let aberturasPendentes = 1;
|
|
5003
|
+
for (let indice = indiceAbertura + 1; indice < this.simbolos.length; indice++) {
|
|
5004
|
+
if (this.simbolos[indice].tipo === delegua_2.default.CHAVE_ESQUERDA) {
|
|
5005
|
+
aberturasPendentes++;
|
|
5006
|
+
}
|
|
5007
|
+
else if (this.simbolos[indice].tipo === delegua_2.default.CHAVE_DIREITA) {
|
|
5008
|
+
aberturasPendentes--;
|
|
5009
|
+
if (aberturasPendentes === 0) {
|
|
5010
|
+
return indice + 1;
|
|
5011
|
+
}
|
|
5012
|
+
}
|
|
5013
|
+
}
|
|
5014
|
+
return this.simbolos.length;
|
|
5015
|
+
}
|
|
4803
5016
|
/**
|
|
4804
5017
|
* Todas as resoluções triviais da linguagem, ou seja, todas as
|
|
4805
5018
|
* resoluções que podem ocorrer dentro ou fora de um bloco.
|
|
@@ -6329,9 +6542,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6329
6542
|
}
|
|
6330
6543
|
// Modo formatação: {expressao:formato}
|
|
6331
6544
|
if (mioloLimpo.includes(':')) {
|
|
6332
|
-
const [variavel, formato] = mioloLimpo
|
|
6333
|
-
.split(':')
|
|
6334
|
-
.map(s => s.trim());
|
|
6545
|
+
const [variavel, formato] = mioloLimpo.split(':').map((s) => s.trim());
|
|
6335
6546
|
if (variavel) {
|
|
6336
6547
|
return `" + "{:${formato}}".formatar(${variavel}) + "`;
|
|
6337
6548
|
}
|
|
@@ -6455,8 +6666,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6455
6666
|
case pitugues_2.default.INTERPOLACAO:
|
|
6456
6667
|
const simboloInterpolacao = this.avancarEDevolverAnterior();
|
|
6457
6668
|
const conteudoOriginal = simboloInterpolacao.literal;
|
|
6458
|
-
const codigoTransformado = this
|
|
6459
|
-
.transformarInterpolacaoEmFormatacao(conteudoOriginal);
|
|
6669
|
+
const codigoTransformado = this.transformarInterpolacaoEmFormatacao(conteudoOriginal);
|
|
6460
6670
|
const microLexador = new micro_lexador_pitugues_1.MicroLexadorPitugues();
|
|
6461
6671
|
const retornoMicroLexador = microLexador.mapear(codigoTransformado);
|
|
6462
6672
|
const microAvaliadorSintatico = new micro_avaliador_sintatico_pitugues_1.MicroAvaliadorSintaticoPitugues();
|
|
@@ -6669,7 +6879,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6669
6879
|
while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
|
|
6670
6880
|
const operador = this.simbolos[this.atual - 1];
|
|
6671
6881
|
const expressaoOuCondicao = await this.seTernario();
|
|
6672
|
-
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:
|
|
6673
6883
|
${this.simbolos[this.atual].lexema}.`);
|
|
6674
6884
|
const expressaoSenao = await this.seTernario();
|
|
6675
6885
|
expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
|
|
@@ -7981,7 +8191,10 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
|
|
|
7981
8191
|
else if (this.verificarSeSimboloAtualEIgualA(portugol_ipt_1.default.DEFEITO)) {
|
|
7982
8192
|
this.consumir(portugol_ipt_1.default.DOIS_PONTOS, "Esperado ':' após 'defeito'.");
|
|
7983
8193
|
this.consumirQuebrasLinha();
|
|
7984
|
-
const bloco = await this.resolverBloco([
|
|
8194
|
+
const bloco = await this.resolverBloco([
|
|
8195
|
+
portugol_ipt_1.default.FIMESCOLHE,
|
|
8196
|
+
portugol_ipt_1.default.FIM,
|
|
8197
|
+
]);
|
|
7985
8198
|
caminhoPadrao = { condicoes: [], declaracoes: bloco.declaracoes };
|
|
7986
8199
|
}
|
|
7987
8200
|
else {
|
|
@@ -8710,11 +8923,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8710
8923
|
const simboloTente = this.simboloAnterior();
|
|
8711
8924
|
const blocoTente = [];
|
|
8712
8925
|
while (!this.estaNoFinal() &&
|
|
8713
|
-
![
|
|
8714
|
-
prisma_1.default.PEGUE,
|
|
8715
|
-
prisma_1.default.FINALMENTE,
|
|
8716
|
-
prisma_1.default.FIM,
|
|
8717
|
-
].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)) {
|
|
8718
8927
|
blocoTente.push(await this.resolverDeclaracaoForaDeBloco());
|
|
8719
8928
|
}
|
|
8720
8929
|
let blocoPegue = null;
|
|
@@ -8982,7 +9191,8 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8982
9191
|
this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
8983
9192
|
this.consumir(prisma_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
|
|
8984
9193
|
const declaracoesCorpo = [];
|
|
8985
|
-
while (!this.estaNoFinal() &&
|
|
9194
|
+
while (!this.estaNoFinal() &&
|
|
9195
|
+
!this.verificarTipoSimboloAtual(prisma_1.default.CHAVE_DIREITA)) {
|
|
8986
9196
|
declaracoesCorpo.push(await this.resolverDeclaracaoForaDeBloco());
|
|
8987
9197
|
}
|
|
8988
9198
|
this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após o corpo do método.");
|
|
@@ -19332,7 +19542,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
19332
19542
|
this.eInicializador = eInicializador;
|
|
19333
19543
|
}
|
|
19334
19544
|
aridade() {
|
|
19335
|
-
return this.declaracao?.parametros?.filter(p => p.abrangencia !== 'multiplo').length || 0;
|
|
19545
|
+
return this.declaracao?.parametros?.filter((p) => p.abrangencia !== 'multiplo').length || 0;
|
|
19336
19546
|
}
|
|
19337
19547
|
/**
|
|
19338
19548
|
* Método utilizado por Delégua para representar esta função quando impressa.
|
|
@@ -20752,7 +20962,8 @@ class InterpretadorBase {
|
|
|
20752
20962
|
];
|
|
20753
20963
|
const valores = [];
|
|
20754
20964
|
for (let propriedade of propriedadesValidas) {
|
|
20755
|
-
if (expressao.hasOwnProperty(propriedade) &&
|
|
20965
|
+
if (expressao.hasOwnProperty(propriedade) &&
|
|
20966
|
+
expressao[propriedade] !== undefined) {
|
|
20756
20967
|
const valor = await this.avaliar(expressao[propriedade]);
|
|
20757
20968
|
valores.push(valor);
|
|
20758
20969
|
}
|
|
@@ -21101,7 +21312,9 @@ class InterpretadorBase {
|
|
|
21101
21312
|
valor: valorDireito,
|
|
21102
21313
|
imutavel: false,
|
|
21103
21314
|
};
|
|
21104
|
-
return await metodoASerChamado.chamar(this, [
|
|
21315
|
+
return await metodoASerChamado.chamar(this, [
|
|
21316
|
+
{ nome: null, valor: argumentoOperador },
|
|
21317
|
+
]);
|
|
21105
21318
|
}
|
|
21106
21319
|
}
|
|
21107
21320
|
const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
|
|
@@ -21115,7 +21328,8 @@ class InterpretadorBase {
|
|
|
21115
21328
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21116
21329
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21117
21330
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21118
|
-
return this.converterParaBigInt(valorEsquerdo) **
|
|
21331
|
+
return (this.converterParaBigInt(valorEsquerdo) **
|
|
21332
|
+
this.converterParaBigInt(valorDireito));
|
|
21119
21333
|
}
|
|
21120
21334
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
21121
21335
|
return resultadoExponenciacao;
|
|
@@ -21142,7 +21356,8 @@ class InterpretadorBase {
|
|
|
21142
21356
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21143
21357
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21144
21358
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21145
|
-
return this.converterParaBigInt(valorEsquerdo) -
|
|
21359
|
+
return (this.converterParaBigInt(valorEsquerdo) -
|
|
21360
|
+
this.converterParaBigInt(valorDireito));
|
|
21146
21361
|
}
|
|
21147
21362
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
21148
21363
|
case delegua_1.default.ADICAO:
|
|
@@ -21177,8 +21392,10 @@ class InterpretadorBase {
|
|
|
21177
21392
|
}
|
|
21178
21393
|
// TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
|
|
21179
21394
|
// tradicionais do JavaScript?
|
|
21180
|
-
if (tipoEsquerdo === 'qualquer' ||
|
|
21181
|
-
|
|
21395
|
+
if (tipoEsquerdo === 'qualquer' ||
|
|
21396
|
+
tipoDireito === 'qualquer' ||
|
|
21397
|
+
tipoEsquerdo === 'nulo' ||
|
|
21398
|
+
tipoDireito === 'nulo') {
|
|
21182
21399
|
return valorEsquerdo + valorDireito;
|
|
21183
21400
|
}
|
|
21184
21401
|
return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
|
|
@@ -21267,7 +21484,8 @@ class InterpretadorBase {
|
|
|
21267
21484
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21268
21485
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21269
21486
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21270
|
-
return this.converterParaBigInt(valorEsquerdo) &
|
|
21487
|
+
return (this.converterParaBigInt(valorEsquerdo) &
|
|
21488
|
+
this.converterParaBigInt(valorDireito));
|
|
21271
21489
|
}
|
|
21272
21490
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
21273
21491
|
case delegua_1.default.CIRCUMFLEXO:
|
|
@@ -21277,7 +21495,8 @@ class InterpretadorBase {
|
|
|
21277
21495
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21278
21496
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21279
21497
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21280
|
-
return this.converterParaBigInt(valorEsquerdo) ^
|
|
21498
|
+
return (this.converterParaBigInt(valorEsquerdo) ^
|
|
21499
|
+
this.converterParaBigInt(valorDireito));
|
|
21281
21500
|
}
|
|
21282
21501
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
21283
21502
|
case delegua_1.default.BIT_OR:
|
|
@@ -21287,21 +21506,28 @@ class InterpretadorBase {
|
|
|
21287
21506
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21288
21507
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
21289
21508
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
21290
|
-
return this.converterParaBigInt(valorEsquerdo) |
|
|
21509
|
+
return (this.converterParaBigInt(valorEsquerdo) |
|
|
21510
|
+
this.converterParaBigInt(valorDireito));
|
|
21291
21511
|
}
|
|
21292
21512
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
21293
21513
|
case delegua_1.default.MENOR_MENOR:
|
|
21294
21514
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21295
21515
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
21296
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
21297
|
-
|
|
21516
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
21517
|
+
typeof valorDireito === 'bigint' ||
|
|
21518
|
+
Number(valorDireito) >= 32) {
|
|
21519
|
+
return (this.converterParaBigInt(valorEsquerdo) <<
|
|
21520
|
+
this.converterParaBigInt(valorDireito));
|
|
21298
21521
|
}
|
|
21299
21522
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
21300
21523
|
case delegua_1.default.MAIOR_MAIOR:
|
|
21301
21524
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
21302
21525
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
21303
|
-
if (typeof valorEsquerdo === 'bigint' ||
|
|
21304
|
-
|
|
21526
|
+
if (typeof valorEsquerdo === 'bigint' ||
|
|
21527
|
+
typeof valorDireito === 'bigint' ||
|
|
21528
|
+
Number(valorDireito) >= 32) {
|
|
21529
|
+
return (this.converterParaBigInt(valorEsquerdo) >>
|
|
21530
|
+
this.converterParaBigInt(valorDireito));
|
|
21305
21531
|
}
|
|
21306
21532
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
21307
21533
|
case delegua_1.default.DIFERENTE:
|
|
@@ -23448,7 +23674,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23448
23674
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23449
23675
|
if (objeto.constructor === Object) {
|
|
23450
23676
|
if (expressao.nomeMetodo in primitivas_dicionario_1.default) {
|
|
23451
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomeMetodo]
|
|
23677
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomeMetodo]
|
|
23678
|
+
.implementacao;
|
|
23452
23679
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.nomeMetodo, 'dicionário');
|
|
23453
23680
|
}
|
|
23454
23681
|
return objeto[expressao.nomeMetodo] || null;
|
|
@@ -23487,7 +23714,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23487
23714
|
case delegua_1.default.NUMERO:
|
|
23488
23715
|
case delegua_1.default.NÚMERO:
|
|
23489
23716
|
if (expressao.nomeMetodo in primitivas_numero_1.default) {
|
|
23490
|
-
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.nomeMetodo]
|
|
23717
|
+
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.nomeMetodo]
|
|
23718
|
+
.implementacao;
|
|
23491
23719
|
if (metodoDePrimitivaNumero) {
|
|
23492
23720
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaNumero, expressao.nomeMetodo, tipoObjeto);
|
|
23493
23721
|
}
|
|
@@ -23500,7 +23728,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23500
23728
|
break;
|
|
23501
23729
|
case delegua_1.default.TEXTO:
|
|
23502
23730
|
if (expressao.nomeMetodo in primitivas_texto_1.default) {
|
|
23503
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.nomeMetodo]
|
|
23731
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.nomeMetodo]
|
|
23732
|
+
.implementacao;
|
|
23504
23733
|
if (metodoDePrimitivaTexto) {
|
|
23505
23734
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.nomeMetodo, 'texto');
|
|
23506
23735
|
}
|
|
@@ -23520,7 +23749,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23520
23749
|
case delegua_1.default.VETOR_QUALQUER:
|
|
23521
23750
|
case delegua_1.default.VETOR_TEXTO:
|
|
23522
23751
|
if (expressao.nomeMetodo in primitivas_vetor_1.default) {
|
|
23523
|
-
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.nomeMetodo]
|
|
23752
|
+
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.nomeMetodo]
|
|
23753
|
+
.implementacao;
|
|
23524
23754
|
if (metodoDePrimitivaVetor) {
|
|
23525
23755
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaVetor, expressao.nomeMetodo, tipoObjeto);
|
|
23526
23756
|
}
|
|
@@ -23621,7 +23851,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23621
23851
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23622
23852
|
if (objeto.constructor === Object) {
|
|
23623
23853
|
if (expressao.simbolo.lexema in primitivas_dicionario_1.default) {
|
|
23624
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema]
|
|
23854
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema]
|
|
23855
|
+
.implementacao;
|
|
23625
23856
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.simbolo.lexema, 'dicionário');
|
|
23626
23857
|
}
|
|
23627
23858
|
return objeto[expressao.simbolo.lexema];
|
|
@@ -23634,7 +23865,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23634
23865
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23635
23866
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo texto.`);
|
|
23636
23867
|
}
|
|
23637
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23868
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23869
|
+
.implementacao;
|
|
23638
23870
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.simbolo.lexema, 'texto');
|
|
23639
23871
|
}
|
|
23640
23872
|
// A partir daqui, presume-se que o objeto é uma das estruturas
|
|
@@ -23659,7 +23891,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23659
23891
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23660
23892
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23661
23893
|
}
|
|
23662
|
-
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema]
|
|
23894
|
+
const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema]
|
|
23895
|
+
.implementacao;
|
|
23663
23896
|
if (metodoDePrimitivaNumero) {
|
|
23664
23897
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaNumero, expressao.simbolo.lexema, 'número');
|
|
23665
23898
|
}
|
|
@@ -23672,7 +23905,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23672
23905
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23673
23906
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23674
23907
|
}
|
|
23675
|
-
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23908
|
+
const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema]
|
|
23909
|
+
.implementacao;
|
|
23676
23910
|
if (metodoDePrimitivaTexto) {
|
|
23677
23911
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto, expressao.simbolo.lexema, 'texto');
|
|
23678
23912
|
}
|
|
@@ -23692,7 +23926,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23692
23926
|
return funcaoExt.funcaoPorExtensao(objeto);
|
|
23693
23927
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
|
|
23694
23928
|
}
|
|
23695
|
-
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema]
|
|
23929
|
+
const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema]
|
|
23930
|
+
.implementacao;
|
|
23696
23931
|
if (metodoDePrimitivaVetor) {
|
|
23697
23932
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaVetor, expressao.simbolo.lexema, tipoObjeto);
|
|
23698
23933
|
}
|
|
@@ -23740,7 +23975,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23740
23975
|
// Objeto simples do JavaScript, ou dicionário de Delégua.
|
|
23741
23976
|
if (objeto.constructor === Object) {
|
|
23742
23977
|
if (expressao.nomePropriedade in primitivas_dicionario_1.default) {
|
|
23743
|
-
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade]
|
|
23978
|
+
const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade]
|
|
23979
|
+
.implementacao;
|
|
23744
23980
|
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario, expressao.nomePropriedade, 'dicionário');
|
|
23745
23981
|
}
|
|
23746
23982
|
return objeto[expressao.nomePropriedade] || null;
|
|
@@ -24416,9 +24652,9 @@ class PilhaEscoposExecucao {
|
|
|
24416
24652
|
}
|
|
24417
24653
|
espacoMemoriaAncestral.valores[simbolo.lexema] = {
|
|
24418
24654
|
valor,
|
|
24419
|
-
tipo:
|
|
24655
|
+
tipo: variavel.tipo === 'nulo' && !variavel.tipoExplicito
|
|
24420
24656
|
? (0, inferenciador_1.inferirTipoVariavel)(valor)
|
|
24421
|
-
:
|
|
24657
|
+
: variavel.tipo || (0, inferenciador_1.inferirTipoVariavel)(valor),
|
|
24422
24658
|
imutavel: false,
|
|
24423
24659
|
tipoExplicito: variavel.tipoExplicito,
|
|
24424
24660
|
};
|
|
@@ -24439,9 +24675,7 @@ class PilhaEscoposExecucao {
|
|
|
24439
24675
|
}
|
|
24440
24676
|
const tipoAtual = variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : null;
|
|
24441
24677
|
const deveLiberarTipo = tipoAtual === 'nulo' && !variavel.tipoExplicito;
|
|
24442
|
-
const tipoInferido = tipoAtual && !deveLiberarTipo
|
|
24443
|
-
? tipoAtual
|
|
24444
|
-
: (0, inferenciador_1.inferirTipoVariavel)(valor);
|
|
24678
|
+
const tipoInferido = tipoAtual && !deveLiberarTipo ? tipoAtual : (0, inferenciador_1.inferirTipoVariavel)(valor);
|
|
24445
24679
|
const tipo = (tipoInferido || 'objeto').toLowerCase();
|
|
24446
24680
|
const valorResolvido = this.converterValor(tipo, valor);
|
|
24447
24681
|
if (indice !== undefined && indice !== null) {
|
|
@@ -24713,7 +24947,9 @@ class LexadorCalango {
|
|
|
24713
24947
|
const linhaPrimeiroCaracter = this.linha;
|
|
24714
24948
|
// Restringe leitura à linha atual (como analisarNumero), evitando
|
|
24715
24949
|
// que avancar() mude this.linha e corrompa o cálculo do substring.
|
|
24716
|
-
while (this.simboloAtual() !== "'" &&
|
|
24950
|
+
while (this.simboloAtual() !== "'" &&
|
|
24951
|
+
this.linha === linhaPrimeiroCaracter &&
|
|
24952
|
+
!this.eFinalDoCodigo()) {
|
|
24717
24953
|
this.avancar();
|
|
24718
24954
|
}
|
|
24719
24955
|
if (this.linha !== linhaPrimeiroCaracter || this.eFinalDoCodigo()) {
|
|
@@ -27789,10 +28025,12 @@ class Lexador {
|
|
|
27789
28025
|
break;
|
|
27790
28026
|
}
|
|
27791
28027
|
}
|
|
27792
|
-
valor +=
|
|
28028
|
+
valor +=
|
|
28029
|
+
hex.length === 2 ? String.fromCharCode(parseInt(hex, 16)) : '\\x' + hex;
|
|
27793
28030
|
break;
|
|
27794
28031
|
}
|
|
27795
|
-
case '\0':
|
|
28032
|
+
case '\0':
|
|
28033
|
+
break; // barra invertida no fim de linha: ignora e continua na próxima linha
|
|
27796
28034
|
default:
|
|
27797
28035
|
valor += '\\' + proximoCaractere;
|
|
27798
28036
|
break;
|
|
@@ -45904,13 +46142,19 @@ class TradutorElixir {
|
|
|
45904
46142
|
}
|
|
45905
46143
|
mapearTipoParaTypespec(tipo) {
|
|
45906
46144
|
switch (tipo) {
|
|
45907
|
-
case 'texto':
|
|
46145
|
+
case 'texto':
|
|
46146
|
+
return 'String.t()';
|
|
45908
46147
|
case 'numero':
|
|
45909
|
-
case 'inteiro':
|
|
45910
|
-
|
|
45911
|
-
case '
|
|
45912
|
-
|
|
45913
|
-
|
|
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()';
|
|
45914
46158
|
}
|
|
45915
46159
|
}
|
|
45916
46160
|
/**
|
|
@@ -45999,11 +46243,15 @@ class TradutorElixir {
|
|
|
45999
46243
|
this.moduloAtual = nomeModulo;
|
|
46000
46244
|
if (declaracao.estrangeira) {
|
|
46001
46245
|
// Classe estrangeira: emitir @callback para cada método, definindo a interface esperada do módulo.
|
|
46002
|
-
resultado +=
|
|
46246
|
+
resultado +=
|
|
46247
|
+
this.adicionarIndentacao() +
|
|
46248
|
+
`@moduledoc "Classe estrangeira — implementação externa."\n`;
|
|
46003
46249
|
for (const metodo of declaracao.metodos) {
|
|
46004
46250
|
const params = metodo.funcao.parametros.map(() => 'term()').join(', ');
|
|
46005
46251
|
const retorno = this.mapearTipoParaTypespec(metodo.funcao.tipo);
|
|
46006
|
-
resultado +=
|
|
46252
|
+
resultado +=
|
|
46253
|
+
this.adicionarIndentacao() +
|
|
46254
|
+
`@callback ${metodo.simbolo.lexema}(${params}) :: ${retorno}\n`;
|
|
46007
46255
|
}
|
|
46008
46256
|
}
|
|
46009
46257
|
else {
|
|
@@ -48480,22 +48728,38 @@ class TradutorPortugolIpt {
|
|
|
48480
48728
|
// ── Operadores ───────────────────────────────────────────────────────────────
|
|
48481
48729
|
traduzirOperador(tipo) {
|
|
48482
48730
|
switch (tipo) {
|
|
48483
|
-
case portugol_ipt_1.default.ADICAO:
|
|
48484
|
-
|
|
48485
|
-
case portugol_ipt_1.default.
|
|
48486
|
-
|
|
48487
|
-
case portugol_ipt_1.default.
|
|
48488
|
-
|
|
48489
|
-
case portugol_ipt_1.default.
|
|
48490
|
-
|
|
48491
|
-
case portugol_ipt_1.default.
|
|
48492
|
-
|
|
48493
|
-
case portugol_ipt_1.default.
|
|
48494
|
-
|
|
48495
|
-
case portugol_ipt_1.default.
|
|
48496
|
-
|
|
48497
|
-
case portugol_ipt_1.default.
|
|
48498
|
-
|
|
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;
|
|
48499
48763
|
}
|
|
48500
48764
|
}
|
|
48501
48765
|
// ── Construtos ───────────────────────────────────────────────────────────────
|
|
@@ -48537,10 +48801,13 @@ class TradutorPortugolIpt {
|
|
|
48537
48801
|
traduzirConstrutoUnario(unario) {
|
|
48538
48802
|
const operando = this.traduzirConstruto(unario.operando);
|
|
48539
48803
|
switch (unario.operador.tipo) {
|
|
48540
|
-
case portugol_ipt_1.default.SUBTRACAO:
|
|
48804
|
+
case portugol_ipt_1.default.SUBTRACAO:
|
|
48805
|
+
return `-${operando}`;
|
|
48541
48806
|
case portugol_ipt_1.default.NEGACAO:
|
|
48542
|
-
case portugol_ipt_1.default.NAO:
|
|
48543
|
-
|
|
48807
|
+
case portugol_ipt_1.default.NAO:
|
|
48808
|
+
return `!(${operando})`;
|
|
48809
|
+
default:
|
|
48810
|
+
return `!(${operando})`;
|
|
48544
48811
|
}
|
|
48545
48812
|
}
|
|
48546
48813
|
traduzirConstrutoAtribuir(atribuir) {
|
|
@@ -48585,24 +48852,36 @@ class TradutorPortugolIpt {
|
|
|
48585
48852
|
}
|
|
48586
48853
|
tipoParaDelégua(tipo) {
|
|
48587
48854
|
switch (tipo) {
|
|
48588
|
-
case 'inteiro':
|
|
48589
|
-
|
|
48590
|
-
case '
|
|
48855
|
+
case 'inteiro':
|
|
48856
|
+
return 'inteiro';
|
|
48857
|
+
case 'texto':
|
|
48858
|
+
return 'texto';
|
|
48859
|
+
case 'real':
|
|
48860
|
+
return 'real';
|
|
48591
48861
|
case 'lógico':
|
|
48592
|
-
case 'logico':
|
|
48593
|
-
|
|
48594
|
-
|
|
48862
|
+
case 'logico':
|
|
48863
|
+
return 'logico';
|
|
48864
|
+
case 'caracter':
|
|
48865
|
+
return 'caracter';
|
|
48866
|
+
default:
|
|
48867
|
+
return tipo;
|
|
48595
48868
|
}
|
|
48596
48869
|
}
|
|
48597
48870
|
valorPadraoPorTipo(tipo) {
|
|
48598
48871
|
switch (tipo) {
|
|
48599
|
-
case 'inteiro':
|
|
48600
|
-
|
|
48601
|
-
case '
|
|
48872
|
+
case 'inteiro':
|
|
48873
|
+
return '0';
|
|
48874
|
+
case 'texto':
|
|
48875
|
+
return "''";
|
|
48876
|
+
case 'real':
|
|
48877
|
+
return '0.0';
|
|
48602
48878
|
case 'lógico':
|
|
48603
|
-
case 'logico':
|
|
48604
|
-
|
|
48605
|
-
|
|
48879
|
+
case 'logico':
|
|
48880
|
+
return 'falso';
|
|
48881
|
+
case 'caracter':
|
|
48882
|
+
return "' '";
|
|
48883
|
+
default:
|
|
48884
|
+
return 'nulo';
|
|
48606
48885
|
}
|
|
48607
48886
|
}
|
|
48608
48887
|
traduzirDeclaracaoVar(declaracaoVar) {
|
|
@@ -48695,9 +48974,7 @@ class TradutorPortugolIpt {
|
|
|
48695
48974
|
init = this.traduzirDeclaracao(ini);
|
|
48696
48975
|
}
|
|
48697
48976
|
}
|
|
48698
|
-
const cond = declaracaoPara.condicao
|
|
48699
|
-
? this.traduzirConstruto(declaracaoPara.condicao)
|
|
48700
|
-
: '';
|
|
48977
|
+
const cond = declaracaoPara.condicao ? this.traduzirConstruto(declaracaoPara.condicao) : '';
|
|
48701
48978
|
const incr = declaracaoPara.incrementar
|
|
48702
48979
|
? this.traduzirConstruto(declaracaoPara.incrementar)
|
|
48703
48980
|
: '';
|
|
@@ -48717,7 +48994,8 @@ class TradutorPortugolIpt {
|
|
|
48717
48994
|
this.indentacao += 4;
|
|
48718
48995
|
if (caminho.condicoes && caminho.condicoes.length > 0) {
|
|
48719
48996
|
for (const cond of caminho.condicoes) {
|
|
48720
|
-
resultado +=
|
|
48997
|
+
resultado +=
|
|
48998
|
+
' '.repeat(this.indentacao) + `caso ${this.traduzirConstruto(cond)}:\n`;
|
|
48721
48999
|
}
|
|
48722
49000
|
}
|
|
48723
49001
|
else {
|
|
@@ -49731,7 +50009,9 @@ class TradutorReversoCalango {
|
|
|
49731
50009
|
.map((parametro) => this.traduzirParametro(parametro))
|
|
49732
50010
|
.filter((p) => p)
|
|
49733
50011
|
.join(', ');
|
|
49734
|
-
const tipoRetorno = declaracaoFuncao.tipo &&
|
|
50012
|
+
const tipoRetorno = declaracaoFuncao.tipo &&
|
|
50013
|
+
declaracaoFuncao.tipo !== 'qualquer' &&
|
|
50014
|
+
declaracaoFuncao.tipo !== 'vazio'
|
|
49735
50015
|
? `: ${declaracaoFuncao.tipo}`
|
|
49736
50016
|
: '';
|
|
49737
50017
|
let resultado = `funcao ${declaracaoFuncao.simbolo.lexema}(${parametros})${tipoRetorno} `;
|
|
@@ -50259,10 +50539,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50259
50539
|
return node.text;
|
|
50260
50540
|
}
|
|
50261
50541
|
visitFile_input(ctx) {
|
|
50262
|
-
return ctx
|
|
50542
|
+
return ctx
|
|
50543
|
+
.stmt()
|
|
50544
|
+
.map((s) => this.visit(s))
|
|
50545
|
+
.join('\n');
|
|
50263
50546
|
}
|
|
50264
50547
|
visitSimple_stmt(ctx) {
|
|
50265
|
-
return ctx
|
|
50548
|
+
return ctx
|
|
50549
|
+
.small_stmt()
|
|
50550
|
+
.map((s) => this.visit(s))
|
|
50551
|
+
.join('; ');
|
|
50266
50552
|
}
|
|
50267
50553
|
visitExpr_stmt(ctx) {
|
|
50268
50554
|
const lhs = this.visit(ctx.testlist_star_expr());
|
|
@@ -50277,11 +50563,7 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50277
50563
|
const op = this.visitAugassign(ctx.augassign());
|
|
50278
50564
|
const testlist = ctx.testlist();
|
|
50279
50565
|
const yieldExpr = ctx.yield_expr();
|
|
50280
|
-
const rhs = testlist
|
|
50281
|
-
? this.visit(testlist)
|
|
50282
|
-
: yieldExpr
|
|
50283
|
-
? this.visit(yieldExpr)
|
|
50284
|
-
: '';
|
|
50566
|
+
const rhs = testlist ? this.visit(testlist) : yieldExpr ? this.visit(yieldExpr) : '';
|
|
50285
50567
|
return `${lhs} ${op} ${rhs}`;
|
|
50286
50568
|
}
|
|
50287
50569
|
return lhs;
|
|
@@ -50318,10 +50600,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50318
50600
|
return ctx.text;
|
|
50319
50601
|
}
|
|
50320
50602
|
visitTestlist_star_expr(ctx) {
|
|
50321
|
-
return ctx
|
|
50603
|
+
return ctx
|
|
50604
|
+
.test()
|
|
50605
|
+
.map((t) => this.visit(t))
|
|
50606
|
+
.join(', ');
|
|
50322
50607
|
}
|
|
50323
50608
|
visitTestlist(ctx) {
|
|
50324
|
-
return ctx
|
|
50609
|
+
return ctx
|
|
50610
|
+
.test()
|
|
50611
|
+
.map((t) => this.visit(t))
|
|
50612
|
+
.join(', ');
|
|
50325
50613
|
}
|
|
50326
50614
|
visitTest(ctx) {
|
|
50327
50615
|
const orTests = ctx.or_test();
|
|
@@ -50334,10 +50622,16 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50334
50622
|
return this.visitChildren(ctx);
|
|
50335
50623
|
}
|
|
50336
50624
|
visitOr_test(ctx) {
|
|
50337
|
-
return ctx
|
|
50625
|
+
return ctx
|
|
50626
|
+
.and_test()
|
|
50627
|
+
.map((t) => this.visit(t))
|
|
50628
|
+
.join(' ou ');
|
|
50338
50629
|
}
|
|
50339
50630
|
visitAnd_test(ctx) {
|
|
50340
|
-
return ctx
|
|
50631
|
+
return ctx
|
|
50632
|
+
.not_test()
|
|
50633
|
+
.map((t) => this.visit(t))
|
|
50634
|
+
.join(' e ');
|
|
50341
50635
|
}
|
|
50342
50636
|
visitNot_test(ctx) {
|
|
50343
50637
|
if (ctx.NOT()) {
|
|
@@ -50523,7 +50817,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50523
50817
|
return ctx.text;
|
|
50524
50818
|
}
|
|
50525
50819
|
visitArglist(ctx) {
|
|
50526
|
-
return ctx
|
|
50820
|
+
return ctx
|
|
50821
|
+
.argument()
|
|
50822
|
+
.map((a) => this.visit(a))
|
|
50823
|
+
.join(', ');
|
|
50527
50824
|
}
|
|
50528
50825
|
visitArgument(ctx) {
|
|
50529
50826
|
const testes = ctx.test();
|
|
@@ -50541,7 +50838,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50541
50838
|
if (compFor) {
|
|
50542
50839
|
return this.traduzirCompreensao(ctx.test(0), compFor);
|
|
50543
50840
|
}
|
|
50544
|
-
return ctx
|
|
50841
|
+
return ctx
|
|
50842
|
+
.test()
|
|
50843
|
+
.map((t) => this.visit(t))
|
|
50844
|
+
.join(', ');
|
|
50545
50845
|
}
|
|
50546
50846
|
traduzirCompreensao(exprCtx, compFor) {
|
|
50547
50847
|
const variavel = this.visit(compFor.exprlist());
|
|
@@ -50598,7 +50898,10 @@ class TradutorReversoPython extends AbstractParseTreeVisitor_1.AbstractParseTree
|
|
|
50598
50898
|
return tests.map((t) => this.visit(t)).join(', ');
|
|
50599
50899
|
}
|
|
50600
50900
|
visitSubscriptlist(ctx) {
|
|
50601
|
-
return ctx
|
|
50901
|
+
return ctx
|
|
50902
|
+
.subscript()
|
|
50903
|
+
.map((s) => this.visitSubscript(s))
|
|
50904
|
+
.join(', ');
|
|
50602
50905
|
}
|
|
50603
50906
|
visitSubscript(ctx) {
|
|
50604
50907
|
const tests = ctx.test();
|