@designliquido/delegua 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/analisador-semantico-base.d.ts +10 -1
- package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js +89 -0
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/analisador-semantico/analisador-semantico.d.ts +3 -9
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +15 -59
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +5 -6
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +36 -46
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +2 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +4 -0
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +8 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +57 -24
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +19 -13
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +1 -2
- 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 +1 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +1 -2
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.js +10 -17
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +8 -42
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +4 -40
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/atribuir.d.ts.map +1 -1
- package/construtos/atribuir.js +9 -4
- package/construtos/atribuir.js.map +1 -1
- package/construtos/literal.d.ts +3 -3
- package/construtos/literal.d.ts.map +1 -1
- package/construtos/literal.js.map +1 -1
- package/declaracoes/const-multiplo.d.ts +3 -3
- package/declaracoes/const-multiplo.d.ts.map +1 -1
- package/declaracoes/const-multiplo.js.map +1 -1
- package/declaracoes/se.d.ts +6 -2
- package/declaracoes/se.d.ts.map +1 -1
- package/declaracoes/se.js.map +1 -1
- package/declaracoes/var-multiplo.d.ts +3 -3
- package/declaracoes/var-multiplo.d.ts.map +1 -1
- package/declaracoes/var-multiplo.js.map +1 -1
- package/inferenciador.d.ts +1 -3
- package/inferenciador.d.ts.map +1 -1
- package/inferenciador.js +0 -8
- package/inferenciador.js.map +1 -1
- package/interfaces/interpretador-com-depuracao-interface.d.ts +1 -1
- package/interfaces/interpretador-com-depuracao-interface.d.ts.map +1 -1
- package/interfaces/variavel-hipotetica-interface.d.ts +2 -2
- package/interfaces/variavel-hipotetica-interface.d.ts.map +1 -1
- package/interpretador/depuracao/comum.d.ts +2 -1
- package/interpretador/depuracao/comum.d.ts.map +1 -1
- package/interpretador/depuracao/comum.js +27 -1
- package/interpretador/depuracao/comum.js.map +1 -1
- package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts +2 -1
- package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/interpretador-base-com-depuracao.js +3 -0
- package/interpretador/depuracao/interpretador-base-com-depuracao.js.map +1 -1
- package/interpretador/depuracao/interpretador-com-depuracao.d.ts +2 -1
- package/interpretador/depuracao/interpretador-com-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/interpretador-com-depuracao.js +3 -0
- package/interpretador/depuracao/interpretador-com-depuracao.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -10
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +0 -1
- package/interpretador/interpretador-base.js.map +1 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +1 -0
- package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
- package/lexador/dialetos/palavras-reservadas/pitugues.js +1 -0
- package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/comum.d.ts +1 -0
- package/tipos-de-simbolos/comum.d.ts.map +1 -1
- package/tipos-de-simbolos/comum.js +1 -0
- package/tipos-de-simbolos/comum.js.map +1 -1
- package/tipos-de-simbolos/pitugues.d.ts +1 -0
- package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
- package/tipos-de-simbolos/pitugues.js +1 -0
- package/tipos-de-simbolos/pitugues.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +57 -23
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/umd/delegua.js +275 -198
- package/tipo-dados-elementar.d.ts +0 -2
- package/tipo-dados-elementar.d.ts.map +0 -1
- package/tipo-dados-elementar.js +0 -3
- package/tipo-dados-elementar.js.map +0 -1
package/umd/delegua.js
CHANGED
|
@@ -56,6 +56,95 @@ class AnalisadorSemanticoBase {
|
|
|
56
56
|
correcoes: correcoes,
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
+
comparacaoArgumentosContraParametrosFuncao(simboloFuncao, parametros, argumentos) {
|
|
60
|
+
if (parametros.length !== argumentos.length) {
|
|
61
|
+
this.erro(simboloFuncao, `Função '${simboloFuncao.lexema}' espera ${parametros.length} parâmetros. Atual: ${argumentos.length}.`);
|
|
62
|
+
}
|
|
63
|
+
for (let [indice, parametro] of parametros.entries()) {
|
|
64
|
+
const argumento = argumentos[indice];
|
|
65
|
+
if (argumento) {
|
|
66
|
+
// Usando `obterTipoExpressao` para resolver adequadamente o tipo do argumento,
|
|
67
|
+
// independentemente de ser um `Literal` (tipo já resolvido), `Variavel` (tipo inferido do
|
|
68
|
+
// escopo), `Binario`, `Agrupamento`, ou qualquer outro construto (retorna `null` quando
|
|
69
|
+
// o tipo não pode ser determinado em tempo de compilação).
|
|
70
|
+
const tipoArgumento = this.obterTipoExpressao(argumento);
|
|
71
|
+
// Validar apenas quando ambos os lados têm um tipo específico e determinável.
|
|
72
|
+
// Ignorar quando `tipoArgumento` é nulo (por exemplo, resultado de `Chamada`) ou `qualquer`,
|
|
73
|
+
// evitando falsos positivos para expressões cujo tipo é desconhecido em tempo de compilação.
|
|
74
|
+
if (tipoArgumento && tipoArgumento !== 'qualquer' && parametro.tipoDado) {
|
|
75
|
+
if (parametro.tipoDado === 'texto' && tipoArgumento !== 'texto') {
|
|
76
|
+
this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
|
|
77
|
+
}
|
|
78
|
+
else if (['inteiro', 'número', 'real'].includes(parametro.tipoDado)) {
|
|
79
|
+
// Delegua suporta conversões implícitas entre tipos numéricos, mas não
|
|
80
|
+
// entre texto e número.
|
|
81
|
+
if (!['inteiro', 'número', 'real'].includes(tipoArgumento)) {
|
|
82
|
+
this.erro(simboloFuncao, `O valor passado para o parâmetro '${parametro.nome.lexema}' (${parametro.tipoDado}) é diferente do esperado pela função (${tipoArgumento}).`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
|
|
91
|
+
*/
|
|
92
|
+
obterTipoExpressao(expressao) {
|
|
93
|
+
if (expressao instanceof construtos_1.Literal) {
|
|
94
|
+
return expressao.tipo;
|
|
95
|
+
}
|
|
96
|
+
if (expressao instanceof construtos_1.Variavel) {
|
|
97
|
+
const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
|
|
98
|
+
return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
|
|
99
|
+
}
|
|
100
|
+
if (expressao instanceof construtos_1.Binario) {
|
|
101
|
+
// Para binários, tentamos inferir o tipo baseado nos operandos
|
|
102
|
+
return this.inferirTipoBinario(expressao);
|
|
103
|
+
}
|
|
104
|
+
if (expressao instanceof construtos_1.Logico) {
|
|
105
|
+
// Operadores lógicos sempre retornam tipo lógico
|
|
106
|
+
return 'lógico';
|
|
107
|
+
}
|
|
108
|
+
if (expressao instanceof construtos_1.Agrupamento) {
|
|
109
|
+
return this.obterTipoExpressao(expressao.expressao);
|
|
110
|
+
}
|
|
111
|
+
if (expressao instanceof construtos_1.Leia) {
|
|
112
|
+
// leia() sempre retorna texto
|
|
113
|
+
return 'texto';
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Infere o tipo de resultado de uma operação binária
|
|
119
|
+
*/
|
|
120
|
+
inferirTipoBinario(binario) {
|
|
121
|
+
const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
|
|
122
|
+
const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
|
|
123
|
+
// Operadores de comparação sempre retornam lógico
|
|
124
|
+
if (operadoresComparacao.includes(binario.operador.tipo)) {
|
|
125
|
+
return 'lógico';
|
|
126
|
+
}
|
|
127
|
+
const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
|
|
128
|
+
const tipoDireita = this.obterTipoExpressao(binario.direita);
|
|
129
|
+
if (!tipoEsquerda || !tipoDireita) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
if (operadoresMatematicos.includes(binario.operador.tipo)) {
|
|
133
|
+
const tiposNumericos = ['inteiro', 'número', 'real'];
|
|
134
|
+
if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
|
|
135
|
+
// Se um dos lados é 'real', o resultado é 'real'
|
|
136
|
+
if (tipoEsquerda === 'real' || tipoDireita === 'real') {
|
|
137
|
+
return 'real';
|
|
138
|
+
}
|
|
139
|
+
return 'número';
|
|
140
|
+
}
|
|
141
|
+
// Concatenação de textos
|
|
142
|
+
if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
|
|
143
|
+
return 'texto';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return 'qualquer';
|
|
147
|
+
}
|
|
59
148
|
/**
|
|
60
149
|
* Marca as variáveis usadas em uma expressão.
|
|
61
150
|
*/
|
|
@@ -375,6 +464,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
375
464
|
this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
|
|
376
465
|
this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
|
|
377
466
|
this.funcoes = {};
|
|
467
|
+
this.classesDeclararadas = new Set();
|
|
378
468
|
this.atual = 0;
|
|
379
469
|
this.diagnosticos = [];
|
|
380
470
|
}
|
|
@@ -879,65 +969,6 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
879
969
|
return null;
|
|
880
970
|
}
|
|
881
971
|
}
|
|
882
|
-
/**
|
|
883
|
-
* Obtém o tipo de uma expressão (pode ser Literal, Variavel, Binario, Leia, etc)
|
|
884
|
-
*/
|
|
885
|
-
obterTipoExpressao(expressao) {
|
|
886
|
-
if (expressao instanceof construtos_1.Literal) {
|
|
887
|
-
return expressao.tipo;
|
|
888
|
-
}
|
|
889
|
-
if (expressao instanceof construtos_1.Variavel) {
|
|
890
|
-
const variavel = this.gerenciadorEscopos.buscar(expressao.simbolo.lexema);
|
|
891
|
-
return (variavel === null || variavel === void 0 ? void 0 : variavel.tipo) || null;
|
|
892
|
-
}
|
|
893
|
-
if (expressao instanceof construtos_1.Binario) {
|
|
894
|
-
// Para binários, tentamos inferir o tipo baseado nos operandos
|
|
895
|
-
return this.inferirTipoBinario(expressao);
|
|
896
|
-
}
|
|
897
|
-
if (expressao instanceof construtos_1.Logico) {
|
|
898
|
-
// Operadores lógicos sempre retornam tipo lógico
|
|
899
|
-
return 'lógico';
|
|
900
|
-
}
|
|
901
|
-
if (expressao instanceof construtos_1.Agrupamento) {
|
|
902
|
-
return this.obterTipoExpressao(expressao.expressao);
|
|
903
|
-
}
|
|
904
|
-
if (expressao instanceof construtos_1.Leia) {
|
|
905
|
-
// leia() sempre retorna texto
|
|
906
|
-
return 'texto';
|
|
907
|
-
}
|
|
908
|
-
return null;
|
|
909
|
-
}
|
|
910
|
-
/**
|
|
911
|
-
* Infere o tipo de resultado de uma operação binária
|
|
912
|
-
*/
|
|
913
|
-
inferirTipoBinario(binario) {
|
|
914
|
-
const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
|
|
915
|
-
const operadoresComparacao = ['MAIOR', 'MAIOR_IGUAL', 'MENOR', 'MENOR_IGUAL', 'IGUAL', 'DIFERENTE'];
|
|
916
|
-
// Operadores de comparação sempre retornam lógico
|
|
917
|
-
if (operadoresComparacao.includes(binario.operador.tipo)) {
|
|
918
|
-
return 'lógico';
|
|
919
|
-
}
|
|
920
|
-
const tipoEsquerda = this.obterTipoExpressao(binario.esquerda);
|
|
921
|
-
const tipoDireita = this.obterTipoExpressao(binario.direita);
|
|
922
|
-
if (!tipoEsquerda || !tipoDireita) {
|
|
923
|
-
return null;
|
|
924
|
-
}
|
|
925
|
-
if (operadoresMatematicos.includes(binario.operador.tipo)) {
|
|
926
|
-
const tiposNumericos = ['inteiro', 'número', 'real'];
|
|
927
|
-
if (tiposNumericos.includes(tipoEsquerda) && tiposNumericos.includes(tipoDireita)) {
|
|
928
|
-
// Se um dos lados é 'real', o resultado é 'real'
|
|
929
|
-
if (tipoEsquerda === 'real' || tipoDireita === 'real') {
|
|
930
|
-
return 'real';
|
|
931
|
-
}
|
|
932
|
-
return 'número';
|
|
933
|
-
}
|
|
934
|
-
// Concatenação de textos
|
|
935
|
-
if (tipoEsquerda === 'texto' || tipoDireita === 'texto') {
|
|
936
|
-
return 'texto';
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
return 'qualquer';
|
|
940
|
-
}
|
|
941
972
|
verificarExistenciaConstruto(construto) {
|
|
942
973
|
if (construto instanceof construtos_1.Variavel) {
|
|
943
974
|
if (!this.gerenciadorEscopos.buscar(construto.simbolo.lexema)) {
|
|
@@ -1197,6 +1228,19 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1197
1228
|
}
|
|
1198
1229
|
return Promise.resolve();
|
|
1199
1230
|
}
|
|
1231
|
+
visitarDeclaracaoClasse(declaracao) {
|
|
1232
|
+
if (declaracao.superClasse) {
|
|
1233
|
+
const nomeSuperclasse = declaracao.superClasse.simbolo.lexema;
|
|
1234
|
+
if (nomeSuperclasse === declaracao.simbolo.lexema) {
|
|
1235
|
+
this.erro(declaracao.superClasse.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
|
|
1236
|
+
}
|
|
1237
|
+
else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
|
|
1238
|
+
this.erro(declaracao.superClasse.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
this.classesDeclararadas.add(declaracao.simbolo.lexema);
|
|
1242
|
+
return Promise.resolve();
|
|
1243
|
+
}
|
|
1200
1244
|
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
1201
1245
|
var _a;
|
|
1202
1246
|
if (declaracao.funcao.tipo === undefined) {
|
|
@@ -1271,6 +1315,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
1271
1315
|
}
|
|
1272
1316
|
async analisar(declaracoes) {
|
|
1273
1317
|
this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
|
|
1318
|
+
this.classesDeclararadas = new Set();
|
|
1274
1319
|
this.atual = 0;
|
|
1275
1320
|
this.diagnosticos = [];
|
|
1276
1321
|
try {
|
|
@@ -1501,6 +1546,10 @@ class AvaliadorSintaticoBase {
|
|
|
1501
1546
|
}
|
|
1502
1547
|
return false;
|
|
1503
1548
|
}
|
|
1549
|
+
async declaracaoBloco() {
|
|
1550
|
+
const simboloInicioBloco = this.consumir(comum_1.default.CHAVE_ESQUERDA, "Esperado '{' para abertura de bloco.");
|
|
1551
|
+
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
|
|
1552
|
+
}
|
|
1504
1553
|
async finalizarChamada(entidadeChamada) {
|
|
1505
1554
|
const argumentos = [];
|
|
1506
1555
|
if (!this.verificarTipoSimboloAtual(comum_1.default.PARENTESE_DIREITO)) {
|
|
@@ -1931,7 +1980,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1931
1980
|
* @returns {ListaCompreensao} A lista de compreensão resolvida.
|
|
1932
1981
|
*/
|
|
1933
1982
|
async resolverCompreensaoDeLista(retornoExpressao) {
|
|
1934
|
-
this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após
|
|
1983
|
+
this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificador.");
|
|
1935
1984
|
this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
|
|
1936
1985
|
const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
|
|
1937
1986
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
|
|
@@ -2098,8 +2147,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2098
2147
|
case delegua_2.default.TEXTO:
|
|
2099
2148
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
2100
2149
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
2101
|
-
|
|
2102
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
|
|
2150
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
|
|
2103
2151
|
case delegua_2.default.PARA:
|
|
2104
2152
|
const simboloPara = this.avancarEDevolverAnterior();
|
|
2105
2153
|
return await this.paraComoConstruto(simboloPara);
|
|
@@ -2227,6 +2275,50 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2227
2275
|
}
|
|
2228
2276
|
return tipoAcesso;
|
|
2229
2277
|
}
|
|
2278
|
+
/**
|
|
2279
|
+
* Resolve um construto do tipo `Variavel`, `AcessoMetodoOuPropriedade` ou `AcessoIndiceVariavel`
|
|
2280
|
+
* para um `ElementoMontaoTipos` correspondente, caso exista.
|
|
2281
|
+
* @param construto O construto.
|
|
2282
|
+
* @returns O `ElementoMontaoTipos` correspondente ou `null` se não existir.
|
|
2283
|
+
*/
|
|
2284
|
+
resolverElementoMontao(construto) {
|
|
2285
|
+
switch (construto.constructor) {
|
|
2286
|
+
case construtos_1.Variavel:
|
|
2287
|
+
try {
|
|
2288
|
+
const nomeVariavel = construto.simbolo.lexema;
|
|
2289
|
+
const elementoMontao = this.pilhaEscopos.obterElementoMontaoTipos(nomeVariavel);
|
|
2290
|
+
if (elementoMontao.endereco) {
|
|
2291
|
+
const referenciaMontaoTipos = this.montaoTipos.obterReferencia(construto.hashArquivo, construto.linha, elementoMontao.endereco);
|
|
2292
|
+
if (referenciaMontaoTipos instanceof elemento_montao_tipos_1.ElementoMontaoTipos) {
|
|
2293
|
+
return referenciaMontaoTipos;
|
|
2294
|
+
}
|
|
2295
|
+
return null;
|
|
2296
|
+
}
|
|
2297
|
+
return elementoMontao;
|
|
2298
|
+
}
|
|
2299
|
+
catch (_a) {
|
|
2300
|
+
return null;
|
|
2301
|
+
}
|
|
2302
|
+
case construtos_1.AcessoMetodoOuPropriedade: {
|
|
2303
|
+
const acesso = construto;
|
|
2304
|
+
const elementoObjeto = this.resolverElementoMontao(acesso.objeto);
|
|
2305
|
+
if (!elementoObjeto) {
|
|
2306
|
+
return null;
|
|
2307
|
+
}
|
|
2308
|
+
return elementoObjeto.subElementos[acesso.simbolo.lexema] || null;
|
|
2309
|
+
}
|
|
2310
|
+
case construtos_1.AcessoIndiceVariavel: {
|
|
2311
|
+
const acessoIndice = construto;
|
|
2312
|
+
const elementoObjeto = this.resolverElementoMontao(acessoIndice.entidadeChamada);
|
|
2313
|
+
if (!elementoObjeto || !(acessoIndice.indice instanceof construtos_1.Literal)) {
|
|
2314
|
+
return null;
|
|
2315
|
+
}
|
|
2316
|
+
return elementoObjeto.subElementos[String(acessoIndice.indice.valor)] || null;
|
|
2317
|
+
}
|
|
2318
|
+
default:
|
|
2319
|
+
return null;
|
|
2320
|
+
}
|
|
2321
|
+
}
|
|
2230
2322
|
async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
|
|
2231
2323
|
if (!this.simbolos[this.atual]) {
|
|
2232
2324
|
return expressaoAnterior;
|
|
@@ -2244,12 +2336,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2244
2336
|
// Se não for um dicionário anônimo (ou seja, ser variável ou constante com nome)
|
|
2245
2337
|
if (expressaoAnterior.tipo === 'dicionário' &&
|
|
2246
2338
|
expressaoAnterior.constructor !== construtos_1.Dicionario) {
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
if (nome.lexema in referenciaMontaoTipos.subElementos) {
|
|
2252
|
-
tipoInferido = referenciaMontaoTipos.subElementos[nome.lexema].tipo;
|
|
2339
|
+
const elementoMontaoTipos = this.resolverElementoMontao(expressaoAnterior);
|
|
2340
|
+
if (elementoMontaoTipos &&
|
|
2341
|
+
nome.lexema in elementoMontaoTipos.subElementos) {
|
|
2342
|
+
tipoInferido = elementoMontaoTipos.subElementos[nome.lexema].tipo;
|
|
2253
2343
|
}
|
|
2254
2344
|
}
|
|
2255
2345
|
const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
|
|
@@ -2746,8 +2836,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2746
2836
|
}
|
|
2747
2837
|
async logicaComumEnquanto() {
|
|
2748
2838
|
const condicao = await this.expressao();
|
|
2749
|
-
|
|
2750
|
-
const corpo = await this.resolverDeclaracao();
|
|
2839
|
+
const corpo = await this.declaracaoBloco();
|
|
2751
2840
|
return {
|
|
2752
2841
|
condicao,
|
|
2753
2842
|
corpo,
|
|
@@ -2851,7 +2940,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2851
2940
|
return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
|
|
2852
2941
|
}
|
|
2853
2942
|
async logicaComumFazer() {
|
|
2854
|
-
const caminhoFazer = await this.
|
|
2943
|
+
const caminhoFazer = await this.declaracaoBloco();
|
|
2855
2944
|
this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
|
|
2856
2945
|
const condicaoEnquanto = await this.expressao();
|
|
2857
2946
|
return {
|
|
@@ -2863,8 +2952,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2863
2952
|
try {
|
|
2864
2953
|
this.blocos += 1;
|
|
2865
2954
|
const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
|
|
2866
|
-
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer,
|
|
2867
|
-
condicaoEnquanto);
|
|
2955
|
+
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
|
|
2868
2956
|
}
|
|
2869
2957
|
finally {
|
|
2870
2958
|
this.blocos -= 1;
|
|
@@ -2948,8 +3036,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2948
3036
|
}
|
|
2949
3037
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
|
|
2950
3038
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
|
|
2951
|
-
|
|
2952
|
-
const corpo = await this.resolverDeclaracao();
|
|
3039
|
+
const corpo = await this.declaracaoBloco();
|
|
2953
3040
|
return {
|
|
2954
3041
|
nomeVariavelChave,
|
|
2955
3042
|
nomeVariavelValor,
|
|
@@ -2987,8 +3074,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2987
3074
|
tipoVariavelIteracao = tipoVetor.slice(0, -2);
|
|
2988
3075
|
}
|
|
2989
3076
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
|
|
2990
|
-
|
|
2991
|
-
const corpo = await this.resolverDeclaracao();
|
|
3077
|
+
const corpo = await this.declaracaoBloco();
|
|
2992
3078
|
return {
|
|
2993
3079
|
variavelIteracao,
|
|
2994
3080
|
vetor: vetorOuDicionario,
|
|
@@ -3037,8 +3123,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3037
3123
|
if (comParenteses) {
|
|
3038
3124
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
|
|
3039
3125
|
}
|
|
3040
|
-
|
|
3041
|
-
const corpo = await this.resolverDeclaracao();
|
|
3126
|
+
const corpo = await this.declaracaoBloco();
|
|
3042
3127
|
return {
|
|
3043
3128
|
inicializador,
|
|
3044
3129
|
condicao,
|
|
@@ -3569,9 +3654,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3569
3654
|
let superClasse = null;
|
|
3570
3655
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
|
|
3571
3656
|
const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
|
|
3572
|
-
// TODO: Validar classes existentes?
|
|
3573
3657
|
this.superclasseAtual = simboloSuperclasse.lexema;
|
|
3574
|
-
// TODO: Colocar tipo aqui?
|
|
3575
3658
|
superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
|
|
3576
3659
|
}
|
|
3577
3660
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
|
|
@@ -3682,8 +3765,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3682
3765
|
case delegua_2.default.AJUDA:
|
|
3683
3766
|
return await this.declaracaoAjuda();
|
|
3684
3767
|
case delegua_2.default.CHAVE_ESQUERDA:
|
|
3685
|
-
|
|
3686
|
-
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
|
|
3768
|
+
return await this.declaracaoBloco();
|
|
3687
3769
|
case delegua_2.default.COMENTARIO:
|
|
3688
3770
|
return this.declaracaoComentarioUmaLinha();
|
|
3689
3771
|
case delegua_2.default.CONSTANTE:
|
|
@@ -5157,8 +5239,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5157
5239
|
case pitugues_2.default.TEXTO:
|
|
5158
5240
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
5159
5241
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
|
|
5160
|
-
|
|
5161
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
|
|
5242
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
|
|
5162
5243
|
case pitugues_2.default.TIPO:
|
|
5163
5244
|
const simboloTipo = this.avancarEDevolverAnterior();
|
|
5164
5245
|
this.consumir(pitugues_2.default.PARENTESE_ESQUERDO, "Esperado '(' após 'tipo'.");
|
|
@@ -5514,11 +5595,13 @@ class AvaliadorSintaticoPitugues {
|
|
|
5514
5595
|
// Neste caso, linha do símbolo atual é igual à linha do símbolo anterior.
|
|
5515
5596
|
if (simboloAtual.linha === simboloAnterior.linha) {
|
|
5516
5597
|
const declaracoesBloco = await this.resolverDeclaracaoForaDeBloco();
|
|
5517
|
-
if (
|
|
5518
|
-
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5598
|
+
if (declaracoesBloco !== null) {
|
|
5599
|
+
if (Array.isArray(declaracoesBloco)) {
|
|
5600
|
+
declaracoes = declaracoes.concat(declaracoesBloco);
|
|
5601
|
+
}
|
|
5602
|
+
else {
|
|
5603
|
+
declaracoes.push(declaracoesBloco);
|
|
5604
|
+
}
|
|
5522
5605
|
}
|
|
5523
5606
|
}
|
|
5524
5607
|
else {
|
|
@@ -5542,11 +5625,13 @@ class AvaliadorSintaticoPitugues {
|
|
|
5542
5625
|
const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
|
|
5543
5626
|
while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
|
|
5544
5627
|
const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
|
|
5545
|
-
if (
|
|
5546
|
-
|
|
5547
|
-
|
|
5548
|
-
|
|
5549
|
-
|
|
5628
|
+
if (retornoDeclaracao !== null) {
|
|
5629
|
+
if (Array.isArray(retornoDeclaracao)) {
|
|
5630
|
+
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
5631
|
+
}
|
|
5632
|
+
else {
|
|
5633
|
+
declaracoes.push(retornoDeclaracao);
|
|
5634
|
+
}
|
|
5550
5635
|
}
|
|
5551
5636
|
simboloAtual = this.simboloAtual();
|
|
5552
5637
|
if (!simboloAtual)
|
|
@@ -5836,7 +5921,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5836
5921
|
* @returns {ListaCompreensao} A lista de compreensão resolvida.
|
|
5837
5922
|
*/
|
|
5838
5923
|
async resolverCompreensaoDeLista(retornoExpressao) {
|
|
5839
|
-
this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após
|
|
5924
|
+
this.consumir(pitugues_2.default.PARA, "Esperado instrução 'para' após identificador.");
|
|
5840
5925
|
this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
|
|
5841
5926
|
const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
|
|
5842
5927
|
// TODO: Manter essa validação aqui? Se sim, como resolver a expressão?
|
|
@@ -6047,6 +6132,9 @@ class AvaliadorSintaticoPitugues {
|
|
|
6047
6132
|
case pitugues_2.default.CONTINUA:
|
|
6048
6133
|
this.avancarEDevolverAnterior();
|
|
6049
6134
|
return this.declaracaoContinua();
|
|
6135
|
+
case pitugues_2.default.NADA:
|
|
6136
|
+
this.avancarEDevolverAnterior();
|
|
6137
|
+
return null;
|
|
6050
6138
|
case pitugues_2.default.DOIS_PONTOS:
|
|
6051
6139
|
this.avancarEDevolverAnterior();
|
|
6052
6140
|
const simboloInicioBloco = this.simboloAnterior();
|
|
@@ -6581,8 +6669,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
6581
6669
|
case prisma_1.default.TEXTO:
|
|
6582
6670
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
6583
6671
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
|
|
6584
|
-
|
|
6585
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoDadosElementar);
|
|
6672
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal, tipoInferido);
|
|
6586
6673
|
case prisma_1.default.IDENTIFICADOR:
|
|
6587
6674
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
6588
6675
|
let tipoOperando;
|
|
@@ -7407,8 +7494,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
|
|
|
7407
7494
|
case tenda_1.default.TEXTO:
|
|
7408
7495
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
7409
7496
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
7410
|
-
|
|
7411
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
|
|
7497
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoInferido);
|
|
7412
7498
|
case tenda_1.default.PARENTESE_ESQUERDO:
|
|
7413
7499
|
this.avancarEDevolverAnterior();
|
|
7414
7500
|
const expressao = await this.expressao();
|
|
@@ -8254,8 +8340,7 @@ class MicroAvaliadorSintaticoPitugues extends micro_avaliador_sintatico_base_1.M
|
|
|
8254
8340
|
case pitugues_1.default.TEXTO:
|
|
8255
8341
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
8256
8342
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
8257
|
-
|
|
8258
|
-
return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tiposDadosElementar);
|
|
8343
|
+
return new construtos_1.Literal(-1, Number(this.linha), simboloNumeroTexto.literal, tipoInferido);
|
|
8259
8344
|
case pitugues_1.default.IDENTIFICADOR:
|
|
8260
8345
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
8261
8346
|
return new construtos_1.Variavel(-1, simboloIdentificador);
|
|
@@ -8626,31 +8711,24 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
8626
8711
|
const simboloAtual = this.simbolos[this.atual];
|
|
8627
8712
|
let valores = [];
|
|
8628
8713
|
switch (simboloAtual.tipo) {
|
|
8629
|
-
|
|
8630
|
-
/* case tiposDeSimbolos.CHAVE_ESQUERDA:
|
|
8714
|
+
case delegua_1.default.CHAVE_ESQUERDA:
|
|
8631
8715
|
this.avancarEDevolverAnterior();
|
|
8632
8716
|
const chaves = [];
|
|
8633
8717
|
valores = [];
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
return new Dicionario(-1, Number(this.linha), [], []);
|
|
8718
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
|
|
8719
|
+
return new construtos_1.Dicionario(-1, Number(this.linha), [], []);
|
|
8637
8720
|
}
|
|
8638
|
-
|
|
8639
|
-
|
|
8640
|
-
|
|
8641
|
-
|
|
8642
|
-
const valor = this.atribuir();
|
|
8643
|
-
|
|
8721
|
+
while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
|
|
8722
|
+
const chave = this.declaracao();
|
|
8723
|
+
this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
8724
|
+
const valor = this.declaracao();
|
|
8644
8725
|
chaves.push(chave);
|
|
8645
8726
|
valores.push(valor);
|
|
8646
|
-
|
|
8647
|
-
|
|
8648
|
-
this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
8727
|
+
if (this.simbolos[this.atual].tipo !== delegua_1.default.CHAVE_DIREITA) {
|
|
8728
|
+
this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
8649
8729
|
}
|
|
8650
8730
|
}
|
|
8651
|
-
|
|
8652
|
-
return new Dicionario(-1, Number(this.linha), chaves, valores); */
|
|
8653
|
-
// TODO: Verificar se vamos usar isso.
|
|
8731
|
+
return new construtos_1.Dicionario(-1, Number(this.linha), chaves, valores);
|
|
8654
8732
|
case delegua_1.default.COLCHETE_ESQUERDO:
|
|
8655
8733
|
this.avancarEDevolverAnterior();
|
|
8656
8734
|
valores = [];
|
|
@@ -9603,20 +9681,6 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
9603
9681
|
}, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
|
|
9604
9682
|
const valorVetor = interpretador.resolverValor(vetor);
|
|
9605
9683
|
const valorFuncaoMapeamento = interpretador.resolverValor(funcaoMapeamento);
|
|
9606
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
9607
|
-
// na avaliação sintática. Estudar remoção.
|
|
9608
|
-
if (!Array.isArray(valorVetor)) {
|
|
9609
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9610
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9611
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9612
|
-
}, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
|
|
9613
|
-
}
|
|
9614
|
-
if (valorFuncaoMapeamento.constructor !== estruturas_1.DeleguaFuncao) {
|
|
9615
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9616
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9617
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9618
|
-
}, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
|
|
9619
|
-
}
|
|
9620
9684
|
const resultados = [];
|
|
9621
9685
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
9622
9686
|
const informacoesRetorno = await valorFuncaoMapeamento.chamar(interpretador, [
|
|
@@ -9783,20 +9847,6 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
9783
9847
|
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
9784
9848
|
? funcaoFiltragem.valor
|
|
9785
9849
|
: funcaoFiltragem;
|
|
9786
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
9787
|
-
// na avaliação sintática. Estudar remoção.
|
|
9788
|
-
if (!Array.isArray(valorVetor)) {
|
|
9789
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9790
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9791
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9792
|
-
}, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
|
|
9793
|
-
}
|
|
9794
|
-
if (valorFuncaoFiltragem.constructor !== estruturas_1.DeleguaFuncao) {
|
|
9795
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9796
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9797
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9798
|
-
}, 'Parâmetro inválido. O segundo parâmetro da função paraCada() deve ser uma função.'));
|
|
9799
|
-
}
|
|
9800
9850
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
9801
9851
|
await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
|
|
9802
9852
|
}
|
|
@@ -10062,21 +10112,11 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
|
|
|
10062
10112
|
*/
|
|
10063
10113
|
async function tupla(interpretador, vetor) {
|
|
10064
10114
|
const valorVetor = interpretador.resolverValor(vetor);
|
|
10065
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
10066
|
-
// na avaliação sintática. Estudar remoção.
|
|
10067
|
-
if (!Array.isArray(valorVetor)) {
|
|
10068
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10069
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
10070
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
10071
|
-
}, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
|
|
10072
|
-
}
|
|
10073
10115
|
const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
|
|
10074
10116
|
return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
|
|
10075
10117
|
}
|
|
10076
10118
|
async function vetor(interpretador, tupla) {
|
|
10077
10119
|
const objetoTupla = interpretador.resolverValor(tupla);
|
|
10078
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
10079
|
-
// na avaliação sintática. Estudar remoção.
|
|
10080
10120
|
if (!(objetoTupla instanceof construtos_1.Tupla || objetoTupla instanceof construtos_1.TuplaN)) {
|
|
10081
10121
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10082
10122
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
@@ -10089,16 +10129,20 @@ async function vetor(interpretador, tupla) {
|
|
|
10089
10129
|
}
|
|
10090
10130
|
else {
|
|
10091
10131
|
const nomeClasse = objetoTupla.constructor.name;
|
|
10092
|
-
|
|
10093
|
-
|
|
10132
|
+
const props = mapaPropriedadesTuplas[nomeClasse];
|
|
10133
|
+
if (props) {
|
|
10094
10134
|
resultado = props.map(prop => objetoTupla[prop]);
|
|
10095
10135
|
}
|
|
10096
10136
|
else if (objetoTupla.elementos && Array.isArray(objetoTupla.elementos)) {
|
|
10097
10137
|
resultado = objetoTupla.elementos;
|
|
10098
10138
|
}
|
|
10099
10139
|
}
|
|
10100
|
-
const resultadoFinal =
|
|
10101
|
-
|
|
10140
|
+
const resultadoFinal = new Array(resultado.length);
|
|
10141
|
+
for (let i = 0; i < resultado.length; i++) {
|
|
10142
|
+
const item = resultado[i];
|
|
10143
|
+
resultadoFinal[i] = item && typeof item === 'object' && 'valor' in item ? item.valor : item;
|
|
10144
|
+
}
|
|
10145
|
+
return resultadoFinal;
|
|
10102
10146
|
}
|
|
10103
10147
|
|
|
10104
10148
|
},{"../construtos":62,"../excecoes":129,"../interpretador/estruturas":176,"../interpretador/estruturas/descritor-tipo-classe":174,"../interpretador/estruturas/funcao-padrao":175,"../interpretador/estruturas/objeto-delegua-classe":180,"../quebras":212}],28:[function(require,module,exports){
|
|
@@ -11343,19 +11387,24 @@ exports.AtribuicaoPorIndicesMatriz = AtribuicaoPorIndicesMatriz;
|
|
|
11343
11387
|
"use strict";
|
|
11344
11388
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11345
11389
|
exports.Atribuir = void 0;
|
|
11390
|
+
const variavel_1 = require("./variavel");
|
|
11346
11391
|
/**
|
|
11347
11392
|
* Construto de atribuição de um valor a um símbolo.
|
|
11348
11393
|
*/
|
|
11349
11394
|
class Atribuir {
|
|
11350
|
-
constructor(hashArquivo, alvo, valor,
|
|
11351
|
-
// indice so é usado para variaveis de vetores
|
|
11352
|
-
// TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
|
|
11353
|
-
indice, simboloOperador) {
|
|
11395
|
+
constructor(hashArquivo, alvo, valor, indice, simboloOperador) {
|
|
11354
11396
|
this.linha = Number(alvo.linha);
|
|
11355
11397
|
this.hashArquivo = hashArquivo;
|
|
11356
11398
|
this.alvo = alvo;
|
|
11357
11399
|
this.valor = valor;
|
|
11358
11400
|
if (indice !== undefined) {
|
|
11401
|
+
const alvoComoVariavel = alvo;
|
|
11402
|
+
const tipoAlvo = alvoComoVariavel === null || alvoComoVariavel === void 0 ? void 0 : alvoComoVariavel.tipo;
|
|
11403
|
+
const alvoSuportaIndice = alvo instanceof variavel_1.Variavel &&
|
|
11404
|
+
(tipoAlvo === 'vetor' || tipoAlvo === 'dicionário' || tipoAlvo === 'qualquer' || (tipoAlvo === null || tipoAlvo === void 0 ? void 0 : tipoAlvo.endsWith('[]')));
|
|
11405
|
+
if (!alvoSuportaIndice) {
|
|
11406
|
+
throw new Error("`indice` só pode ser informado quando o alvo for uma variável de vetor ou dicionário.");
|
|
11407
|
+
}
|
|
11359
11408
|
this.indice = indice;
|
|
11360
11409
|
}
|
|
11361
11410
|
if (simboloOperador !== undefined) {
|
|
@@ -11378,7 +11427,7 @@ class Atribuir {
|
|
|
11378
11427
|
}
|
|
11379
11428
|
exports.Atribuir = Atribuir;
|
|
11380
11429
|
|
|
11381
|
-
},{}],45:[function(require,module,exports){
|
|
11430
|
+
},{"./variavel":89}],45:[function(require,module,exports){
|
|
11382
11431
|
"use strict";
|
|
11383
11432
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11384
11433
|
exports.Binario = void 0;
|
|
@@ -15428,7 +15477,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15428
15477
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15429
15478
|
exports.TipoNativoSimbolo = void 0;
|
|
15430
15479
|
exports.inferirTipoVariavel = inferirTipoVariavel;
|
|
15431
|
-
exports.tipoInferenciaParaTipoDadosElementar = tipoInferenciaParaTipoDadosElementar;
|
|
15432
15480
|
const primitivos_1 = __importDefault(require("./tipos-de-dados/primitivos"));
|
|
15433
15481
|
const delegua_1 = __importDefault(require("./tipos-de-dados/delegua"));
|
|
15434
15482
|
const delegua_2 = __importDefault(require("./tipos-de-simbolos/delegua"));
|
|
@@ -15542,13 +15590,6 @@ function inferirTipoVariavel(variavel) {
|
|
|
15542
15590
|
return 'símbolo';
|
|
15543
15591
|
}
|
|
15544
15592
|
}
|
|
15545
|
-
function tipoInferenciaParaTipoDadosElementar(tipoInferencia) {
|
|
15546
|
-
switch (tipoInferencia) {
|
|
15547
|
-
// TODO: Colocar exceções aqui.
|
|
15548
|
-
default:
|
|
15549
|
-
return tipoInferencia;
|
|
15550
|
-
}
|
|
15551
|
-
}
|
|
15552
15593
|
|
|
15553
15594
|
},{"./tipos-de-dados/delegua":213,"./tipos-de-dados/primitivos":215,"./tipos-de-simbolos/delegua":218}],136:[function(require,module,exports){
|
|
15554
15595
|
"use strict";
|
|
@@ -18117,7 +18158,6 @@ class InterpretadorBase {
|
|
|
18117
18158
|
return await this.executar(declaracao.caminhoEntao);
|
|
18118
18159
|
}
|
|
18119
18160
|
for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
|
|
18120
|
-
// TODO: Qual o tipo de `atual`?
|
|
18121
18161
|
const atual = declaracao.caminhosSeSenao[i];
|
|
18122
18162
|
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
18123
18163
|
return await this.executar(atual.caminho);
|
|
@@ -22860,6 +22900,7 @@ exports.palavrasReservadasPitugues = {
|
|
|
22860
22900
|
isto: pitugues_1.default.ISTO,
|
|
22861
22901
|
entrada: pitugues_1.default.LEIA,
|
|
22862
22902
|
leia: pitugues_1.default.LEIA,
|
|
22903
|
+
nada: pitugues_1.default.NADA,
|
|
22863
22904
|
nao: pitugues_1.default.NAO,
|
|
22864
22905
|
não: pitugues_1.default.NAO,
|
|
22865
22906
|
nulo: pitugues_1.default.NULO,
|
|
@@ -24734,6 +24775,7 @@ exports.default = {
|
|
|
24734
24775
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24735
24776
|
exports.default = {
|
|
24736
24777
|
ADICAO: 'ADICAO',
|
|
24778
|
+
CHAVE_ESQUERDA: 'CHAVE_ESQUERDA',
|
|
24737
24779
|
DIFERENTE: 'DIFERENTE',
|
|
24738
24780
|
DIVISAO: 'DIVISAO',
|
|
24739
24781
|
DIVISAO_INTEIRA: 'DIVISAO_INTEIRA',
|
|
@@ -25064,6 +25106,7 @@ exports.default = {
|
|
|
25064
25106
|
MODULO: 'MODULO',
|
|
25065
25107
|
MULTIPLICACAO: 'MULTIPLICACAO',
|
|
25066
25108
|
MULTIPLICACAO_IGUAL: 'MULTIPLICACAO_IGUAL',
|
|
25109
|
+
NADA: 'NADA',
|
|
25067
25110
|
NAO: 'NAO',
|
|
25068
25111
|
NEGACAO: 'NEGACAO',
|
|
25069
25112
|
NULO: 'NULO',
|
|
@@ -41586,14 +41629,22 @@ class TradutorJavaScript {
|
|
|
41586
41629
|
case 'adicionar':
|
|
41587
41630
|
case 'empilhar':
|
|
41588
41631
|
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
41632
|
+
case 'concatenar':
|
|
41633
|
+
return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
|
|
41634
|
+
case 'encaixar':
|
|
41635
|
+
return `${objetoResolvido}.splice(${textoArgumentos})`;
|
|
41589
41636
|
case 'fatiar':
|
|
41590
|
-
return `${objetoResolvido}.slice(${
|
|
41637
|
+
return `${objetoResolvido}.slice(${textoArgumentos})`;
|
|
41638
|
+
case 'filtrarPor':
|
|
41639
|
+
return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
41591
41640
|
case 'inclui':
|
|
41592
41641
|
return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
|
|
41593
41642
|
case 'inverter':
|
|
41594
41643
|
return `${objetoResolvido}.toReversed()`;
|
|
41595
41644
|
case 'juntar':
|
|
41596
|
-
return
|
|
41645
|
+
return argumentosResolvidos.length > 0
|
|
41646
|
+
? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
|
|
41647
|
+
: `${objetoResolvido}.join()`;
|
|
41597
41648
|
case 'maiusculo':
|
|
41598
41649
|
return `${objetoResolvido}.toUpperCase()`;
|
|
41599
41650
|
case 'mapear':
|
|
@@ -41601,9 +41652,11 @@ class TradutorJavaScript {
|
|
|
41601
41652
|
case 'minusculo':
|
|
41602
41653
|
return `${objetoResolvido}.toLowerCase()`;
|
|
41603
41654
|
case 'ordenar':
|
|
41604
|
-
return
|
|
41655
|
+
return argumentosResolvidos.length > 0
|
|
41656
|
+
? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
|
|
41657
|
+
: `${objetoResolvido}.sort()`;
|
|
41605
41658
|
case 'remover':
|
|
41606
|
-
return
|
|
41659
|
+
return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
|
|
41607
41660
|
case 'removerPrimeiro':
|
|
41608
41661
|
return `${objetoResolvido}.shift()`;
|
|
41609
41662
|
case 'removerUltimo':
|
|
@@ -42021,9 +42074,26 @@ class TradutorJavaScript {
|
|
|
42021
42074
|
}
|
|
42022
42075
|
return resultado;
|
|
42023
42076
|
}
|
|
42024
|
-
// TODO: Talvez terminar (ou remover, sei lá).
|
|
42025
42077
|
traduzirFuncaoAnonimaParaLambda(argumento) {
|
|
42026
|
-
|
|
42078
|
+
var _a, _b, _c;
|
|
42079
|
+
if (argumento instanceof construtos_1.FuncaoConstruto) {
|
|
42080
|
+
const params = argumento.parametros.map((p) => p.nome.lexema).join(', ');
|
|
42081
|
+
// Retorno de um valor → retorno conciso
|
|
42082
|
+
if (argumento.corpo.length === 1 && argumento.corpo[0] instanceof declaracoes_1.Retorna) {
|
|
42083
|
+
const retorna = argumento.corpo[0];
|
|
42084
|
+
const expr = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
|
|
42085
|
+
return `(${params}) => ${expr}`;
|
|
42086
|
+
}
|
|
42087
|
+
// O JavaScript não tem suporte nativo para blocos de função anônimos, então usamos uma função de seta com corpo de bloco.
|
|
42088
|
+
return `(${params}) => ${this.logicaComumBlocoEscopo(argumento.corpo)}`;
|
|
42089
|
+
}
|
|
42090
|
+
if (argumento instanceof construtos_1.Variavel) {
|
|
42091
|
+
return argumento.simbolo.lexema;
|
|
42092
|
+
}
|
|
42093
|
+
if (argumento instanceof construtos_1.ReferenciaFuncao || argumento instanceof construtos_1.ArgumentoReferenciaFuncao) {
|
|
42094
|
+
return argumento.simboloFuncao.lexema;
|
|
42095
|
+
}
|
|
42096
|
+
return (_c = (_b = (_a = this.dicionarioConstrutos)[argumento.constructor.name]) === null || _b === void 0 ? void 0 : _b.call(_a, argumento)) !== null && _c !== void 0 ? _c : '';
|
|
42027
42097
|
}
|
|
42028
42098
|
traduzirExpressaoAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
|
|
42029
42099
|
const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
|
|
@@ -42032,34 +42102,43 @@ class TradutorJavaScript {
|
|
|
42032
42102
|
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
42033
42103
|
argumentosResolvidos.push(argumentoResolvido);
|
|
42034
42104
|
}
|
|
42105
|
+
const textoArgumentos = argumentosResolvidos.join(', ');
|
|
42035
42106
|
switch (nomeMetodo) {
|
|
42036
42107
|
case 'adicionar':
|
|
42037
42108
|
case 'empilhar':
|
|
42038
|
-
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
42039
|
-
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
42040
42109
|
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
42110
|
+
case 'concatenar':
|
|
42111
|
+
return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
|
|
42112
|
+
case 'encaixar':
|
|
42113
|
+
return `${objetoResolvido}.splice(${textoArgumentos})`;
|
|
42041
42114
|
case 'fatiar':
|
|
42042
|
-
return `${objetoResolvido}
|
|
42115
|
+
return `${objetoResolvido}.slice(${textoArgumentos})`;
|
|
42116
|
+
case 'filtrarPor':
|
|
42117
|
+
return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
42043
42118
|
case 'inclui':
|
|
42044
|
-
return `${
|
|
42119
|
+
return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
|
|
42045
42120
|
case 'inverter':
|
|
42046
|
-
return
|
|
42121
|
+
return `${objetoResolvido}.toReversed()`;
|
|
42047
42122
|
case 'juntar':
|
|
42048
|
-
return
|
|
42123
|
+
return argumentosResolvidos.length > 0
|
|
42124
|
+
? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
|
|
42125
|
+
: `${objetoResolvido}.join()`;
|
|
42049
42126
|
case 'mapear':
|
|
42050
|
-
return
|
|
42127
|
+
return `${objetoResolvido}.map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
42051
42128
|
case 'ordenar':
|
|
42052
|
-
return
|
|
42129
|
+
return argumentosResolvidos.length > 0
|
|
42130
|
+
? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
|
|
42131
|
+
: `${objetoResolvido}.sort()`;
|
|
42053
42132
|
case 'remover':
|
|
42054
|
-
return
|
|
42133
|
+
return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
|
|
42055
42134
|
case 'removerPrimeiro':
|
|
42056
|
-
return
|
|
42135
|
+
return `${objetoResolvido}.shift()`;
|
|
42057
42136
|
case 'removerUltimo':
|
|
42058
|
-
return
|
|
42137
|
+
return `${objetoResolvido}.pop()`;
|
|
42059
42138
|
case 'somar':
|
|
42060
|
-
return
|
|
42139
|
+
return `${objetoResolvido}.reduce((acumulador, valorAtual) => acumulador + valorAtual, 0)`;
|
|
42061
42140
|
case 'tamanho':
|
|
42062
|
-
return
|
|
42141
|
+
return `${objetoResolvido}.length`;
|
|
42063
42142
|
}
|
|
42064
42143
|
}
|
|
42065
42144
|
traduzirExpressaoAcessoMetodo(acessoMetodo, argumentos) {
|
|
@@ -42108,16 +42187,14 @@ class TradutorJavaScript {
|
|
|
42108
42187
|
let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
42109
42188
|
return `${direita} ${operador} ${esquerda}`;
|
|
42110
42189
|
}
|
|
42111
|
-
// TODO: Eliminar o soft cast para `any`.
|
|
42112
42190
|
traduzirExpressaoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
42113
|
-
var _a, _b;
|
|
42114
42191
|
let resultado = '';
|
|
42115
42192
|
resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
|
|
42116
42193
|
resultado +=
|
|
42117
42194
|
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
|
|
42118
42195
|
resultado += ' = ';
|
|
42119
|
-
if (
|
|
42120
|
-
resultado +=
|
|
42196
|
+
if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
|
|
42197
|
+
resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
|
|
42121
42198
|
}
|
|
42122
42199
|
else {
|
|
42123
42200
|
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);
|