@designliquido/delegua 0.36.2 → 0.37.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.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +71 -50
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +52 -43
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +24 -32
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +49 -101
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +7 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +8 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts +4 -16
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.js +1 -84
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +1 -1
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +5 -15
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +1 -3
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +9 -9
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js.map +1 -1
- package/construtos/chamada.d.ts +2 -2
- package/construtos/chamada.d.ts.map +1 -1
- package/construtos/chamada.js.map +1 -1
- package/construtos/comentario.d.ts +2 -2
- package/construtos/constante.d.ts.map +1 -1
- package/construtos/constante.js.map +1 -1
- package/construtos/decorador.d.ts +6 -2
- package/construtos/decorador.d.ts.map +1 -1
- package/construtos/decorador.js +2 -2
- package/construtos/decorador.js.map +1 -1
- package/construtos/expressao-regular.d.ts.map +1 -1
- package/construtos/expressao-regular.js.map +1 -1
- package/construtos/qual-tipo.d.ts.map +1 -1
- package/construtos/qual-tipo.js.map +1 -1
- package/construtos/tipo-de.d.ts.map +1 -1
- package/construtos/tipo-de.js.map +1 -1
- package/construtos/variavel.d.ts.map +1 -1
- package/construtos/variavel.js.map +1 -1
- package/declaracoes/const.d.ts +2 -2
- package/declaracoes/const.d.ts.map +1 -1
- package/declaracoes/const.js +2 -2
- package/declaracoes/const.js.map +1 -1
- package/declaracoes/declaracao.d.ts +3 -1
- package/declaracoes/declaracao.d.ts.map +1 -1
- package/declaracoes/declaracao.js +3 -2
- package/declaracoes/declaracao.js.map +1 -1
- package/declaracoes/expressao.d.ts +2 -2
- package/declaracoes/expressao.d.ts.map +1 -1
- package/declaracoes/expressao.js +2 -2
- package/declaracoes/expressao.js.map +1 -1
- package/declaracoes/tendo-como.d.ts.map +1 -1
- package/declaracoes/tendo-como.js.map +1 -1
- package/declaracoes/var.d.ts +2 -2
- package/declaracoes/var.d.ts.map +1 -1
- package/declaracoes/var.js +2 -2
- package/declaracoes/var.js.map +1 -1
- package/estruturas/chamavel.d.ts.map +1 -1
- package/estruturas/chamavel.js.map +1 -1
- package/estruturas/classe-padrao.d.ts.map +1 -1
- package/estruturas/delegua-funcao.d.ts.map +1 -1
- package/estruturas/delegua-funcao.js +1 -2
- package/estruturas/delegua-funcao.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +2 -2
- package/formatadores/formatador-delegua.js.map +1 -1
- package/interfaces/avaliador-sintatico-interface.d.ts +0 -45
- package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
- package/interfaces/formatador-comum-interface.d.ts +2 -2
- package/interfaces/retornos/retorno-execucao-interface.d.ts +1 -1
- package/interfaces/variavel-interface.d.ts +1 -1
- package/interfaces/variavel-interface.d.ts.map +1 -1
- package/interpretador/comum.d.ts +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/inferenciador.d.ts +1 -1
- package/interpretador/inferenciador.d.ts.map +1 -1
- package/interpretador/inferenciador.js +1 -1
- package/interpretador/inferenciador.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +3 -6
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador-com-depuracao.d.ts.map +1 -1
- package/interpretador/interpretador-com-depuracao.js +4 -2
- package/interpretador/interpretador-com-depuracao.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +5 -5
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/package.json +9 -9
- package/tradutores/tradutor-assembly-x64.js +13 -13
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +137 -276
package/umd/delegua.js
CHANGED
|
@@ -15,9 +15,6 @@ const comum_1 = __importDefault(require("../tipos-de-simbolos/comum"));
|
|
|
15
15
|
* de tipos de símbolos comuns entre todos os dialetos.
|
|
16
16
|
*/
|
|
17
17
|
class AvaliadorSintaticoBase {
|
|
18
|
-
declaracaoDeVariaveis() {
|
|
19
|
-
throw new Error('Método não implementado.');
|
|
20
|
-
}
|
|
21
18
|
consumir(tipo, mensagemDeErro) {
|
|
22
19
|
if (this.verificarTipoSimboloAtual(tipo))
|
|
23
20
|
return this.avancarEDevolverAnterior();
|
|
@@ -47,6 +44,8 @@ class AvaliadorSintaticoBase {
|
|
|
47
44
|
this.atual += 1;
|
|
48
45
|
return this.simbolos[this.atual - 1];
|
|
49
46
|
}
|
|
47
|
+
// TODO: Verificar possibilidade de remoção.
|
|
48
|
+
// Regressão de símbolo é uma roubada por N razões.
|
|
50
49
|
regredirEDevolverAtual() {
|
|
51
50
|
if (this.atual > 0)
|
|
52
51
|
this.atual -= 1;
|
|
@@ -62,13 +61,11 @@ class AvaliadorSintaticoBase {
|
|
|
62
61
|
}
|
|
63
62
|
return false;
|
|
64
63
|
}
|
|
65
|
-
declaracaoLeia() {
|
|
66
|
-
throw new Error('Método não implementado.');
|
|
67
|
-
}
|
|
68
64
|
finalizarChamada(entidadeChamada) {
|
|
69
65
|
const argumentos = [];
|
|
70
66
|
if (!this.verificarTipoSimboloAtual(comum_1.default.PARENTESE_DIREITO)) {
|
|
71
67
|
do {
|
|
68
|
+
// `apply()` em JavaScript aceita até 255 parâmetros.
|
|
72
69
|
if (argumentos.length >= 255) {
|
|
73
70
|
throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
|
|
74
71
|
}
|
|
@@ -113,13 +110,11 @@ class AvaliadorSintaticoBase {
|
|
|
113
110
|
}
|
|
114
111
|
return expressao;
|
|
115
112
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
bitOu() {
|
|
113
|
+
/**
|
|
114
|
+
* Este método é usado por alguns dialetos de Portugol que possuem declarações
|
|
115
|
+
* de múltiplas variáveis na mesma linha.
|
|
116
|
+
*/
|
|
117
|
+
declaracaoDeVariaveis() {
|
|
123
118
|
throw new Error('Método não implementado.');
|
|
124
119
|
}
|
|
125
120
|
comparar() {
|
|
@@ -140,9 +135,6 @@ class AvaliadorSintaticoBase {
|
|
|
140
135
|
}
|
|
141
136
|
return expressao;
|
|
142
137
|
}
|
|
143
|
-
em() {
|
|
144
|
-
throw new Error('Método não implementado.');
|
|
145
|
-
}
|
|
146
138
|
e() {
|
|
147
139
|
let expressao = this.comparacaoIgualdade();
|
|
148
140
|
while (this.verificarSeSimboloAtualEIgualA(comum_1.default.E)) {
|
|
@@ -164,38 +156,11 @@ class AvaliadorSintaticoBase {
|
|
|
164
156
|
expressao() {
|
|
165
157
|
return this.atribuir();
|
|
166
158
|
}
|
|
167
|
-
declaracaoExpressao(simboloAnterior) {
|
|
168
|
-
throw new Error('Método não implementado.');
|
|
169
|
-
}
|
|
170
|
-
declaracaoSustar() {
|
|
171
|
-
throw new Error('Método não implementado.');
|
|
172
|
-
}
|
|
173
|
-
declaracaoContinua() {
|
|
174
|
-
throw new Error('Método não implementado.');
|
|
175
|
-
}
|
|
176
|
-
declaracaoRetorna() {
|
|
177
|
-
throw new Error('Método não implementado.');
|
|
178
|
-
}
|
|
179
|
-
declaracaoImportar() {
|
|
180
|
-
throw new Error('Método não implementado.');
|
|
181
|
-
}
|
|
182
|
-
declaracaoTente() {
|
|
183
|
-
throw new Error('Método não implementado.');
|
|
184
|
-
}
|
|
185
|
-
resolverDeclaracao() {
|
|
186
|
-
throw new Error('Método não implementado.');
|
|
187
|
-
}
|
|
188
|
-
declaracaoDeVariavel() {
|
|
189
|
-
throw new Error('Método não implementado.');
|
|
190
|
-
}
|
|
191
159
|
funcao(tipo) {
|
|
192
160
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
193
161
|
const nomeFuncao = this.consumir(comum_1.default.IDENTIFICADOR, `Esperado nome ${tipo}.`);
|
|
194
162
|
return new declaracoes_1.FuncaoDeclaracao(nomeFuncao, this.corpoDaFuncao(tipo));
|
|
195
163
|
}
|
|
196
|
-
declaracaoDeClasse() {
|
|
197
|
-
throw new Error('Método não implementado.');
|
|
198
|
-
}
|
|
199
164
|
logicaComumParametros() {
|
|
200
165
|
const parametros = [];
|
|
201
166
|
do {
|
|
@@ -220,6 +185,50 @@ class AvaliadorSintaticoBase {
|
|
|
220
185
|
} while (this.verificarSeSimboloAtualEIgualA(comum_1.default.VIRGULA));
|
|
221
186
|
return parametros;
|
|
222
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Os métodos a seguir só devem ser implementados se o dialeto
|
|
190
|
+
* em questão realmente possui a funcionalidade, e devem levantar
|
|
191
|
+
* erro em caso contrário.
|
|
192
|
+
*/
|
|
193
|
+
bitShift() {
|
|
194
|
+
throw new Error('Método não implementado.');
|
|
195
|
+
}
|
|
196
|
+
bitE() {
|
|
197
|
+
throw new Error('Método não implementado.');
|
|
198
|
+
}
|
|
199
|
+
bitOu() {
|
|
200
|
+
throw new Error('Método não implementado.');
|
|
201
|
+
}
|
|
202
|
+
declaracaoContinua() {
|
|
203
|
+
throw new Error('Método não implementado.');
|
|
204
|
+
}
|
|
205
|
+
declaracaoDeClasse() {
|
|
206
|
+
throw new Error('Método não implementado.');
|
|
207
|
+
}
|
|
208
|
+
declaracaoDeVariavel() {
|
|
209
|
+
throw new Error('Método não implementado.');
|
|
210
|
+
}
|
|
211
|
+
declaracaoExpressao(simboloAnterior) {
|
|
212
|
+
throw new Error('Método não implementado.');
|
|
213
|
+
}
|
|
214
|
+
declaracaoImportar() {
|
|
215
|
+
throw new Error('Método não implementado.');
|
|
216
|
+
}
|
|
217
|
+
declaracaoRetorna() {
|
|
218
|
+
throw new Error('Método não implementado.');
|
|
219
|
+
}
|
|
220
|
+
declaracaoSustar() {
|
|
221
|
+
throw new Error('Método não implementado.');
|
|
222
|
+
}
|
|
223
|
+
declaracaoTente() {
|
|
224
|
+
throw new Error('Método não implementado.');
|
|
225
|
+
}
|
|
226
|
+
em() {
|
|
227
|
+
throw new Error('Método não implementado.');
|
|
228
|
+
}
|
|
229
|
+
resolverDeclaracao() {
|
|
230
|
+
throw new Error('Método não implementado.');
|
|
231
|
+
}
|
|
223
232
|
}
|
|
224
233
|
exports.AvaliadorSintaticoBase = AvaliadorSintaticoBase;
|
|
225
234
|
|
|
@@ -238,43 +247,24 @@ const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
|
|
|
238
247
|
const tuplas_1 = require("../construtos/tuplas");
|
|
239
248
|
const declaracoes_1 = require("../declaracoes");
|
|
240
249
|
const lexador_1 = require("../lexador");
|
|
250
|
+
const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
|
|
241
251
|
/**
|
|
242
252
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
243
253
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
244
254
|
* Há dois grupos de estruturas de alto nível: Construtos e Declarações.
|
|
245
255
|
*/
|
|
246
|
-
class AvaliadorSintatico {
|
|
256
|
+
class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
247
257
|
constructor(performance = false) {
|
|
258
|
+
super();
|
|
248
259
|
this.hashArquivo = 0;
|
|
249
260
|
this.atual = 0;
|
|
250
261
|
this.blocos = 0;
|
|
251
262
|
this.erros = [];
|
|
252
263
|
this.performance = performance;
|
|
253
264
|
}
|
|
254
|
-
declaracaoDeVariavel() {
|
|
255
|
-
throw new Error('Método não implementado.');
|
|
256
|
-
}
|
|
257
|
-
erro(simbolo, mensagemDeErro) {
|
|
258
|
-
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
|
|
259
|
-
this.erros.push(excecao);
|
|
260
|
-
return excecao;
|
|
261
|
-
}
|
|
262
|
-
consumir(tipo, mensagemDeErro) {
|
|
263
|
-
if (this.verificarTipoSimboloAtual(tipo))
|
|
264
|
-
return this.avancarEDevolverAnterior();
|
|
265
|
-
throw this.erro(this.simbolos[this.atual], mensagemDeErro);
|
|
266
|
-
}
|
|
267
|
-
verificarTipoSimboloAtual(tipo) {
|
|
268
|
-
if (this.estaNoFinal())
|
|
269
|
-
return false;
|
|
270
|
-
return this.simbolos[this.atual].tipo === tipo;
|
|
271
|
-
}
|
|
272
|
-
verificarTipoProximoSimbolo(tipo) {
|
|
273
|
-
return this.simbolos[this.atual + 1].tipo === tipo;
|
|
274
|
-
}
|
|
275
265
|
verificarDefinicaoTipoAtual() {
|
|
276
266
|
const tipos = [...Object.values(delegua_1.default)];
|
|
277
|
-
const lexema = this.
|
|
267
|
+
const lexema = this.simbolos[this.atual].lexema.toLowerCase();
|
|
278
268
|
const contemTipo = tipos.find((tipo) => tipo === lexema);
|
|
279
269
|
if (contemTipo && this.verificarTipoProximoSimbolo(delegua_2.default.COLCHETE_ESQUERDO)) {
|
|
280
270
|
const tiposVetores = ['inteiro[]', 'numero[]', 'número[]', 'qualquer[]', 'real[]', 'texto[]'];
|
|
@@ -288,30 +278,6 @@ class AvaliadorSintatico {
|
|
|
288
278
|
}
|
|
289
279
|
return contemTipo;
|
|
290
280
|
}
|
|
291
|
-
simboloAtual() {
|
|
292
|
-
return this.simbolos[this.atual];
|
|
293
|
-
}
|
|
294
|
-
simboloAnterior() {
|
|
295
|
-
return this.simbolos[this.atual - 1];
|
|
296
|
-
}
|
|
297
|
-
estaNoFinal() {
|
|
298
|
-
return this.atual === this.simbolos.length;
|
|
299
|
-
}
|
|
300
|
-
avancarEDevolverAnterior() {
|
|
301
|
-
if (!this.estaNoFinal())
|
|
302
|
-
this.atual += 1;
|
|
303
|
-
return this.simbolos[this.atual - 1];
|
|
304
|
-
}
|
|
305
|
-
verificarSeSimboloAtualEIgualA(...argumentos) {
|
|
306
|
-
for (let i = 0; i < argumentos.length; i++) {
|
|
307
|
-
const tipoAtual = argumentos[i];
|
|
308
|
-
if (this.verificarTipoSimboloAtual(tipoAtual)) {
|
|
309
|
-
this.avancarEDevolverAnterior();
|
|
310
|
-
return true;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
return false;
|
|
314
|
-
}
|
|
315
281
|
primario() {
|
|
316
282
|
const simboloAtual = this.simbolos[this.atual];
|
|
317
283
|
let valores = [];
|
|
@@ -434,7 +400,7 @@ class AvaliadorSintatico {
|
|
|
434
400
|
if (eParExpressaoRegular) {
|
|
435
401
|
this.avancarEDevolverAnterior();
|
|
436
402
|
while (!this.verificarTipoSimboloAtual(delegua_2.default.EXPRESSAO_REGULAR)) {
|
|
437
|
-
valor += this.
|
|
403
|
+
valor += this.simbolos[this.atual].lexema || '';
|
|
438
404
|
this.avancarEDevolverAnterior();
|
|
439
405
|
}
|
|
440
406
|
this.avancarEDevolverAnterior();
|
|
@@ -443,19 +409,6 @@ class AvaliadorSintatico {
|
|
|
443
409
|
}
|
|
444
410
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
445
411
|
}
|
|
446
|
-
finalizarChamada(entidadeChamada) {
|
|
447
|
-
const argumentos = [];
|
|
448
|
-
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
449
|
-
do {
|
|
450
|
-
if (argumentos.length >= 255) {
|
|
451
|
-
throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
|
|
452
|
-
}
|
|
453
|
-
argumentos.push(this.expressao());
|
|
454
|
-
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
455
|
-
}
|
|
456
|
-
const parenteseDireito = this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
457
|
-
return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
|
|
458
|
-
}
|
|
459
412
|
chamar() {
|
|
460
413
|
let expressao = this.primario();
|
|
461
414
|
while (true) {
|
|
@@ -485,15 +438,6 @@ class AvaliadorSintatico {
|
|
|
485
438
|
}
|
|
486
439
|
return this.chamar();
|
|
487
440
|
}
|
|
488
|
-
exponenciacao() {
|
|
489
|
-
let expressao = this.unario();
|
|
490
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
|
|
491
|
-
const operador = this.simbolos[this.atual - 1];
|
|
492
|
-
const direito = this.unario();
|
|
493
|
-
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
494
|
-
}
|
|
495
|
-
return expressao;
|
|
496
|
-
}
|
|
497
441
|
multiplicar() {
|
|
498
442
|
let expressao = this.exponenciacao();
|
|
499
443
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
|
|
@@ -548,7 +492,7 @@ class AvaliadorSintatico {
|
|
|
548
492
|
let expressao = this.bitOu();
|
|
549
493
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
|
|
550
494
|
const operador = this.simbolos[this.atual - 1];
|
|
551
|
-
const direito = this.bitOu();
|
|
495
|
+
const direito = this.bitOu(); // Única diferença entre esta implementação e base.
|
|
552
496
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
553
497
|
}
|
|
554
498
|
return expressao;
|
|
@@ -580,15 +524,6 @@ class AvaliadorSintatico {
|
|
|
580
524
|
}
|
|
581
525
|
return expressao;
|
|
582
526
|
}
|
|
583
|
-
ou() {
|
|
584
|
-
let expressao = this.e();
|
|
585
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.OU)) {
|
|
586
|
-
const operador = this.simbolos[this.atual - 1];
|
|
587
|
-
const direito = this.e();
|
|
588
|
-
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
589
|
-
}
|
|
590
|
-
return expressao;
|
|
591
|
-
}
|
|
592
527
|
/**
|
|
593
528
|
* Método que resolve atribuições.
|
|
594
529
|
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
|
|
@@ -678,7 +613,8 @@ class AvaliadorSintatico {
|
|
|
678
613
|
const expressao = this.expressao();
|
|
679
614
|
// Ponto-e-vírgula é opcional aqui.
|
|
680
615
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
681
|
-
|
|
616
|
+
const decoradores = Array.from(this.pilhaDecoradores);
|
|
617
|
+
return new declaracoes_1.Expressao(expressao, decoradores);
|
|
682
618
|
}
|
|
683
619
|
declaracaoComentarioMultilinha() {
|
|
684
620
|
let simboloComentario;
|
|
@@ -922,7 +858,6 @@ class AvaliadorSintatico {
|
|
|
922
858
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
923
859
|
}
|
|
924
860
|
resolverDecorador() {
|
|
925
|
-
this.pilhaDecoradores = [];
|
|
926
861
|
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
927
862
|
let nomeDecorador = '';
|
|
928
863
|
let linha;
|
|
@@ -942,7 +877,14 @@ class AvaliadorSintatico {
|
|
|
942
877
|
this.avancarEDevolverAnterior();
|
|
943
878
|
nomeDecorador += simbolo.lexema || '.';
|
|
944
879
|
}
|
|
945
|
-
|
|
880
|
+
const atributos = {};
|
|
881
|
+
for (const parametro of parametros) {
|
|
882
|
+
if (parametro.nome.lexema in atributos) {
|
|
883
|
+
throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
|
|
884
|
+
}
|
|
885
|
+
atributos[parametro.nome.lexema] = parametro.valorPadrao;
|
|
886
|
+
}
|
|
887
|
+
this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
|
|
946
888
|
}
|
|
947
889
|
}
|
|
948
890
|
/**
|
|
@@ -1041,8 +983,11 @@ class AvaliadorSintatico {
|
|
|
1041
983
|
// como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
|
|
1042
984
|
const retornos = [];
|
|
1043
985
|
for (let identificador of identificadores) {
|
|
1044
|
-
|
|
986
|
+
const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
987
|
+
declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
|
|
988
|
+
retornos.push(declaracaoVar);
|
|
1045
989
|
}
|
|
990
|
+
this.pilhaDecoradores = [];
|
|
1046
991
|
return retornos;
|
|
1047
992
|
}
|
|
1048
993
|
/**
|
|
@@ -1051,7 +996,7 @@ class AvaliadorSintatico {
|
|
|
1051
996
|
*/
|
|
1052
997
|
declaracaoDeVariaveis() {
|
|
1053
998
|
const identificadores = [];
|
|
1054
|
-
|
|
999
|
+
const retorno = [];
|
|
1055
1000
|
let tipo = null;
|
|
1056
1001
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
1057
1002
|
return this.declaracaoDesestruturacaoVariavel();
|
|
@@ -1065,10 +1010,11 @@ class AvaliadorSintatico {
|
|
|
1065
1010
|
}
|
|
1066
1011
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1067
1012
|
// Inicialização de variáveis sem valor.
|
|
1068
|
-
for (let
|
|
1069
|
-
retorno.push(new declaracoes_1.Var(identificador, null, tipo));
|
|
1013
|
+
for (let identificador of identificadores.values()) {
|
|
1014
|
+
retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
|
|
1070
1015
|
}
|
|
1071
1016
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1017
|
+
this.pilhaDecoradores = [];
|
|
1072
1018
|
return retorno;
|
|
1073
1019
|
}
|
|
1074
1020
|
const inicializadores = [];
|
|
@@ -1076,13 +1022,14 @@ class AvaliadorSintatico {
|
|
|
1076
1022
|
inicializadores.push(this.expressao());
|
|
1077
1023
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1078
1024
|
if (identificadores.length !== inicializadores.length) {
|
|
1079
|
-
throw this.erro(this.
|
|
1025
|
+
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1080
1026
|
}
|
|
1081
1027
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1082
1028
|
tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
|
|
1083
|
-
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
|
|
1029
|
+
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1084
1030
|
}
|
|
1085
1031
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1032
|
+
this.pilhaDecoradores = [];
|
|
1086
1033
|
return retorno;
|
|
1087
1034
|
}
|
|
1088
1035
|
declaracaoDesestruturacaoConstante() {
|
|
@@ -1097,7 +1044,9 @@ class AvaliadorSintatico {
|
|
|
1097
1044
|
// como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
|
|
1098
1045
|
const retornos = [];
|
|
1099
1046
|
for (let identificador of identificadores) {
|
|
1100
|
-
|
|
1047
|
+
const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1048
|
+
declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
|
|
1049
|
+
retornos.push(declaracaoConst);
|
|
1101
1050
|
}
|
|
1102
1051
|
return retornos;
|
|
1103
1052
|
}
|
|
@@ -1124,12 +1073,13 @@ class AvaliadorSintatico {
|
|
|
1124
1073
|
inicializadores.push(this.expressao());
|
|
1125
1074
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1126
1075
|
if (identificadores.length !== inicializadores.length) {
|
|
1127
|
-
throw this.erro(this.
|
|
1076
|
+
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1128
1077
|
}
|
|
1129
1078
|
let retorno = [];
|
|
1130
1079
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1131
|
-
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
|
|
1080
|
+
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1132
1081
|
}
|
|
1082
|
+
this.pilhaDecoradores = [];
|
|
1133
1083
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1134
1084
|
return retorno;
|
|
1135
1085
|
}
|
|
@@ -1138,13 +1088,14 @@ class AvaliadorSintatico {
|
|
|
1138
1088
|
switch (this.simbolos[this.atual].tipo) {
|
|
1139
1089
|
case delegua_2.default.CONSTRUTOR:
|
|
1140
1090
|
simbolo = this.avancarEDevolverAnterior();
|
|
1141
|
-
this.pilhaDecoradores = [];
|
|
1142
1091
|
break;
|
|
1143
1092
|
default:
|
|
1144
1093
|
simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
|
|
1145
1094
|
break;
|
|
1146
1095
|
}
|
|
1147
|
-
|
|
1096
|
+
const decoradores = Array.from(this.pilhaDecoradores);
|
|
1097
|
+
this.pilhaDecoradores = [];
|
|
1098
|
+
return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, decoradores);
|
|
1148
1099
|
}
|
|
1149
1100
|
logicaComumParametros() {
|
|
1150
1101
|
const parametros = [];
|
|
@@ -1166,7 +1117,7 @@ class AvaliadorSintatico {
|
|
|
1166
1117
|
parametro.tipoDado = {
|
|
1167
1118
|
nome: this.simbolos[this.atual - 2].lexema,
|
|
1168
1119
|
tipo: tipoDadoParametro,
|
|
1169
|
-
tipoInvalido: !tipoDadoParametro ? this.
|
|
1120
|
+
tipoInvalido: !tipoDadoParametro ? this.simbolos[this.atual].lexema : null,
|
|
1170
1121
|
};
|
|
1171
1122
|
this.avancarEDevolverAnterior();
|
|
1172
1123
|
}
|
|
@@ -1196,7 +1147,7 @@ class AvaliadorSintatico {
|
|
|
1196
1147
|
}
|
|
1197
1148
|
declaracaoDeClasse() {
|
|
1198
1149
|
const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
1199
|
-
const pilhaDecoradoresClasse = this.pilhaDecoradores;
|
|
1150
|
+
const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
|
|
1200
1151
|
let superClasse = null;
|
|
1201
1152
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
|
|
1202
1153
|
this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
|
|
@@ -1219,14 +1170,13 @@ class AvaliadorSintatico {
|
|
|
1219
1170
|
switch (proximoSimbolo.tipo) {
|
|
1220
1171
|
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
1221
1172
|
metodos.push(this.funcao('método'));
|
|
1222
|
-
this.pilhaDecoradores = [];
|
|
1223
1173
|
break;
|
|
1224
1174
|
case delegua_2.default.DOIS_PONTOS:
|
|
1225
1175
|
const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
|
|
1226
1176
|
this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
|
|
1227
1177
|
const tipoPropriedade = this.avancarEDevolverAnterior();
|
|
1228
1178
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1229
|
-
propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
|
|
1179
|
+
propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores)));
|
|
1230
1180
|
this.pilhaDecoradores = [];
|
|
1231
1181
|
break;
|
|
1232
1182
|
default:
|
|
@@ -1237,15 +1187,22 @@ class AvaliadorSintatico {
|
|
|
1237
1187
|
return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
|
|
1238
1188
|
}
|
|
1239
1189
|
/**
|
|
1240
|
-
* Declarações fora de bloco precisam ser verificadas primeiro
|
|
1241
|
-
*
|
|
1242
|
-
*
|
|
1190
|
+
* Declarações fora de bloco precisam ser verificadas primeiro por
|
|
1191
|
+
* uma série de motivos, como, por exemplo:
|
|
1192
|
+
*
|
|
1193
|
+
* - Não é possível declarar uma classe/função dentro de um bloco `enquanto`,
|
|
1194
|
+
* `fazer ... enquanto`, `para`, `escolha`, etc;
|
|
1195
|
+
* - Qualquer declaração pode ter um decorador.
|
|
1243
1196
|
* @returns Uma função ou classe se o símbolo atual resolver aqui.
|
|
1244
1197
|
* O retorno de `resolverDeclaracao()` em caso contrário.
|
|
1245
1198
|
* @see resolverDeclaracao
|
|
1199
|
+
* @see resolverDecorador
|
|
1246
1200
|
*/
|
|
1247
1201
|
resolverDeclaracaoForaDeBloco() {
|
|
1248
1202
|
try {
|
|
1203
|
+
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
1204
|
+
this.resolverDecorador();
|
|
1205
|
+
}
|
|
1249
1206
|
if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
|
|
1250
1207
|
this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
|
|
1251
1208
|
this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
|
|
@@ -1318,7 +1275,7 @@ class AvaliadorSintatico {
|
|
|
1318
1275
|
}
|
|
1319
1276
|
exports.AvaliadorSintatico = AvaliadorSintatico;
|
|
1320
1277
|
|
|
1321
|
-
},{"../construtos":39,"../construtos/tuplas":48,"../declaracoes":77,"../lexador":146,"../tipos-de-dados/delegua":154,"../tipos-de-simbolos/delegua":157,"./erro-avaliador-sintatico":7,"browser-process-hrtime":332}],3:[function(require,module,exports){
|
|
1278
|
+
},{"../construtos":39,"../construtos/tuplas":48,"../declaracoes":77,"../lexador":146,"../tipos-de-dados/delegua":154,"../tipos-de-simbolos/delegua":157,"./avaliador-sintatico-base":1,"./erro-avaliador-sintatico":7,"browser-process-hrtime":332}],3:[function(require,module,exports){
|
|
1322
1279
|
"use strict";
|
|
1323
1280
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
1324
1281
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -3094,47 +3051,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3094
3051
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3095
3052
|
exports.MicroAvaliadorSintatico = void 0;
|
|
3096
3053
|
const construtos_1 = require("../construtos");
|
|
3097
|
-
const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
|
|
3098
|
-
const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
|
|
3099
3054
|
const micro_avaliador_sintatico_base_1 = require("./micro-avaliador-sintatico-base");
|
|
3055
|
+
const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
|
|
3100
3056
|
/**
|
|
3101
3057
|
* O MicroAvaliadorSintatico funciona apenas dentro de interpolações de texto.
|
|
3102
3058
|
*/
|
|
3103
3059
|
class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAvaliadorSintaticoBase {
|
|
3104
|
-
// simbolos: SimboloInterface[];
|
|
3105
|
-
// erros: ErroAvaliadorSintatico[];
|
|
3106
|
-
// atual: number;
|
|
3107
|
-
// linha: number;
|
|
3108
|
-
avancarEDevolverAnterior() {
|
|
3109
|
-
if (this.atual < this.simbolos.length)
|
|
3110
|
-
this.atual += 1;
|
|
3111
|
-
return this.simbolos[this.atual - 1];
|
|
3112
|
-
}
|
|
3113
|
-
verificarTipoSimboloAtual(tipo) {
|
|
3114
|
-
if (this.atual === this.simbolos.length)
|
|
3115
|
-
return false;
|
|
3116
|
-
return this.simbolos[this.atual].tipo === tipo;
|
|
3117
|
-
}
|
|
3118
|
-
verificarSeSimboloAtualEIgualA(...argumentos) {
|
|
3119
|
-
for (let i = 0; i < argumentos.length; i++) {
|
|
3120
|
-
const tipoAtual = argumentos[i];
|
|
3121
|
-
if (this.verificarTipoSimboloAtual(tipoAtual)) {
|
|
3122
|
-
this.avancarEDevolverAnterior();
|
|
3123
|
-
return true;
|
|
3124
|
-
}
|
|
3125
|
-
}
|
|
3126
|
-
return false;
|
|
3127
|
-
}
|
|
3128
|
-
erro(simbolo, mensagemDeErro) {
|
|
3129
|
-
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
|
|
3130
|
-
this.erros.push(excecao);
|
|
3131
|
-
return excecao;
|
|
3132
|
-
}
|
|
3133
|
-
consumir(tipo, mensagemDeErro) {
|
|
3134
|
-
if (this.verificarTipoSimboloAtual(tipo))
|
|
3135
|
-
return this.avancarEDevolverAnterior();
|
|
3136
|
-
throw this.erro(this.simbolos[this.atual], mensagemDeErro);
|
|
3137
|
-
}
|
|
3138
3060
|
primario() {
|
|
3139
3061
|
const simboloAtual = this.simbolos[this.atual];
|
|
3140
3062
|
let valores = [];
|
|
@@ -3256,33 +3178,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3256
3178
|
}
|
|
3257
3179
|
return this.chamar();
|
|
3258
3180
|
}
|
|
3259
|
-
exponenciacao() {
|
|
3260
|
-
let expressao = this.unario();
|
|
3261
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EXPONENCIACAO)) {
|
|
3262
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3263
|
-
const direito = this.unario();
|
|
3264
|
-
expressao = new construtos_1.Binario(-1, expressao, operador, direito);
|
|
3265
|
-
}
|
|
3266
|
-
return expressao;
|
|
3267
|
-
}
|
|
3268
|
-
multiplicar() {
|
|
3269
|
-
let expressao = this.exponenciacao();
|
|
3270
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIVISAO, delegua_1.default.DIVISAO_INTEIRA, delegua_1.default.MODULO, delegua_1.default.MULTIPLICACAO)) {
|
|
3271
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3272
|
-
const direito = this.exponenciacao();
|
|
3273
|
-
expressao = new construtos_1.Binario(-1, expressao, operador, direito);
|
|
3274
|
-
}
|
|
3275
|
-
return expressao;
|
|
3276
|
-
}
|
|
3277
|
-
adicaoOuSubtracao() {
|
|
3278
|
-
let expressao = this.multiplicar();
|
|
3279
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SUBTRACAO, delegua_1.default.ADICAO)) {
|
|
3280
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3281
|
-
const direito = this.multiplicar();
|
|
3282
|
-
expressao = new construtos_1.Binario(-1, expressao, operador, direito);
|
|
3283
|
-
}
|
|
3284
|
-
return expressao;
|
|
3285
|
-
}
|
|
3286
3181
|
bitShift() {
|
|
3287
3182
|
let expressao = this.adicaoOuSubtracao();
|
|
3288
3183
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
|
|
@@ -3319,15 +3214,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3319
3214
|
}
|
|
3320
3215
|
return expressao;
|
|
3321
3216
|
}
|
|
3322
|
-
comparacaoIgualdade() {
|
|
3323
|
-
let expressao = this.comparar();
|
|
3324
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIFERENTE, delegua_1.default.IGUAL_IGUAL)) {
|
|
3325
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3326
|
-
const direito = this.comparar();
|
|
3327
|
-
expressao = new construtos_1.Binario(-1, expressao, operador, direito);
|
|
3328
|
-
}
|
|
3329
|
-
return expressao;
|
|
3330
|
-
}
|
|
3331
3217
|
em() {
|
|
3332
3218
|
let expressao = this.comparacaoIgualdade();
|
|
3333
3219
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
|
|
@@ -3346,18 +3232,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3346
3232
|
}
|
|
3347
3233
|
return expressao;
|
|
3348
3234
|
}
|
|
3349
|
-
ou() {
|
|
3350
|
-
let expressao = this.e();
|
|
3351
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.OU)) {
|
|
3352
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3353
|
-
const direito = this.e();
|
|
3354
|
-
expressao = new construtos_1.Logico(-1, expressao, operador, direito);
|
|
3355
|
-
}
|
|
3356
|
-
return expressao;
|
|
3357
|
-
}
|
|
3358
|
-
declaracao() {
|
|
3359
|
-
return this.ou();
|
|
3360
|
-
}
|
|
3361
3235
|
analisar(retornoLexador, linha) {
|
|
3362
3236
|
this.erros = [];
|
|
3363
3237
|
this.atual = 0;
|
|
@@ -3375,7 +3249,7 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3375
3249
|
}
|
|
3376
3250
|
exports.MicroAvaliadorSintatico = MicroAvaliadorSintatico;
|
|
3377
3251
|
|
|
3378
|
-
},{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./
|
|
3252
|
+
},{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
|
|
3379
3253
|
"use strict";
|
|
3380
3254
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3381
3255
|
if (k2 === undefined) k2 = k;
|
|
@@ -3601,9 +3475,7 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
3601
3475
|
if (vetor === null || vetor === undefined)
|
|
3602
3476
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() não pode ser nulo.'));
|
|
3603
3477
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3604
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3605
|
-
? funcaoFiltragem.valor
|
|
3606
|
-
: funcaoFiltragem;
|
|
3478
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3607
3479
|
if (!Array.isArray(valorVetor)) {
|
|
3608
3480
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função filtrarPor() deve ser um vetor.'));
|
|
3609
3481
|
}
|
|
@@ -3668,9 +3540,7 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
3668
3540
|
if (vetor === null || vetor === undefined)
|
|
3669
3541
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() não pode ser nulo.'));
|
|
3670
3542
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3671
|
-
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
3672
|
-
? funcaoMapeamento.valor
|
|
3673
|
-
: funcaoMapeamento;
|
|
3543
|
+
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor') ? funcaoMapeamento.valor : funcaoMapeamento;
|
|
3674
3544
|
if (!Array.isArray(valorVetor)) {
|
|
3675
3545
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função mapear() deve ser um vetor.'));
|
|
3676
3546
|
}
|
|
@@ -3719,9 +3589,7 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
3719
3589
|
if (vetor === null || vetor === undefined)
|
|
3720
3590
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() não pode ser nulo.'));
|
|
3721
3591
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3722
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3723
|
-
? funcaoFiltragem.valor
|
|
3724
|
-
: funcaoFiltragem;
|
|
3592
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3725
3593
|
if (!Array.isArray(valorVetor)) {
|
|
3726
3594
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função paraCada() deve ser um vetor.'));
|
|
3727
3595
|
}
|
|
@@ -3743,9 +3611,7 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
3743
3611
|
if (vetor === null || vetor === undefined)
|
|
3744
3612
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() não pode ser nulo.'));
|
|
3745
3613
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3746
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3747
|
-
? funcaoFiltragem.valor
|
|
3748
|
-
: funcaoFiltragem;
|
|
3614
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3749
3615
|
if (!Array.isArray(valorVetor)) {
|
|
3750
3616
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Parâmetro inválido. O primeiro parâmetro da função primeiroEmCondicao() deve ser um vetor.'));
|
|
3751
3617
|
}
|
|
@@ -3876,9 +3742,7 @@ async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
|
|
|
3876
3742
|
* @returns
|
|
3877
3743
|
*/
|
|
3878
3744
|
async function tupla(interpretador, vetor) {
|
|
3879
|
-
const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ?
|
|
3880
|
-
vetor.valor :
|
|
3881
|
-
vetor;
|
|
3745
|
+
const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3882
3746
|
if (!Array.isArray(valorVetor)) {
|
|
3883
3747
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
|
|
3884
3748
|
}
|
|
@@ -3978,9 +3842,7 @@ exports.default = {
|
|
|
3978
3842
|
: vetor.splice(inicio, excluirQuantidade, ...items);
|
|
3979
3843
|
}
|
|
3980
3844
|
else {
|
|
3981
|
-
elementos = !items.length
|
|
3982
|
-
? vetor.splice(inicio)
|
|
3983
|
-
: vetor.splice(inicio, ...items);
|
|
3845
|
+
elementos = !items.length ? vetor.splice(inicio) : vetor.splice(inicio, ...items);
|
|
3984
3846
|
}
|
|
3985
3847
|
return Promise.resolve(elementos);
|
|
3986
3848
|
},
|
|
@@ -4310,11 +4172,11 @@ exports.Decorador = void 0;
|
|
|
4310
4172
|
* na avaliação sintática, é colocado juntamente com a próxima declaração.
|
|
4311
4173
|
*/
|
|
4312
4174
|
class Decorador {
|
|
4313
|
-
constructor(hashArquivo, linha, nome,
|
|
4175
|
+
constructor(hashArquivo, linha, nome, atributos) {
|
|
4314
4176
|
this.linha = linha;
|
|
4315
4177
|
this.hashArquivo = hashArquivo;
|
|
4316
4178
|
this.nome = nome;
|
|
4317
|
-
this.
|
|
4179
|
+
this.atributos = atributos;
|
|
4318
4180
|
}
|
|
4319
4181
|
async aceitar(visitante) {
|
|
4320
4182
|
return Promise.reject(new Error('Este método não deveria ser chamado.'));
|
|
@@ -5019,8 +4881,8 @@ const declaracao_1 = require("./declaracao");
|
|
|
5019
4881
|
* Uma declaração de constante.
|
|
5020
4882
|
*/
|
|
5021
4883
|
class Const extends declaracao_1.Declaracao {
|
|
5022
|
-
constructor(simbolo, inicializador, tipo = undefined) {
|
|
5023
|
-
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
4884
|
+
constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
|
|
4885
|
+
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5024
4886
|
this.simbolo = simbolo;
|
|
5025
4887
|
this.inicializador = inicializador;
|
|
5026
4888
|
this.tipo = tipo;
|
|
@@ -5051,13 +4913,14 @@ exports.Continua = Continua;
|
|
|
5051
4913
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5052
4914
|
exports.Declaracao = void 0;
|
|
5053
4915
|
class Declaracao {
|
|
5054
|
-
constructor(linha, hashArquivo) {
|
|
4916
|
+
constructor(linha, hashArquivo, decoradores = [], assinaturaMetodo = '<principal>') {
|
|
5055
4917
|
this.linha = linha;
|
|
5056
4918
|
this.hashArquivo = hashArquivo;
|
|
4919
|
+
this.decoradores = decoradores;
|
|
5057
4920
|
// TODO: Por ora, todos os testes são feitos num script só.
|
|
5058
4921
|
// Quando iniciarem os testes em múltiplos arquivos e módulos,
|
|
5059
4922
|
// pensar numa forma melhor de preencher isso.
|
|
5060
|
-
this.assinaturaMetodo =
|
|
4923
|
+
this.assinaturaMetodo = assinaturaMetodo;
|
|
5061
4924
|
}
|
|
5062
4925
|
async aceitar(visitante) {
|
|
5063
4926
|
return Promise.reject(new Error('Este método não deveria ser chamado.'));
|
|
@@ -5141,8 +5004,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
5141
5004
|
exports.Expressao = void 0;
|
|
5142
5005
|
const declaracao_1 = require("./declaracao");
|
|
5143
5006
|
class Expressao extends declaracao_1.Declaracao {
|
|
5144
|
-
constructor(expressao) {
|
|
5145
|
-
super(expressao.linha, expressao.hashArquivo);
|
|
5007
|
+
constructor(expressao, decoradores = []) {
|
|
5008
|
+
super(expressao.linha, expressao.hashArquivo, decoradores);
|
|
5146
5009
|
this.expressao = expressao;
|
|
5147
5010
|
}
|
|
5148
5011
|
async aceitar(visitante) {
|
|
@@ -5521,8 +5384,8 @@ const declaracao_1 = require("./declaracao");
|
|
|
5521
5384
|
* Uma declaração de variável.
|
|
5522
5385
|
*/
|
|
5523
5386
|
class Var extends declaracao_1.Declaracao {
|
|
5524
|
-
constructor(simbolo, inicializador, tipo = undefined) {
|
|
5525
|
-
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
5387
|
+
constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
|
|
5388
|
+
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5526
5389
|
this.simbolo = simbolo;
|
|
5527
5390
|
this.inicializador = inicializador;
|
|
5528
5391
|
this.tipo = tipo;
|
|
@@ -5761,8 +5624,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
5761
5624
|
};
|
|
5762
5625
|
// TODO: Apenass Potigol usa isso até então.
|
|
5763
5626
|
// Estudar mover isso para o dialeto.
|
|
5764
|
-
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
5765
|
-
this.nome !== 'construtor') {
|
|
5627
|
+
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis && this.nome !== 'construtor') {
|
|
5766
5628
|
for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
|
|
5767
5629
|
ambiente.valores[nomeCampo] = {
|
|
5768
5630
|
valor: valorCampo,
|
|
@@ -6168,13 +6030,13 @@ class FormatadorDelegua {
|
|
|
6168
6030
|
if (declaracao.multilinha) {
|
|
6169
6031
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}/* `;
|
|
6170
6032
|
for (let linhaConteudo of declaracao.conteudo) {
|
|
6171
|
-
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g,
|
|
6033
|
+
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, ' ')}${this.quebraLinha}`;
|
|
6172
6034
|
}
|
|
6173
6035
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} */${this.quebraLinha}`;
|
|
6174
6036
|
}
|
|
6175
6037
|
else {
|
|
6176
6038
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}// `;
|
|
6177
|
-
this.codigoFormatado += declaracao.conteudo.replace(/\s+/g,
|
|
6039
|
+
this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, ' ');
|
|
6178
6040
|
this.codigoFormatado += `${this.quebraLinha}`;
|
|
6179
6041
|
}
|
|
6180
6042
|
}
|
|
@@ -7171,7 +7033,7 @@ function inferirTipoVariavel(variavel) {
|
|
|
7171
7033
|
if (variavel.constructor.name === 'Classe')
|
|
7172
7034
|
return 'objeto';
|
|
7173
7035
|
if (variavel.constructor.name === 'Simbolo') {
|
|
7174
|
-
if (typeof variavel ===
|
|
7036
|
+
if (typeof variavel === 'object') {
|
|
7175
7037
|
const simbolo = variavel;
|
|
7176
7038
|
if (simbolo.tipo === delegua_2.default.ESCREVA)
|
|
7177
7039
|
return TIPO_NATIVO.ESCREVA;
|
|
@@ -7252,7 +7114,7 @@ class InterpretadorBase {
|
|
|
7252
7114
|
delegua_2.default.INTEIRO,
|
|
7253
7115
|
delegua_2.default.NUMERO,
|
|
7254
7116
|
delegua_2.default.NÚMERO,
|
|
7255
|
-
delegua_2.default.REAL
|
|
7117
|
+
delegua_2.default.REAL,
|
|
7256
7118
|
];
|
|
7257
7119
|
this.diretorioBase = diretorioBase;
|
|
7258
7120
|
this.performance = performance;
|
|
@@ -7606,8 +7468,7 @@ class InterpretadorBase {
|
|
|
7606
7468
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
7607
7469
|
case delegua_1.default.ADICAO:
|
|
7608
7470
|
case delegua_1.default.MAIS_IGUAL:
|
|
7609
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
7610
|
-
this.tiposNumericos.includes(tipoDireito)) {
|
|
7471
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
|
|
7611
7472
|
return Number(valorEsquerdo) + Number(valorDireito);
|
|
7612
7473
|
}
|
|
7613
7474
|
return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
|
|
@@ -7698,9 +7559,7 @@ class InterpretadorBase {
|
|
|
7698
7559
|
return entidadeChamada.declaracao.parametros;
|
|
7699
7560
|
}
|
|
7700
7561
|
if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
|
|
7701
|
-
return entidadeChamada.metodos.construtor
|
|
7702
|
-
? entidadeChamada.metodos.construtor.declaracao.parametros
|
|
7703
|
-
: [];
|
|
7562
|
+
return entidadeChamada.metodos.construtor ? entidadeChamada.metodos.construtor.declaracao.parametros : [];
|
|
7704
7563
|
}
|
|
7705
7564
|
return [];
|
|
7706
7565
|
}
|
|
@@ -8795,7 +8654,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
|
|
|
8795
8654
|
const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
|
|
8796
8655
|
switch (this.comando) {
|
|
8797
8656
|
case 'proximo':
|
|
8798
|
-
if (cloneDeclaracao.condicao !== null &&
|
|
8657
|
+
if (cloneDeclaracao.condicao !== null &&
|
|
8658
|
+
this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
|
|
8799
8659
|
escopoAtual.emLacoRepeticao = true;
|
|
8800
8660
|
const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
|
|
8801
8661
|
return resultadoBloco;
|
|
@@ -8805,7 +8665,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
|
|
|
8805
8665
|
default:
|
|
8806
8666
|
let retornoExecucao;
|
|
8807
8667
|
while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
|
|
8808
|
-
if (cloneDeclaracao.condicao !== null &&
|
|
8668
|
+
if (cloneDeclaracao.condicao !== null &&
|
|
8669
|
+
!this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
|
|
8809
8670
|
break;
|
|
8810
8671
|
}
|
|
8811
8672
|
try {
|
|
@@ -9252,8 +9113,8 @@ class PilhaEscoposExecucao {
|
|
|
9252
9113
|
let subtipo = '';
|
|
9253
9114
|
if (valor instanceof Array) {
|
|
9254
9115
|
// TODO: verificar tipo lógico e outros possíveis subtipos
|
|
9255
|
-
let numeros = valor.some(v => typeof v === 'number');
|
|
9256
|
-
let textos = valor.some(v => typeof v === 'string');
|
|
9116
|
+
let numeros = valor.some((v) => typeof v === 'number');
|
|
9117
|
+
let textos = valor.some((v) => typeof v === 'string');
|
|
9257
9118
|
if (numeros && textos)
|
|
9258
9119
|
subtipo = delegua_1.default.QUALQUER;
|
|
9259
9120
|
else if (numeros)
|
|
@@ -9287,8 +9148,8 @@ class PilhaEscoposExecucao {
|
|
|
9287
9148
|
let subtipo = '';
|
|
9288
9149
|
if (valor instanceof Array) {
|
|
9289
9150
|
// TODO: verificar tipo lógico e outros possíveis subtipos
|
|
9290
|
-
let numeros = valor.some(v => typeof v === 'number');
|
|
9291
|
-
let textos = valor.some(v => typeof v === 'string');
|
|
9151
|
+
let numeros = valor.some((v) => typeof v === 'number');
|
|
9152
|
+
let textos = valor.some((v) => typeof v === 'string');
|
|
9292
9153
|
if (numeros && textos)
|
|
9293
9154
|
subtipo = delegua_1.default.QUALQUER;
|
|
9294
9155
|
else if (numeros)
|
|
@@ -9326,7 +9187,7 @@ class PilhaEscoposExecucao {
|
|
|
9326
9187
|
variavel.valor[indice] = valorResolvido;
|
|
9327
9188
|
}
|
|
9328
9189
|
else {
|
|
9329
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo,
|
|
9190
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor.');
|
|
9330
9191
|
}
|
|
9331
9192
|
}
|
|
9332
9193
|
else {
|