@designliquido/delegua 1.7.3 → 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 +33 -43
- 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 +2 -3
- 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/variavel-hipotetica-interface.d.ts +2 -2
- package/interfaces/variavel-hipotetica-interface.d.ts.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/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/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 +256 -188
- 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'.");
|
|
@@ -5840,7 +5921,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
5840
5921
|
* @returns {ListaCompreensao} A lista de compreensão resolvida.
|
|
5841
5922
|
*/
|
|
5842
5923
|
async resolverCompreensaoDeLista(retornoExpressao) {
|
|
5843
|
-
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.");
|
|
5844
5925
|
this.consumir(pitugues_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
|
|
5845
5926
|
const simboloVariavelIteracao = this.consumir(pitugues_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
|
|
5846
5927
|
// TODO: Manter essa validação aqui? Se sim, como resolver a expressão?
|
|
@@ -6588,8 +6669,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
6588
6669
|
case prisma_1.default.TEXTO:
|
|
6589
6670
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
6590
6671
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloLiteral.literal);
|
|
6591
|
-
|
|
6592
|
-
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);
|
|
6593
6673
|
case prisma_1.default.IDENTIFICADOR:
|
|
6594
6674
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
6595
6675
|
let tipoOperando;
|
|
@@ -7414,8 +7494,7 @@ class AvaliadorSintaticoTenda extends avaliador_sintatico_base_1.AvaliadorSintat
|
|
|
7414
7494
|
case tenda_1.default.TEXTO:
|
|
7415
7495
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
7416
7496
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
7417
|
-
|
|
7418
|
-
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);
|
|
7419
7498
|
case tenda_1.default.PARENTESE_ESQUERDO:
|
|
7420
7499
|
this.avancarEDevolverAnterior();
|
|
7421
7500
|
const expressao = await this.expressao();
|
|
@@ -8261,8 +8340,7 @@ class MicroAvaliadorSintaticoPitugues extends micro_avaliador_sintatico_base_1.M
|
|
|
8261
8340
|
case pitugues_1.default.TEXTO:
|
|
8262
8341
|
const simboloNumeroTexto = this.avancarEDevolverAnterior();
|
|
8263
8342
|
const tipoInferido = (0, inferenciador_1.inferirTipoVariavel)(simboloNumeroTexto.literal);
|
|
8264
|
-
|
|
8265
|
-
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);
|
|
8266
8344
|
case pitugues_1.default.IDENTIFICADOR:
|
|
8267
8345
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
8268
8346
|
return new construtos_1.Variavel(-1, simboloIdentificador);
|
|
@@ -8633,31 +8711,24 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
8633
8711
|
const simboloAtual = this.simbolos[this.atual];
|
|
8634
8712
|
let valores = [];
|
|
8635
8713
|
switch (simboloAtual.tipo) {
|
|
8636
|
-
|
|
8637
|
-
/* case tiposDeSimbolos.CHAVE_ESQUERDA:
|
|
8714
|
+
case delegua_1.default.CHAVE_ESQUERDA:
|
|
8638
8715
|
this.avancarEDevolverAnterior();
|
|
8639
8716
|
const chaves = [];
|
|
8640
8717
|
valores = [];
|
|
8641
|
-
|
|
8642
|
-
|
|
8643
|
-
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), [], []);
|
|
8644
8720
|
}
|
|
8645
|
-
|
|
8646
|
-
|
|
8647
|
-
|
|
8648
|
-
|
|
8649
|
-
const valor = this.atribuir();
|
|
8650
|
-
|
|
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();
|
|
8651
8725
|
chaves.push(chave);
|
|
8652
8726
|
valores.push(valor);
|
|
8653
|
-
|
|
8654
|
-
|
|
8655
|
-
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.');
|
|
8656
8729
|
}
|
|
8657
8730
|
}
|
|
8658
|
-
|
|
8659
|
-
return new Dicionario(-1, Number(this.linha), chaves, valores); */
|
|
8660
|
-
// TODO: Verificar se vamos usar isso.
|
|
8731
|
+
return new construtos_1.Dicionario(-1, Number(this.linha), chaves, valores);
|
|
8661
8732
|
case delegua_1.default.COLCHETE_ESQUERDO:
|
|
8662
8733
|
this.avancarEDevolverAnterior();
|
|
8663
8734
|
valores = [];
|
|
@@ -9610,20 +9681,6 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
9610
9681
|
}, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
|
|
9611
9682
|
const valorVetor = interpretador.resolverValor(vetor);
|
|
9612
9683
|
const valorFuncaoMapeamento = interpretador.resolverValor(funcaoMapeamento);
|
|
9613
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
9614
|
-
// na avaliação sintática. Estudar remoção.
|
|
9615
|
-
if (!Array.isArray(valorVetor)) {
|
|
9616
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9617
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9618
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9619
|
-
}, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
|
|
9620
|
-
}
|
|
9621
|
-
if (valorFuncaoMapeamento.constructor !== estruturas_1.DeleguaFuncao) {
|
|
9622
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9623
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9624
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9625
|
-
}, 'Parâmetro inválido. O segundo parâmetro da função mapear() deve ser uma função.'));
|
|
9626
|
-
}
|
|
9627
9684
|
const resultados = [];
|
|
9628
9685
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
9629
9686
|
const informacoesRetorno = await valorFuncaoMapeamento.chamar(interpretador, [
|
|
@@ -9790,20 +9847,6 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
9790
9847
|
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
9791
9848
|
? funcaoFiltragem.valor
|
|
9792
9849
|
: funcaoFiltragem;
|
|
9793
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
9794
|
-
// na avaliação sintática. Estudar remoção.
|
|
9795
|
-
if (!Array.isArray(valorVetor)) {
|
|
9796
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9797
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9798
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9799
|
-
}, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
|
|
9800
|
-
}
|
|
9801
|
-
if (valorFuncaoFiltragem.constructor !== estruturas_1.DeleguaFuncao) {
|
|
9802
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
9803
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
9804
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
9805
|
-
}, 'Parâmetro inválido. O segundo parâmetro da função paraCada() deve ser uma função.'));
|
|
9806
|
-
}
|
|
9807
9850
|
for (let indice = 0; indice < valorVetor.length; ++indice) {
|
|
9808
9851
|
await valorFuncaoFiltragem.chamar(interpretador, [valorVetor[indice]]);
|
|
9809
9852
|
}
|
|
@@ -10069,21 +10112,11 @@ async function todosEmCondicao(interpretador, iteravel, funcaoCondicional) {
|
|
|
10069
10112
|
*/
|
|
10070
10113
|
async function tupla(interpretador, vetor) {
|
|
10071
10114
|
const valorVetor = interpretador.resolverValor(vetor);
|
|
10072
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
10073
|
-
// na avaliação sintática. Estudar remoção.
|
|
10074
|
-
if (!Array.isArray(valorVetor)) {
|
|
10075
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10076
|
-
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
10077
|
-
linha: interpretador.linhaDeclaracaoAtual,
|
|
10078
|
-
}, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
|
|
10079
|
-
}
|
|
10080
10115
|
const elementos = valorVetor.map(item => new construtos_1.Literal(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, interpretador.resolverValor(item)));
|
|
10081
10116
|
return new construtos_1.TuplaN(interpretador.hashArquivoDeclaracaoAtual, interpretador.linhaDeclaracaoAtual, elementos);
|
|
10082
10117
|
}
|
|
10083
10118
|
async function vetor(interpretador, tupla) {
|
|
10084
10119
|
const objetoTupla = interpretador.resolverValor(tupla);
|
|
10085
|
-
// TODO: As lógicas de validação abaixo deixam de fazer sentido com a validação de argumentos feita
|
|
10086
|
-
// na avaliação sintática. Estudar remoção.
|
|
10087
10120
|
if (!(objetoTupla instanceof construtos_1.Tupla || objetoTupla instanceof construtos_1.TuplaN)) {
|
|
10088
10121
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao({
|
|
10089
10122
|
hashArquivo: interpretador.hashArquivoDeclaracaoAtual,
|
|
@@ -10096,16 +10129,20 @@ async function vetor(interpretador, tupla) {
|
|
|
10096
10129
|
}
|
|
10097
10130
|
else {
|
|
10098
10131
|
const nomeClasse = objetoTupla.constructor.name;
|
|
10099
|
-
|
|
10100
|
-
|
|
10132
|
+
const props = mapaPropriedadesTuplas[nomeClasse];
|
|
10133
|
+
if (props) {
|
|
10101
10134
|
resultado = props.map(prop => objetoTupla[prop]);
|
|
10102
10135
|
}
|
|
10103
10136
|
else if (objetoTupla.elementos && Array.isArray(objetoTupla.elementos)) {
|
|
10104
10137
|
resultado = objetoTupla.elementos;
|
|
10105
10138
|
}
|
|
10106
10139
|
}
|
|
10107
|
-
const resultadoFinal =
|
|
10108
|
-
|
|
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;
|
|
10109
10146
|
}
|
|
10110
10147
|
|
|
10111
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){
|
|
@@ -11350,19 +11387,24 @@ exports.AtribuicaoPorIndicesMatriz = AtribuicaoPorIndicesMatriz;
|
|
|
11350
11387
|
"use strict";
|
|
11351
11388
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11352
11389
|
exports.Atribuir = void 0;
|
|
11390
|
+
const variavel_1 = require("./variavel");
|
|
11353
11391
|
/**
|
|
11354
11392
|
* Construto de atribuição de um valor a um símbolo.
|
|
11355
11393
|
*/
|
|
11356
11394
|
class Atribuir {
|
|
11357
|
-
constructor(hashArquivo, alvo, valor,
|
|
11358
|
-
// indice so é usado para variaveis de vetores
|
|
11359
|
-
// TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
|
|
11360
|
-
indice, simboloOperador) {
|
|
11395
|
+
constructor(hashArquivo, alvo, valor, indice, simboloOperador) {
|
|
11361
11396
|
this.linha = Number(alvo.linha);
|
|
11362
11397
|
this.hashArquivo = hashArquivo;
|
|
11363
11398
|
this.alvo = alvo;
|
|
11364
11399
|
this.valor = valor;
|
|
11365
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
|
+
}
|
|
11366
11408
|
this.indice = indice;
|
|
11367
11409
|
}
|
|
11368
11410
|
if (simboloOperador !== undefined) {
|
|
@@ -11385,7 +11427,7 @@ class Atribuir {
|
|
|
11385
11427
|
}
|
|
11386
11428
|
exports.Atribuir = Atribuir;
|
|
11387
11429
|
|
|
11388
|
-
},{}],45:[function(require,module,exports){
|
|
11430
|
+
},{"./variavel":89}],45:[function(require,module,exports){
|
|
11389
11431
|
"use strict";
|
|
11390
11432
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11391
11433
|
exports.Binario = void 0;
|
|
@@ -15435,7 +15477,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15435
15477
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15436
15478
|
exports.TipoNativoSimbolo = void 0;
|
|
15437
15479
|
exports.inferirTipoVariavel = inferirTipoVariavel;
|
|
15438
|
-
exports.tipoInferenciaParaTipoDadosElementar = tipoInferenciaParaTipoDadosElementar;
|
|
15439
15480
|
const primitivos_1 = __importDefault(require("./tipos-de-dados/primitivos"));
|
|
15440
15481
|
const delegua_1 = __importDefault(require("./tipos-de-dados/delegua"));
|
|
15441
15482
|
const delegua_2 = __importDefault(require("./tipos-de-simbolos/delegua"));
|
|
@@ -15549,13 +15590,6 @@ function inferirTipoVariavel(variavel) {
|
|
|
15549
15590
|
return 'símbolo';
|
|
15550
15591
|
}
|
|
15551
15592
|
}
|
|
15552
|
-
function tipoInferenciaParaTipoDadosElementar(tipoInferencia) {
|
|
15553
|
-
switch (tipoInferencia) {
|
|
15554
|
-
// TODO: Colocar exceções aqui.
|
|
15555
|
-
default:
|
|
15556
|
-
return tipoInferencia;
|
|
15557
|
-
}
|
|
15558
|
-
}
|
|
15559
15593
|
|
|
15560
15594
|
},{"./tipos-de-dados/delegua":213,"./tipos-de-dados/primitivos":215,"./tipos-de-simbolos/delegua":218}],136:[function(require,module,exports){
|
|
15561
15595
|
"use strict";
|
|
@@ -18124,7 +18158,6 @@ class InterpretadorBase {
|
|
|
18124
18158
|
return await this.executar(declaracao.caminhoEntao);
|
|
18125
18159
|
}
|
|
18126
18160
|
for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
|
|
18127
|
-
// TODO: Qual o tipo de `atual`?
|
|
18128
18161
|
const atual = declaracao.caminhosSeSenao[i];
|
|
18129
18162
|
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
18130
18163
|
return await this.executar(atual.caminho);
|
|
@@ -24742,6 +24775,7 @@ exports.default = {
|
|
|
24742
24775
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24743
24776
|
exports.default = {
|
|
24744
24777
|
ADICAO: 'ADICAO',
|
|
24778
|
+
CHAVE_ESQUERDA: 'CHAVE_ESQUERDA',
|
|
24745
24779
|
DIFERENTE: 'DIFERENTE',
|
|
24746
24780
|
DIVISAO: 'DIVISAO',
|
|
24747
24781
|
DIVISAO_INTEIRA: 'DIVISAO_INTEIRA',
|
|
@@ -41595,14 +41629,22 @@ class TradutorJavaScript {
|
|
|
41595
41629
|
case 'adicionar':
|
|
41596
41630
|
case 'empilhar':
|
|
41597
41631
|
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
41632
|
+
case 'concatenar':
|
|
41633
|
+
return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
|
|
41634
|
+
case 'encaixar':
|
|
41635
|
+
return `${objetoResolvido}.splice(${textoArgumentos})`;
|
|
41598
41636
|
case 'fatiar':
|
|
41599
|
-
return `${objetoResolvido}.slice(${
|
|
41637
|
+
return `${objetoResolvido}.slice(${textoArgumentos})`;
|
|
41638
|
+
case 'filtrarPor':
|
|
41639
|
+
return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
41600
41640
|
case 'inclui':
|
|
41601
41641
|
return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
|
|
41602
41642
|
case 'inverter':
|
|
41603
41643
|
return `${objetoResolvido}.toReversed()`;
|
|
41604
41644
|
case 'juntar':
|
|
41605
|
-
return
|
|
41645
|
+
return argumentosResolvidos.length > 0
|
|
41646
|
+
? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
|
|
41647
|
+
: `${objetoResolvido}.join()`;
|
|
41606
41648
|
case 'maiusculo':
|
|
41607
41649
|
return `${objetoResolvido}.toUpperCase()`;
|
|
41608
41650
|
case 'mapear':
|
|
@@ -41610,9 +41652,11 @@ class TradutorJavaScript {
|
|
|
41610
41652
|
case 'minusculo':
|
|
41611
41653
|
return `${objetoResolvido}.toLowerCase()`;
|
|
41612
41654
|
case 'ordenar':
|
|
41613
|
-
return
|
|
41655
|
+
return argumentosResolvidos.length > 0
|
|
41656
|
+
? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
|
|
41657
|
+
: `${objetoResolvido}.sort()`;
|
|
41614
41658
|
case 'remover':
|
|
41615
|
-
return
|
|
41659
|
+
return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
|
|
41616
41660
|
case 'removerPrimeiro':
|
|
41617
41661
|
return `${objetoResolvido}.shift()`;
|
|
41618
41662
|
case 'removerUltimo':
|
|
@@ -42030,9 +42074,26 @@ class TradutorJavaScript {
|
|
|
42030
42074
|
}
|
|
42031
42075
|
return resultado;
|
|
42032
42076
|
}
|
|
42033
|
-
// TODO: Talvez terminar (ou remover, sei lá).
|
|
42034
42077
|
traduzirFuncaoAnonimaParaLambda(argumento) {
|
|
42035
|
-
|
|
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 : '';
|
|
42036
42097
|
}
|
|
42037
42098
|
traduzirExpressaoAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
|
|
42038
42099
|
const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
|
|
@@ -42041,34 +42102,43 @@ class TradutorJavaScript {
|
|
|
42041
42102
|
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
42042
42103
|
argumentosResolvidos.push(argumentoResolvido);
|
|
42043
42104
|
}
|
|
42105
|
+
const textoArgumentos = argumentosResolvidos.join(', ');
|
|
42044
42106
|
switch (nomeMetodo) {
|
|
42045
42107
|
case 'adicionar':
|
|
42046
42108
|
case 'empilhar':
|
|
42047
|
-
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
42048
|
-
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
42049
42109
|
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
42110
|
+
case 'concatenar':
|
|
42111
|
+
return `${objetoResolvido}.concat(${argumentosResolvidos[0]})`;
|
|
42112
|
+
case 'encaixar':
|
|
42113
|
+
return `${objetoResolvido}.splice(${textoArgumentos})`;
|
|
42050
42114
|
case 'fatiar':
|
|
42051
|
-
return `${objetoResolvido}
|
|
42115
|
+
return `${objetoResolvido}.slice(${textoArgumentos})`;
|
|
42116
|
+
case 'filtrarPor':
|
|
42117
|
+
return `${objetoResolvido}.filter(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
42052
42118
|
case 'inclui':
|
|
42053
|
-
return `${
|
|
42119
|
+
return `${objetoResolvido}.includes(${argumentosResolvidos[0]})`;
|
|
42054
42120
|
case 'inverter':
|
|
42055
|
-
return
|
|
42121
|
+
return `${objetoResolvido}.toReversed()`;
|
|
42056
42122
|
case 'juntar':
|
|
42057
|
-
return
|
|
42123
|
+
return argumentosResolvidos.length > 0
|
|
42124
|
+
? `${objetoResolvido}.join(${argumentosResolvidos[0]})`
|
|
42125
|
+
: `${objetoResolvido}.join()`;
|
|
42058
42126
|
case 'mapear':
|
|
42059
|
-
return
|
|
42127
|
+
return `${objetoResolvido}.map(${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
42060
42128
|
case 'ordenar':
|
|
42061
|
-
return
|
|
42129
|
+
return argumentosResolvidos.length > 0
|
|
42130
|
+
? `${objetoResolvido}.sort(${argumentosResolvidos[0]})`
|
|
42131
|
+
: `${objetoResolvido}.sort()`;
|
|
42062
42132
|
case 'remover':
|
|
42063
|
-
return
|
|
42133
|
+
return `${objetoResolvido}.splice(${objetoResolvido}.indexOf(${argumentosResolvidos[0]}), 1)`;
|
|
42064
42134
|
case 'removerPrimeiro':
|
|
42065
|
-
return
|
|
42135
|
+
return `${objetoResolvido}.shift()`;
|
|
42066
42136
|
case 'removerUltimo':
|
|
42067
|
-
return
|
|
42137
|
+
return `${objetoResolvido}.pop()`;
|
|
42068
42138
|
case 'somar':
|
|
42069
|
-
return
|
|
42139
|
+
return `${objetoResolvido}.reduce((acumulador, valorAtual) => acumulador + valorAtual, 0)`;
|
|
42070
42140
|
case 'tamanho':
|
|
42071
|
-
return
|
|
42141
|
+
return `${objetoResolvido}.length`;
|
|
42072
42142
|
}
|
|
42073
42143
|
}
|
|
42074
42144
|
traduzirExpressaoAcessoMetodo(acessoMetodo, argumentos) {
|
|
@@ -42117,16 +42187,14 @@ class TradutorJavaScript {
|
|
|
42117
42187
|
let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
42118
42188
|
return `${direita} ${operador} ${esquerda}`;
|
|
42119
42189
|
}
|
|
42120
|
-
// TODO: Eliminar o soft cast para `any`.
|
|
42121
42190
|
traduzirExpressaoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
42122
|
-
var _a, _b;
|
|
42123
42191
|
let resultado = '';
|
|
42124
42192
|
resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
|
|
42125
42193
|
resultado +=
|
|
42126
42194
|
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
|
|
42127
42195
|
resultado += ' = ';
|
|
42128
|
-
if (
|
|
42129
|
-
resultado +=
|
|
42196
|
+
if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
|
|
42197
|
+
resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
|
|
42130
42198
|
}
|
|
42131
42199
|
else {
|
|
42132
42200
|
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);
|