@designliquido/delegua 0.36.2 → 0.37.1
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 +55 -106
- 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/acesso-indice-variavel.d.ts +2 -2
- package/construtos/acesso-indice-variavel.d.ts.map +1 -1
- package/construtos/acesso-indice-variavel.js.map +1 -1
- package/construtos/atribuicao-por-indice.d.ts +4 -4
- package/construtos/atribuicao-por-indice.d.ts.map +1 -1
- package/construtos/atribuicao-por-indice.js.map +1 -1
- package/construtos/atribuir.d.ts +2 -3
- package/construtos/atribuir.d.ts.map +1 -1
- package/construtos/atribuir.js +1 -1
- package/construtos/atribuir.js.map +1 -1
- 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.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +3 -2
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts +4 -4
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +27 -24
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +20 -5
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +109 -55
- package/tradutores/tradutor-python.js.map +1 -1
- package/umd/delegua.js +283 -363
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`.
|
|
@@ -604,11 +539,12 @@ class AvaliadorSintatico {
|
|
|
604
539
|
delegua_2.default.DIVISAO_INTEIRA_IGUAL,
|
|
605
540
|
delegua_2.default.MODULO_IGUAL,
|
|
606
541
|
].includes(expressao.operador.tipo)) {
|
|
607
|
-
let simbolo = expressao.esquerda.simbolo;
|
|
608
542
|
if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
|
|
609
|
-
|
|
610
|
-
|
|
543
|
+
const entidade = expressao.esquerda;
|
|
544
|
+
const simbolo = entidade.entidadeChamada.simbolo;
|
|
545
|
+
return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, entidade.indice);
|
|
611
546
|
}
|
|
547
|
+
const simbolo = expressao.esquerda.simbolo;
|
|
612
548
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
|
|
613
549
|
}
|
|
614
550
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
@@ -618,11 +554,11 @@ class AvaliadorSintatico {
|
|
|
618
554
|
const simbolo = expressao.simbolo;
|
|
619
555
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
620
556
|
}
|
|
621
|
-
|
|
557
|
+
if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
|
|
622
558
|
const get = expressao;
|
|
623
559
|
return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
|
|
624
560
|
}
|
|
625
|
-
|
|
561
|
+
if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
626
562
|
return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
|
|
627
563
|
}
|
|
628
564
|
this.erro(igual, 'Tarefa de atribuição inválida');
|
|
@@ -678,7 +614,8 @@ class AvaliadorSintatico {
|
|
|
678
614
|
const expressao = this.expressao();
|
|
679
615
|
// Ponto-e-vírgula é opcional aqui.
|
|
680
616
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
681
|
-
|
|
617
|
+
const decoradores = Array.from(this.pilhaDecoradores);
|
|
618
|
+
return new declaracoes_1.Expressao(expressao, decoradores);
|
|
682
619
|
}
|
|
683
620
|
declaracaoComentarioMultilinha() {
|
|
684
621
|
let simboloComentario;
|
|
@@ -922,7 +859,6 @@ class AvaliadorSintatico {
|
|
|
922
859
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
923
860
|
}
|
|
924
861
|
resolverDecorador() {
|
|
925
|
-
this.pilhaDecoradores = [];
|
|
926
862
|
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
927
863
|
let nomeDecorador = '';
|
|
928
864
|
let linha;
|
|
@@ -942,7 +878,14 @@ class AvaliadorSintatico {
|
|
|
942
878
|
this.avancarEDevolverAnterior();
|
|
943
879
|
nomeDecorador += simbolo.lexema || '.';
|
|
944
880
|
}
|
|
945
|
-
|
|
881
|
+
const atributos = {};
|
|
882
|
+
for (const parametro of parametros) {
|
|
883
|
+
if (parametro.nome.lexema in atributos) {
|
|
884
|
+
throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
|
|
885
|
+
}
|
|
886
|
+
atributos[parametro.nome.lexema] = parametro.valorPadrao;
|
|
887
|
+
}
|
|
888
|
+
this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
|
|
946
889
|
}
|
|
947
890
|
}
|
|
948
891
|
/**
|
|
@@ -1041,8 +984,11 @@ class AvaliadorSintatico {
|
|
|
1041
984
|
// como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
|
|
1042
985
|
const retornos = [];
|
|
1043
986
|
for (let identificador of identificadores) {
|
|
1044
|
-
|
|
987
|
+
const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
988
|
+
declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
|
|
989
|
+
retornos.push(declaracaoVar);
|
|
1045
990
|
}
|
|
991
|
+
this.pilhaDecoradores = [];
|
|
1046
992
|
return retornos;
|
|
1047
993
|
}
|
|
1048
994
|
/**
|
|
@@ -1051,7 +997,7 @@ class AvaliadorSintatico {
|
|
|
1051
997
|
*/
|
|
1052
998
|
declaracaoDeVariaveis() {
|
|
1053
999
|
const identificadores = [];
|
|
1054
|
-
|
|
1000
|
+
const retorno = [];
|
|
1055
1001
|
let tipo = null;
|
|
1056
1002
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
1057
1003
|
return this.declaracaoDesestruturacaoVariavel();
|
|
@@ -1065,10 +1011,11 @@ class AvaliadorSintatico {
|
|
|
1065
1011
|
}
|
|
1066
1012
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1067
1013
|
// Inicialização de variáveis sem valor.
|
|
1068
|
-
for (let
|
|
1069
|
-
retorno.push(new declaracoes_1.Var(identificador, null, tipo));
|
|
1014
|
+
for (let identificador of identificadores.values()) {
|
|
1015
|
+
retorno.push(new declaracoes_1.Var(identificador, null, tipo, Array.from(this.pilhaDecoradores)));
|
|
1070
1016
|
}
|
|
1071
1017
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1018
|
+
this.pilhaDecoradores = [];
|
|
1072
1019
|
return retorno;
|
|
1073
1020
|
}
|
|
1074
1021
|
const inicializadores = [];
|
|
@@ -1076,13 +1023,14 @@ class AvaliadorSintatico {
|
|
|
1076
1023
|
inicializadores.push(this.expressao());
|
|
1077
1024
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1078
1025
|
if (identificadores.length !== inicializadores.length) {
|
|
1079
|
-
throw this.erro(this.
|
|
1026
|
+
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1080
1027
|
}
|
|
1081
1028
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1082
1029
|
tipo = inicializadores[indice] instanceof tuplas_1.Tupla ? delegua_1.default.TUPLA : tipo;
|
|
1083
|
-
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo));
|
|
1030
|
+
retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1084
1031
|
}
|
|
1085
1032
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1033
|
+
this.pilhaDecoradores = [];
|
|
1086
1034
|
return retorno;
|
|
1087
1035
|
}
|
|
1088
1036
|
declaracaoDesestruturacaoConstante() {
|
|
@@ -1097,7 +1045,9 @@ class AvaliadorSintatico {
|
|
|
1097
1045
|
// como prefixo o nome do inicializador, e o sufixo o nome de cada propriedade.
|
|
1098
1046
|
const retornos = [];
|
|
1099
1047
|
for (let identificador of identificadores) {
|
|
1100
|
-
|
|
1048
|
+
const declaracaoConst = new declaracoes_1.Const(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
|
|
1049
|
+
declaracaoConst.decoradores = Array.from(this.pilhaDecoradores);
|
|
1050
|
+
retornos.push(declaracaoConst);
|
|
1101
1051
|
}
|
|
1102
1052
|
return retornos;
|
|
1103
1053
|
}
|
|
@@ -1124,12 +1074,13 @@ class AvaliadorSintatico {
|
|
|
1124
1074
|
inicializadores.push(this.expressao());
|
|
1125
1075
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1126
1076
|
if (identificadores.length !== inicializadores.length) {
|
|
1127
|
-
throw this.erro(this.
|
|
1077
|
+
throw this.erro(this.simbolos[this.atual], 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
1128
1078
|
}
|
|
1129
1079
|
let retorno = [];
|
|
1130
1080
|
for (let [indice, identificador] of identificadores.entries()) {
|
|
1131
|
-
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo));
|
|
1081
|
+
retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
|
|
1132
1082
|
}
|
|
1083
|
+
this.pilhaDecoradores = [];
|
|
1133
1084
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1134
1085
|
return retorno;
|
|
1135
1086
|
}
|
|
@@ -1138,13 +1089,14 @@ class AvaliadorSintatico {
|
|
|
1138
1089
|
switch (this.simbolos[this.atual].tipo) {
|
|
1139
1090
|
case delegua_2.default.CONSTRUTOR:
|
|
1140
1091
|
simbolo = this.avancarEDevolverAnterior();
|
|
1141
|
-
this.pilhaDecoradores = [];
|
|
1142
1092
|
break;
|
|
1143
1093
|
default:
|
|
1144
1094
|
simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, `Esperado nome de ${tipo}.`);
|
|
1145
1095
|
break;
|
|
1146
1096
|
}
|
|
1147
|
-
|
|
1097
|
+
const decoradores = Array.from(this.pilhaDecoradores);
|
|
1098
|
+
this.pilhaDecoradores = [];
|
|
1099
|
+
return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo), null, decoradores);
|
|
1148
1100
|
}
|
|
1149
1101
|
logicaComumParametros() {
|
|
1150
1102
|
const parametros = [];
|
|
@@ -1166,7 +1118,7 @@ class AvaliadorSintatico {
|
|
|
1166
1118
|
parametro.tipoDado = {
|
|
1167
1119
|
nome: this.simbolos[this.atual - 2].lexema,
|
|
1168
1120
|
tipo: tipoDadoParametro,
|
|
1169
|
-
tipoInvalido: !tipoDadoParametro ? this.
|
|
1121
|
+
tipoInvalido: !tipoDadoParametro ? this.simbolos[this.atual].lexema : null,
|
|
1170
1122
|
};
|
|
1171
1123
|
this.avancarEDevolverAnterior();
|
|
1172
1124
|
}
|
|
@@ -1196,7 +1148,7 @@ class AvaliadorSintatico {
|
|
|
1196
1148
|
}
|
|
1197
1149
|
declaracaoDeClasse() {
|
|
1198
1150
|
const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
1199
|
-
const pilhaDecoradoresClasse = this.pilhaDecoradores;
|
|
1151
|
+
const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
|
|
1200
1152
|
let superClasse = null;
|
|
1201
1153
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
|
|
1202
1154
|
this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
|
|
@@ -1219,14 +1171,13 @@ class AvaliadorSintatico {
|
|
|
1219
1171
|
switch (proximoSimbolo.tipo) {
|
|
1220
1172
|
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
1221
1173
|
metodos.push(this.funcao('método'));
|
|
1222
|
-
this.pilhaDecoradores = [];
|
|
1223
1174
|
break;
|
|
1224
1175
|
case delegua_2.default.DOIS_PONTOS:
|
|
1225
1176
|
const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
|
|
1226
1177
|
this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
|
|
1227
1178
|
const tipoPropriedade = this.avancarEDevolverAnterior();
|
|
1228
1179
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1229
|
-
propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, this.pilhaDecoradores));
|
|
1180
|
+
propriedades.push(new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores)));
|
|
1230
1181
|
this.pilhaDecoradores = [];
|
|
1231
1182
|
break;
|
|
1232
1183
|
default:
|
|
@@ -1237,15 +1188,22 @@ class AvaliadorSintatico {
|
|
|
1237
1188
|
return new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse);
|
|
1238
1189
|
}
|
|
1239
1190
|
/**
|
|
1240
|
-
* Declarações fora de bloco precisam ser verificadas primeiro
|
|
1241
|
-
*
|
|
1242
|
-
*
|
|
1191
|
+
* Declarações fora de bloco precisam ser verificadas primeiro por
|
|
1192
|
+
* uma série de motivos, como, por exemplo:
|
|
1193
|
+
*
|
|
1194
|
+
* - Não é possível declarar uma classe/função dentro de um bloco `enquanto`,
|
|
1195
|
+
* `fazer ... enquanto`, `para`, `escolha`, etc;
|
|
1196
|
+
* - Qualquer declaração pode ter um decorador.
|
|
1243
1197
|
* @returns Uma função ou classe se o símbolo atual resolver aqui.
|
|
1244
1198
|
* O retorno de `resolverDeclaracao()` em caso contrário.
|
|
1245
1199
|
* @see resolverDeclaracao
|
|
1200
|
+
* @see resolverDecorador
|
|
1246
1201
|
*/
|
|
1247
1202
|
resolverDeclaracaoForaDeBloco() {
|
|
1248
1203
|
try {
|
|
1204
|
+
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
1205
|
+
this.resolverDecorador();
|
|
1206
|
+
}
|
|
1249
1207
|
if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
|
|
1250
1208
|
this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
|
|
1251
1209
|
this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
|
|
@@ -1318,7 +1276,7 @@ class AvaliadorSintatico {
|
|
|
1318
1276
|
}
|
|
1319
1277
|
exports.AvaliadorSintatico = AvaliadorSintatico;
|
|
1320
1278
|
|
|
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){
|
|
1279
|
+
},{"../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
1280
|
"use strict";
|
|
1323
1281
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
1324
1282
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -3094,47 +3052,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3094
3052
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3095
3053
|
exports.MicroAvaliadorSintatico = void 0;
|
|
3096
3054
|
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
3055
|
const micro_avaliador_sintatico_base_1 = require("./micro-avaliador-sintatico-base");
|
|
3056
|
+
const delegua_1 = __importDefault(require("../tipos-de-simbolos/microgramaticas/delegua"));
|
|
3100
3057
|
/**
|
|
3101
3058
|
* O MicroAvaliadorSintatico funciona apenas dentro de interpolações de texto.
|
|
3102
3059
|
*/
|
|
3103
3060
|
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
3061
|
primario() {
|
|
3139
3062
|
const simboloAtual = this.simbolos[this.atual];
|
|
3140
3063
|
let valores = [];
|
|
@@ -3256,33 +3179,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3256
3179
|
}
|
|
3257
3180
|
return this.chamar();
|
|
3258
3181
|
}
|
|
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
3182
|
bitShift() {
|
|
3287
3183
|
let expressao = this.adicaoOuSubtracao();
|
|
3288
3184
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
|
|
@@ -3319,15 +3215,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3319
3215
|
}
|
|
3320
3216
|
return expressao;
|
|
3321
3217
|
}
|
|
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
3218
|
em() {
|
|
3332
3219
|
let expressao = this.comparacaoIgualdade();
|
|
3333
3220
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
|
|
@@ -3346,18 +3233,6 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3346
3233
|
}
|
|
3347
3234
|
return expressao;
|
|
3348
3235
|
}
|
|
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
3236
|
analisar(retornoLexador, linha) {
|
|
3362
3237
|
this.erros = [];
|
|
3363
3238
|
this.atual = 0;
|
|
@@ -3375,7 +3250,7 @@ class MicroAvaliadorSintatico extends micro_avaliador_sintatico_base_1.MicroAval
|
|
|
3375
3250
|
}
|
|
3376
3251
|
exports.MicroAvaliadorSintatico = MicroAvaliadorSintatico;
|
|
3377
3252
|
|
|
3378
|
-
},{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./
|
|
3253
|
+
},{"../construtos":39,"../tipos-de-simbolos/microgramaticas/delegua":160,"./micro-avaliador-sintatico-base":9}],11:[function(require,module,exports){
|
|
3379
3254
|
"use strict";
|
|
3380
3255
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3381
3256
|
if (k2 === undefined) k2 = k;
|
|
@@ -3601,9 +3476,7 @@ async function filtrarPor(interpretador, vetor, funcaoFiltragem) {
|
|
|
3601
3476
|
if (vetor === null || vetor === undefined)
|
|
3602
3477
|
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
3478
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3604
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3605
|
-
? funcaoFiltragem.valor
|
|
3606
|
-
: funcaoFiltragem;
|
|
3479
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3607
3480
|
if (!Array.isArray(valorVetor)) {
|
|
3608
3481
|
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
3482
|
}
|
|
@@ -3668,9 +3541,7 @@ async function mapear(interpretador, vetor, funcaoMapeamento) {
|
|
|
3668
3541
|
if (vetor === null || vetor === undefined)
|
|
3669
3542
|
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
3543
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3671
|
-
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor')
|
|
3672
|
-
? funcaoMapeamento.valor
|
|
3673
|
-
: funcaoMapeamento;
|
|
3544
|
+
const valorFuncaoMapeamento = funcaoMapeamento.hasOwnProperty('valor') ? funcaoMapeamento.valor : funcaoMapeamento;
|
|
3674
3545
|
if (!Array.isArray(valorVetor)) {
|
|
3675
3546
|
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
3547
|
}
|
|
@@ -3719,9 +3590,7 @@ async function paraCada(interpretador, vetor, funcaoFiltragem) {
|
|
|
3719
3590
|
if (vetor === null || vetor === undefined)
|
|
3720
3591
|
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
3592
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3722
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3723
|
-
? funcaoFiltragem.valor
|
|
3724
|
-
: funcaoFiltragem;
|
|
3593
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3725
3594
|
if (!Array.isArray(valorVetor)) {
|
|
3726
3595
|
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
3596
|
}
|
|
@@ -3743,9 +3612,7 @@ async function primeiroEmCondicao(interpretador, vetor, funcaoFiltragem) {
|
|
|
3743
3612
|
if (vetor === null || vetor === undefined)
|
|
3744
3613
|
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
3614
|
const valorVetor = vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3746
|
-
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor')
|
|
3747
|
-
? funcaoFiltragem.valor
|
|
3748
|
-
: funcaoFiltragem;
|
|
3615
|
+
const valorFuncaoFiltragem = funcaoFiltragem.hasOwnProperty('valor') ? funcaoFiltragem.valor : funcaoFiltragem;
|
|
3749
3616
|
if (!Array.isArray(valorVetor)) {
|
|
3750
3617
|
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
3618
|
}
|
|
@@ -3876,9 +3743,7 @@ async function todosEmCondicao(interpretador, vetor, funcaoCondicional) {
|
|
|
3876
3743
|
* @returns
|
|
3877
3744
|
*/
|
|
3878
3745
|
async function tupla(interpretador, vetor) {
|
|
3879
|
-
const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ?
|
|
3880
|
-
vetor.valor :
|
|
3881
|
-
vetor;
|
|
3746
|
+
const valorVetor = !Array.isArray(vetor) && vetor.hasOwnProperty('valor') ? vetor.valor : vetor;
|
|
3882
3747
|
if (!Array.isArray(valorVetor)) {
|
|
3883
3748
|
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(this.simbolo, 'Argumento de função nativa `tupla` não parece ser um vetor.'));
|
|
3884
3749
|
}
|
|
@@ -3978,9 +3843,7 @@ exports.default = {
|
|
|
3978
3843
|
: vetor.splice(inicio, excluirQuantidade, ...items);
|
|
3979
3844
|
}
|
|
3980
3845
|
else {
|
|
3981
|
-
elementos = !items.length
|
|
3982
|
-
? vetor.splice(inicio)
|
|
3983
|
-
: vetor.splice(inicio, ...items);
|
|
3846
|
+
elementos = !items.length ? vetor.splice(inicio) : vetor.splice(inicio, ...items);
|
|
3984
3847
|
}
|
|
3985
3848
|
return Promise.resolve(elementos);
|
|
3986
3849
|
},
|
|
@@ -4177,7 +4040,7 @@ exports.Atribuir = void 0;
|
|
|
4177
4040
|
class Atribuir {
|
|
4178
4041
|
constructor(hashArquivo, simbolo, valor,
|
|
4179
4042
|
// indice so é usado para variaveis de vetores
|
|
4180
|
-
// TODO: criar alguma validaçao para garantir que indice
|
|
4043
|
+
// TODO: criar alguma validaçao para garantir que `indice` só seja passado para variáveis de vetores
|
|
4181
4044
|
indice) {
|
|
4182
4045
|
this.linha = Number(simbolo.linha);
|
|
4183
4046
|
this.hashArquivo = hashArquivo;
|
|
@@ -4310,11 +4173,11 @@ exports.Decorador = void 0;
|
|
|
4310
4173
|
* na avaliação sintática, é colocado juntamente com a próxima declaração.
|
|
4311
4174
|
*/
|
|
4312
4175
|
class Decorador {
|
|
4313
|
-
constructor(hashArquivo, linha, nome,
|
|
4176
|
+
constructor(hashArquivo, linha, nome, atributos) {
|
|
4314
4177
|
this.linha = linha;
|
|
4315
4178
|
this.hashArquivo = hashArquivo;
|
|
4316
4179
|
this.nome = nome;
|
|
4317
|
-
this.
|
|
4180
|
+
this.atributos = atributos;
|
|
4318
4181
|
}
|
|
4319
4182
|
async aceitar(visitante) {
|
|
4320
4183
|
return Promise.reject(new Error('Este método não deveria ser chamado.'));
|
|
@@ -5019,8 +4882,8 @@ const declaracao_1 = require("./declaracao");
|
|
|
5019
4882
|
* Uma declaração de constante.
|
|
5020
4883
|
*/
|
|
5021
4884
|
class Const extends declaracao_1.Declaracao {
|
|
5022
|
-
constructor(simbolo, inicializador, tipo = undefined) {
|
|
5023
|
-
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
4885
|
+
constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
|
|
4886
|
+
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5024
4887
|
this.simbolo = simbolo;
|
|
5025
4888
|
this.inicializador = inicializador;
|
|
5026
4889
|
this.tipo = tipo;
|
|
@@ -5051,13 +4914,14 @@ exports.Continua = Continua;
|
|
|
5051
4914
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5052
4915
|
exports.Declaracao = void 0;
|
|
5053
4916
|
class Declaracao {
|
|
5054
|
-
constructor(linha, hashArquivo) {
|
|
4917
|
+
constructor(linha, hashArquivo, decoradores = [], assinaturaMetodo = '<principal>') {
|
|
5055
4918
|
this.linha = linha;
|
|
5056
4919
|
this.hashArquivo = hashArquivo;
|
|
4920
|
+
this.decoradores = decoradores;
|
|
5057
4921
|
// TODO: Por ora, todos os testes são feitos num script só.
|
|
5058
4922
|
// Quando iniciarem os testes em múltiplos arquivos e módulos,
|
|
5059
4923
|
// pensar numa forma melhor de preencher isso.
|
|
5060
|
-
this.assinaturaMetodo =
|
|
4924
|
+
this.assinaturaMetodo = assinaturaMetodo;
|
|
5061
4925
|
}
|
|
5062
4926
|
async aceitar(visitante) {
|
|
5063
4927
|
return Promise.reject(new Error('Este método não deveria ser chamado.'));
|
|
@@ -5141,8 +5005,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
5141
5005
|
exports.Expressao = void 0;
|
|
5142
5006
|
const declaracao_1 = require("./declaracao");
|
|
5143
5007
|
class Expressao extends declaracao_1.Declaracao {
|
|
5144
|
-
constructor(expressao) {
|
|
5145
|
-
super(expressao.linha, expressao.hashArquivo);
|
|
5008
|
+
constructor(expressao, decoradores = []) {
|
|
5009
|
+
super(expressao.linha, expressao.hashArquivo, decoradores);
|
|
5146
5010
|
this.expressao = expressao;
|
|
5147
5011
|
}
|
|
5148
5012
|
async aceitar(visitante) {
|
|
@@ -5521,8 +5385,8 @@ const declaracao_1 = require("./declaracao");
|
|
|
5521
5385
|
* Uma declaração de variável.
|
|
5522
5386
|
*/
|
|
5523
5387
|
class Var extends declaracao_1.Declaracao {
|
|
5524
|
-
constructor(simbolo, inicializador, tipo = undefined) {
|
|
5525
|
-
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
5388
|
+
constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
|
|
5389
|
+
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5526
5390
|
this.simbolo = simbolo;
|
|
5527
5391
|
this.inicializador = inicializador;
|
|
5528
5392
|
this.tipo = tipo;
|
|
@@ -5761,8 +5625,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
5761
5625
|
};
|
|
5762
5626
|
// TODO: Apenass Potigol usa isso até então.
|
|
5763
5627
|
// Estudar mover isso para o dialeto.
|
|
5764
|
-
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis &&
|
|
5765
|
-
this.nome !== 'construtor') {
|
|
5628
|
+
if (this.instancia.classe.dialetoRequerExpansaoPropriedadesEspacoVariaveis && this.nome !== 'construtor') {
|
|
5766
5629
|
for (let [nomeCampo, valorCampo] of Object.entries(this.instancia.propriedades)) {
|
|
5767
5630
|
ambiente.valores[nomeCampo] = {
|
|
5768
5631
|
valor: valorCampo,
|
|
@@ -6168,13 +6031,13 @@ class FormatadorDelegua {
|
|
|
6168
6031
|
if (declaracao.multilinha) {
|
|
6169
6032
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}/* `;
|
|
6170
6033
|
for (let linhaConteudo of declaracao.conteudo) {
|
|
6171
|
-
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g,
|
|
6034
|
+
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} ${linhaConteudo.replace(/\s+/g, ' ')}${this.quebraLinha}`;
|
|
6172
6035
|
}
|
|
6173
6036
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)} */${this.quebraLinha}`;
|
|
6174
6037
|
}
|
|
6175
6038
|
else {
|
|
6176
6039
|
this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}// `;
|
|
6177
|
-
this.codigoFormatado += declaracao.conteudo.replace(/\s+/g,
|
|
6040
|
+
this.codigoFormatado += declaracao.conteudo.replace(/\s+/g, ' ');
|
|
6178
6041
|
this.codigoFormatado += `${this.quebraLinha}`;
|
|
6179
6042
|
}
|
|
6180
6043
|
}
|
|
@@ -7171,7 +7034,7 @@ function inferirTipoVariavel(variavel) {
|
|
|
7171
7034
|
if (variavel.constructor.name === 'Classe')
|
|
7172
7035
|
return 'objeto';
|
|
7173
7036
|
if (variavel.constructor.name === 'Simbolo') {
|
|
7174
|
-
if (typeof variavel ===
|
|
7037
|
+
if (typeof variavel === 'object') {
|
|
7175
7038
|
const simbolo = variavel;
|
|
7176
7039
|
if (simbolo.tipo === delegua_2.default.ESCREVA)
|
|
7177
7040
|
return TIPO_NATIVO.ESCREVA;
|
|
@@ -7252,7 +7115,7 @@ class InterpretadorBase {
|
|
|
7252
7115
|
delegua_2.default.INTEIRO,
|
|
7253
7116
|
delegua_2.default.NUMERO,
|
|
7254
7117
|
delegua_2.default.NÚMERO,
|
|
7255
|
-
delegua_2.default.REAL
|
|
7118
|
+
delegua_2.default.REAL,
|
|
7256
7119
|
];
|
|
7257
7120
|
this.diretorioBase = diretorioBase;
|
|
7258
7121
|
this.performance = performance;
|
|
@@ -7606,8 +7469,7 @@ class InterpretadorBase {
|
|
|
7606
7469
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
7607
7470
|
case delegua_1.default.ADICAO:
|
|
7608
7471
|
case delegua_1.default.MAIS_IGUAL:
|
|
7609
|
-
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
7610
|
-
this.tiposNumericos.includes(tipoDireito)) {
|
|
7472
|
+
if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
|
|
7611
7473
|
return Number(valorEsquerdo) + Number(valorDireito);
|
|
7612
7474
|
}
|
|
7613
7475
|
return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
|
|
@@ -7698,9 +7560,7 @@ class InterpretadorBase {
|
|
|
7698
7560
|
return entidadeChamada.declaracao.parametros;
|
|
7699
7561
|
}
|
|
7700
7562
|
if (entidadeChamada instanceof estruturas_1.DescritorTipoClasse) {
|
|
7701
|
-
return entidadeChamada.metodos.construtor
|
|
7702
|
-
? entidadeChamada.metodos.construtor.declaracao.parametros
|
|
7703
|
-
: [];
|
|
7563
|
+
return entidadeChamada.metodos.construtor ? entidadeChamada.metodos.construtor.declaracao.parametros : [];
|
|
7704
7564
|
}
|
|
7705
7565
|
return [];
|
|
7706
7566
|
}
|
|
@@ -8795,7 +8655,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
|
|
|
8795
8655
|
const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
|
|
8796
8656
|
switch (this.comando) {
|
|
8797
8657
|
case 'proximo':
|
|
8798
|
-
if (cloneDeclaracao.condicao !== null &&
|
|
8658
|
+
if (cloneDeclaracao.condicao !== null &&
|
|
8659
|
+
this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
|
|
8799
8660
|
escopoAtual.emLacoRepeticao = true;
|
|
8800
8661
|
const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes);
|
|
8801
8662
|
return resultadoBloco;
|
|
@@ -8805,7 +8666,8 @@ class InterpretadorComDepuracao extends interpretador_base_1.InterpretadorBase {
|
|
|
8805
8666
|
default:
|
|
8806
8667
|
let retornoExecucao;
|
|
8807
8668
|
while (!(retornoExecucao instanceof quebras_1.Quebra) && !this.pontoDeParadaAtivo) {
|
|
8808
|
-
if (cloneDeclaracao.condicao !== null &&
|
|
8669
|
+
if (cloneDeclaracao.condicao !== null &&
|
|
8670
|
+
!this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) {
|
|
8809
8671
|
break;
|
|
8810
8672
|
}
|
|
8811
8673
|
try {
|
|
@@ -9252,8 +9114,8 @@ class PilhaEscoposExecucao {
|
|
|
9252
9114
|
let subtipo = '';
|
|
9253
9115
|
if (valor instanceof Array) {
|
|
9254
9116
|
// 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');
|
|
9117
|
+
let numeros = valor.some((v) => typeof v === 'number');
|
|
9118
|
+
let textos = valor.some((v) => typeof v === 'string');
|
|
9257
9119
|
if (numeros && textos)
|
|
9258
9120
|
subtipo = delegua_1.default.QUALQUER;
|
|
9259
9121
|
else if (numeros)
|
|
@@ -9287,8 +9149,8 @@ class PilhaEscoposExecucao {
|
|
|
9287
9149
|
let subtipo = '';
|
|
9288
9150
|
if (valor instanceof Array) {
|
|
9289
9151
|
// 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');
|
|
9152
|
+
let numeros = valor.some((v) => typeof v === 'number');
|
|
9153
|
+
let textos = valor.some((v) => typeof v === 'string');
|
|
9292
9154
|
if (numeros && textos)
|
|
9293
9155
|
subtipo = delegua_1.default.QUALQUER;
|
|
9294
9156
|
else if (numeros)
|
|
@@ -9326,7 +9188,7 @@ class PilhaEscoposExecucao {
|
|
|
9326
9188
|
variavel.valor[indice] = valorResolvido;
|
|
9327
9189
|
}
|
|
9328
9190
|
else {
|
|
9329
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo,
|
|
9191
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor.');
|
|
9330
9192
|
}
|
|
9331
9193
|
}
|
|
9332
9194
|
else {
|
|
@@ -24985,14 +24847,15 @@ class TradutorAssemblyScript {
|
|
|
24985
24847
|
resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
24986
24848
|
return resultado;
|
|
24987
24849
|
}
|
|
24850
|
+
// TODO: Eliminar o soft cast para `any`.
|
|
24988
24851
|
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
24989
|
-
var _a
|
|
24852
|
+
var _a;
|
|
24990
24853
|
let resultado = '';
|
|
24991
24854
|
resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
|
|
24992
24855
|
resultado +=
|
|
24993
24856
|
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
|
|
24994
24857
|
resultado += ' = ';
|
|
24995
|
-
if ((
|
|
24858
|
+
if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
|
|
24996
24859
|
resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
|
|
24997
24860
|
}
|
|
24998
24861
|
else {
|
|
@@ -25130,7 +24993,6 @@ class TradutorJavaScript {
|
|
|
25130
24993
|
return '-';
|
|
25131
24994
|
}
|
|
25132
24995
|
}
|
|
25133
|
-
//TODO: @Samuel
|
|
25134
24996
|
traduzirFuncoesNativas(metodo) {
|
|
25135
24997
|
switch (metodo.toLowerCase()) {
|
|
25136
24998
|
case 'adicionar':
|
|
@@ -25160,6 +25022,8 @@ class TradutorJavaScript {
|
|
|
25160
25022
|
return 'toLowerCase';
|
|
25161
25023
|
case 'substituir':
|
|
25162
25024
|
return 'replace';
|
|
25025
|
+
case 'texto':
|
|
25026
|
+
return 'String';
|
|
25163
25027
|
default:
|
|
25164
25028
|
return metodo;
|
|
25165
25029
|
}
|
|
@@ -25186,22 +25050,6 @@ class TradutorJavaScript {
|
|
|
25186
25050
|
resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
25187
25051
|
return resultado;
|
|
25188
25052
|
}
|
|
25189
|
-
traduzirConstrutoDefinirValor(definirValor) {
|
|
25190
|
-
let resultado = '';
|
|
25191
|
-
if (definirValor.objeto instanceof construtos_1.Isto) {
|
|
25192
|
-
resultado = 'this.' + definirValor.nome.lexema + ' = ';
|
|
25193
|
-
}
|
|
25194
|
-
resultado += definirValor.valor.simbolo.lexema;
|
|
25195
|
-
return resultado;
|
|
25196
|
-
}
|
|
25197
|
-
traduzirConstrutoLiteral(literal) {
|
|
25198
|
-
if (typeof literal.valor === 'string')
|
|
25199
|
-
return `'${literal.valor}'`;
|
|
25200
|
-
return literal.valor;
|
|
25201
|
-
}
|
|
25202
|
-
traduzirConstrutoVariavel(variavel) {
|
|
25203
|
-
return variavel.simbolo.lexema;
|
|
25204
|
-
}
|
|
25205
25053
|
traduzirConstrutoChamada(chamada) {
|
|
25206
25054
|
let resultado = '';
|
|
25207
25055
|
const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada)}`;
|
|
@@ -25242,6 +25090,22 @@ class TradutorJavaScript {
|
|
|
25242
25090
|
}
|
|
25243
25091
|
return resultado;
|
|
25244
25092
|
}
|
|
25093
|
+
traduzirConstrutoDefinirValor(definirValor) {
|
|
25094
|
+
let resultado = '';
|
|
25095
|
+
if (definirValor.objeto instanceof construtos_1.Isto) {
|
|
25096
|
+
resultado = 'this.' + definirValor.nome.lexema + ' = ';
|
|
25097
|
+
}
|
|
25098
|
+
resultado += definirValor.valor.simbolo.lexema;
|
|
25099
|
+
return resultado;
|
|
25100
|
+
}
|
|
25101
|
+
traduzirConstrutoLiteral(literal) {
|
|
25102
|
+
if (typeof literal.valor === 'string')
|
|
25103
|
+
return `'${literal.valor}'`;
|
|
25104
|
+
return literal.valor;
|
|
25105
|
+
}
|
|
25106
|
+
traduzirConstrutoVariavel(variavel) {
|
|
25107
|
+
return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
|
|
25108
|
+
}
|
|
25245
25109
|
logicaComumBlocoEscopo(declaracoes) {
|
|
25246
25110
|
let resultado = '{\n';
|
|
25247
25111
|
this.indentacao += 4;
|
|
@@ -25393,13 +25257,12 @@ class TradutorJavaScript {
|
|
|
25393
25257
|
let resultado = 'for (';
|
|
25394
25258
|
if (declaracaoPara.inicializador.constructor.name === 'Array') {
|
|
25395
25259
|
resultado +=
|
|
25396
|
-
this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0]) + ' ';
|
|
25260
|
+
this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0], false) + '; ';
|
|
25397
25261
|
}
|
|
25398
25262
|
else {
|
|
25399
25263
|
resultado +=
|
|
25400
|
-
this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + ' ';
|
|
25264
|
+
this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador, false) + '; ';
|
|
25401
25265
|
}
|
|
25402
|
-
resultado += !resultado.includes(';') ? ';' : '';
|
|
25403
25266
|
resultado +=
|
|
25404
25267
|
this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao) + '; ';
|
|
25405
25268
|
resultado +=
|
|
@@ -25490,10 +25353,10 @@ class TradutorJavaScript {
|
|
|
25490
25353
|
}
|
|
25491
25354
|
return resultado;
|
|
25492
25355
|
}
|
|
25493
|
-
traduzirDeclaracaoVar(declaracaoVar) {
|
|
25356
|
+
traduzirDeclaracaoVar(declaracaoVar, adicionarPontoEVirgula = true) {
|
|
25494
25357
|
let resultado = 'let ';
|
|
25495
25358
|
resultado += declaracaoVar.simbolo.lexema;
|
|
25496
|
-
if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador))
|
|
25359
|
+
if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador) && adicionarPontoEVirgula)
|
|
25497
25360
|
resultado += ';';
|
|
25498
25361
|
else {
|
|
25499
25362
|
resultado += ' = ';
|
|
@@ -25503,7 +25366,8 @@ class TradutorJavaScript {
|
|
|
25503
25366
|
else {
|
|
25504
25367
|
resultado += this.dicionarioDeclaracoes[declaracaoVar.inicializador.constructor.name](declaracaoVar.inicializador);
|
|
25505
25368
|
}
|
|
25506
|
-
|
|
25369
|
+
if (adicionarPontoEVirgula)
|
|
25370
|
+
resultado += ';';
|
|
25507
25371
|
}
|
|
25508
25372
|
return resultado;
|
|
25509
25373
|
}
|
|
@@ -25532,6 +25396,7 @@ class TradutorJavaScript {
|
|
|
25532
25396
|
let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
25533
25397
|
return `${direita} ${operador} ${esquerda}`;
|
|
25534
25398
|
}
|
|
25399
|
+
// TODO: Eliminar o soft cast para `any`.
|
|
25535
25400
|
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
25536
25401
|
var _a, _b;
|
|
25537
25402
|
let resultado = '';
|
|
@@ -25580,7 +25445,8 @@ class TradutorJavaScript {
|
|
|
25580
25445
|
return resultado;
|
|
25581
25446
|
}
|
|
25582
25447
|
traduzirDeclaracaoFalhar(falhar) {
|
|
25583
|
-
|
|
25448
|
+
const explicacao = this.dicionarioConstrutos[falhar.explicacao.constructor.name](falhar.explicacao);
|
|
25449
|
+
return `throw ${explicacao}`;
|
|
25584
25450
|
}
|
|
25585
25451
|
traduzirConstrutoUnario(unario) {
|
|
25586
25452
|
var _a, _b;
|
|
@@ -25682,8 +25548,10 @@ class TradutorPython {
|
|
|
25682
25548
|
constructor() {
|
|
25683
25549
|
this.indentacao = 0;
|
|
25684
25550
|
this.dicionarioConstrutos = {
|
|
25685
|
-
AcessoMetodoOuPropriedade: this.
|
|
25551
|
+
AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodoOuPropriedade.bind(this),
|
|
25552
|
+
AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
|
|
25686
25553
|
Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
|
|
25554
|
+
AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
|
|
25687
25555
|
Atribuir: this.traduzirConstrutoAtribuir.bind(this),
|
|
25688
25556
|
Binario: this.traduzirConstrutoBinario.bind(this),
|
|
25689
25557
|
Chamada: this.traduzirConstrutoChamada.bind(this),
|
|
@@ -25691,6 +25559,7 @@ class TradutorPython {
|
|
|
25691
25559
|
DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
|
|
25692
25560
|
Literal: this.traduzirConstrutoLiteral.bind(this),
|
|
25693
25561
|
Logico: this.traduzirConstrutoLogico.bind(this),
|
|
25562
|
+
Unario: this.traduzirConstrutoUnario.bind(this),
|
|
25694
25563
|
Variavel: this.traduzirConstrutoVariavel.bind(this),
|
|
25695
25564
|
Vetor: this.traduzirConstrutoVetor.bind(this),
|
|
25696
25565
|
};
|
|
@@ -25700,10 +25569,12 @@ class TradutorPython {
|
|
|
25700
25569
|
Comentario: this.traduzirConstrutoComentario.bind(this),
|
|
25701
25570
|
Const: this.traduzirDeclaracaoConst.bind(this),
|
|
25702
25571
|
Continua: () => 'continue',
|
|
25572
|
+
Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
|
|
25703
25573
|
Escreva: this.traduzirDeclaracaoEscreva.bind(this),
|
|
25704
25574
|
Expressao: this.traduzirDeclaracaoExpressao.bind(this),
|
|
25705
25575
|
FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
|
|
25706
25576
|
Leia: this.traduzirDeclaracaoLeia.bind(this),
|
|
25577
|
+
Para: this.traduzirDeclaracaoPara.bind(this),
|
|
25707
25578
|
ParaCada: this.traduzirDeclaracaoParaCada.bind(this),
|
|
25708
25579
|
Retorna: this.traduzirDeclaracaoRetorna.bind(this),
|
|
25709
25580
|
Se: this.traduzirDeclaracaoSe.bind(this),
|
|
@@ -25712,9 +25583,6 @@ class TradutorPython {
|
|
|
25712
25583
|
Var: this.traduzirDeclaracaoVar.bind(this),
|
|
25713
25584
|
};
|
|
25714
25585
|
}
|
|
25715
|
-
traduzirNomeVariavel(variavel) {
|
|
25716
|
-
return variavel.replace(/\.?([A-Z]+)/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '');
|
|
25717
|
-
}
|
|
25718
25586
|
traduzirSimboloOperador(operador) {
|
|
25719
25587
|
switch (operador.tipo) {
|
|
25720
25588
|
case delegua_1.default.ADICAO:
|
|
@@ -25784,6 +25652,8 @@ class TradutorPython {
|
|
|
25784
25652
|
return 'lower';
|
|
25785
25653
|
case 'substituir':
|
|
25786
25654
|
return 'replace';
|
|
25655
|
+
case 'texto':
|
|
25656
|
+
return 'str';
|
|
25787
25657
|
default:
|
|
25788
25658
|
return metodo;
|
|
25789
25659
|
}
|
|
@@ -25808,7 +25678,12 @@ class TradutorPython {
|
|
|
25808
25678
|
resultado += ' '.repeat(this.indentacao) + '\n';
|
|
25809
25679
|
return resultado;
|
|
25810
25680
|
}
|
|
25811
|
-
|
|
25681
|
+
traduzirConstrutoAcessoIndiceVariavel(acessoIndiceVariavel) {
|
|
25682
|
+
const entidade = this.dicionarioConstrutos[acessoIndiceVariavel.entidadeChamada.constructor.name](acessoIndiceVariavel.entidadeChamada);
|
|
25683
|
+
const indice = this.dicionarioConstrutos[acessoIndiceVariavel.indice.constructor.name](acessoIndiceVariavel.indice);
|
|
25684
|
+
return `${entidade}[${indice}]`;
|
|
25685
|
+
}
|
|
25686
|
+
traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo) {
|
|
25812
25687
|
if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
|
|
25813
25688
|
let objetoVariavel = acessoMetodo.objeto;
|
|
25814
25689
|
let funcaoTraduzida = this.traduzirFuncoesNativas(acessoMetodo.simbolo.lexema);
|
|
@@ -25825,6 +25700,12 @@ class TradutorPython {
|
|
|
25825
25700
|
traduzirConstrutoAgrupamento(agrupamento) {
|
|
25826
25701
|
return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
|
|
25827
25702
|
}
|
|
25703
|
+
traduzirConstrutoAtribuicaoPorIndice(atribuicaoPorIndice) {
|
|
25704
|
+
const objeto = this.dicionarioConstrutos[atribuicaoPorIndice.objeto.constructor.name](atribuicaoPorIndice.objeto);
|
|
25705
|
+
const indice = this.dicionarioConstrutos[atribuicaoPorIndice.indice.constructor.name](atribuicaoPorIndice.indice);
|
|
25706
|
+
const valor = this.dicionarioConstrutos[atribuicaoPorIndice.valor.constructor.name](atribuicaoPorIndice.valor);
|
|
25707
|
+
return `${objeto}[${indice}] = ${valor}`;
|
|
25708
|
+
}
|
|
25828
25709
|
traduzirConstrutoAtribuir(atribuir) {
|
|
25829
25710
|
let resultado = atribuir.simbolo.lexema;
|
|
25830
25711
|
resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
@@ -25898,18 +25779,31 @@ class TradutorPython {
|
|
|
25898
25779
|
if (typeof literal.valor === 'boolean') {
|
|
25899
25780
|
return literal.valor ? 'True' : 'False';
|
|
25900
25781
|
}
|
|
25782
|
+
if (typeof literal.valor === 'number') {
|
|
25783
|
+
return String(literal.valor);
|
|
25784
|
+
}
|
|
25901
25785
|
if (!literal.valor)
|
|
25902
25786
|
return 'None';
|
|
25903
25787
|
return literal.valor;
|
|
25904
25788
|
}
|
|
25905
25789
|
traduzirConstrutoLogico(logico) {
|
|
25906
|
-
|
|
25907
|
-
|
|
25908
|
-
|
|
25790
|
+
const direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
25791
|
+
const operador = this.traduzirSimboloOperador(logico.operador);
|
|
25792
|
+
const esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
25909
25793
|
return `${esquerda} ${operador} ${direita}`;
|
|
25910
25794
|
}
|
|
25795
|
+
traduzirConstrutoUnario(unario) {
|
|
25796
|
+
const operador = this.traduzirSimboloOperador(unario.operador);
|
|
25797
|
+
const operando = this.dicionarioConstrutos[unario.operando.constructor.name](unario.operando);
|
|
25798
|
+
switch (unario.incidenciaOperador) {
|
|
25799
|
+
case 'ANTES':
|
|
25800
|
+
return `${operador}${operando}`;
|
|
25801
|
+
case 'DEPOIS':
|
|
25802
|
+
return `${operando}${operador}`;
|
|
25803
|
+
}
|
|
25804
|
+
}
|
|
25911
25805
|
traduzirConstrutoVariavel(variavel) {
|
|
25912
|
-
return variavel.simbolo.lexema;
|
|
25806
|
+
return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
|
|
25913
25807
|
}
|
|
25914
25808
|
traduzirConstrutoVetor(vetor) {
|
|
25915
25809
|
if (!vetor.valores.length) {
|
|
@@ -25925,45 +25819,6 @@ class TradutorPython {
|
|
|
25925
25819
|
resultado += ']';
|
|
25926
25820
|
return resultado;
|
|
25927
25821
|
}
|
|
25928
|
-
traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
|
|
25929
|
-
let resultado = '';
|
|
25930
|
-
if (iniciarComIf) {
|
|
25931
|
-
resultado += 'if ';
|
|
25932
|
-
}
|
|
25933
|
-
else {
|
|
25934
|
-
resultado += 'elif ';
|
|
25935
|
-
}
|
|
25936
|
-
const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
|
|
25937
|
-
resultado += condicao;
|
|
25938
|
-
resultado += ':\n';
|
|
25939
|
-
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
|
|
25940
|
-
if (declaracaoSe.caminhoSenao !== null) {
|
|
25941
|
-
resultado += ' '.repeat(this.indentacao);
|
|
25942
|
-
const se = declaracaoSe === null || declaracaoSe === void 0 ? void 0 : declaracaoSe.caminhoSenao;
|
|
25943
|
-
if (se === null || se === void 0 ? void 0 : se.caminhoEntao) {
|
|
25944
|
-
resultado += 'elif ';
|
|
25945
|
-
resultado += this.dicionarioConstrutos[se.condicao.constructor.name](se.condicao, false);
|
|
25946
|
-
resultado += ':\n';
|
|
25947
|
-
resultado += this.dicionarioDeclaracoes[se.caminhoEntao.constructor.name](se.caminhoEntao);
|
|
25948
|
-
resultado += ' '.repeat(this.indentacao);
|
|
25949
|
-
if (se === null || se === void 0 ? void 0 : se.caminhoSenao) {
|
|
25950
|
-
if (se.caminhoSenao instanceof declaracoes_1.Bloco) {
|
|
25951
|
-
resultado += 'else:\n';
|
|
25952
|
-
resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
|
|
25953
|
-
return resultado;
|
|
25954
|
-
}
|
|
25955
|
-
else {
|
|
25956
|
-
resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
|
|
25957
|
-
return resultado;
|
|
25958
|
-
}
|
|
25959
|
-
}
|
|
25960
|
-
}
|
|
25961
|
-
resultado += 'else:\n';
|
|
25962
|
-
resultado += ' '.repeat(this.indentacao);
|
|
25963
|
-
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
|
|
25964
|
-
}
|
|
25965
|
-
return resultado;
|
|
25966
|
-
}
|
|
25967
25822
|
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
25968
25823
|
this.indentacao += 4;
|
|
25969
25824
|
let resultado = ' '.repeat(this.indentacao);
|
|
@@ -26006,9 +25861,7 @@ class TradutorPython {
|
|
|
26006
25861
|
return resultado;
|
|
26007
25862
|
}
|
|
26008
25863
|
traduzirDeclaracaoConst(declaracaoConst) {
|
|
26009
|
-
let resultado = '';
|
|
26010
|
-
resultado += this.traduzirNomeVariavel(declaracaoConst.simbolo.lexema);
|
|
26011
|
-
resultado += ' = ';
|
|
25864
|
+
let resultado = declaracaoConst.simbolo.lexema + ' = ';
|
|
26012
25865
|
const inicializador = declaracaoConst.inicializador;
|
|
26013
25866
|
if (inicializador) {
|
|
26014
25867
|
if (this.dicionarioConstrutos[inicializador.constructor.name]) {
|
|
@@ -26023,6 +25876,13 @@ class TradutorPython {
|
|
|
26023
25876
|
}
|
|
26024
25877
|
return resultado;
|
|
26025
25878
|
}
|
|
25879
|
+
traduzirDeclaracaoEnquanto(declaracaoEnquanto) {
|
|
25880
|
+
let resultado = ' '.repeat(this.indentacao) + 'while ';
|
|
25881
|
+
const condicao = this.dicionarioConstrutos[declaracaoEnquanto.condicao.constructor.name](declaracaoEnquanto.condicao);
|
|
25882
|
+
resultado += condicao + ':\n';
|
|
25883
|
+
resultado += this.dicionarioDeclaracoes[declaracaoEnquanto.corpo.constructor.name](declaracaoEnquanto.corpo);
|
|
25884
|
+
return resultado;
|
|
25885
|
+
}
|
|
26026
25886
|
traduzirDeclaracaoEscreva(declaracaoEscreva) {
|
|
26027
25887
|
let resultado = 'print(';
|
|
26028
25888
|
for (const argumento of declaracaoEscreva.argumentos) {
|
|
@@ -26045,7 +25905,7 @@ class TradutorPython {
|
|
|
26045
25905
|
if (declaracaoFuncao.funcao.parametros.length > 0) {
|
|
26046
25906
|
resultado = resultado.slice(0, -2);
|
|
26047
25907
|
}
|
|
26048
|
-
resultado += ')
|
|
25908
|
+
resultado += '):\n';
|
|
26049
25909
|
resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
|
|
26050
25910
|
return resultado;
|
|
26051
25911
|
}
|
|
@@ -26059,6 +25919,32 @@ class TradutorPython {
|
|
|
26059
25919
|
resultado += ')';
|
|
26060
25920
|
return resultado;
|
|
26061
25921
|
}
|
|
25922
|
+
/**
|
|
25923
|
+
* Como não existe declaração `para` com variáveis de controle em Python, o
|
|
25924
|
+
* que tentamos aqui é criar a mesma coisa usando `while()`.
|
|
25925
|
+
* @param declaracaoPara A declaração `Para`.
|
|
25926
|
+
* @returns Um bloco equivalente ao que seria um bloco `for` com variáveis de controle em Python.
|
|
25927
|
+
*/
|
|
25928
|
+
traduzirDeclaracaoPara(declaracaoPara) {
|
|
25929
|
+
let resultado = '';
|
|
25930
|
+
// Em uma declaração `Para` em Delégua, são obrigatórios a condição e o incremento.
|
|
25931
|
+
if (declaracaoPara.inicializador) {
|
|
25932
|
+
if (Array.isArray(declaracaoPara.inicializador)) {
|
|
25933
|
+
for (const declaracaoInicializador of declaracaoPara.inicializador) {
|
|
25934
|
+
resultado += this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
|
|
25935
|
+
}
|
|
25936
|
+
}
|
|
25937
|
+
else {
|
|
25938
|
+
resultado += this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + `\n`;
|
|
25939
|
+
}
|
|
25940
|
+
}
|
|
25941
|
+
const condicao = this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao);
|
|
25942
|
+
resultado += ' '.repeat(this.indentacao) + `while ${condicao}:\n`;
|
|
25943
|
+
// O incremento passa a ser a última instrução do bloco.
|
|
25944
|
+
declaracaoPara.corpo.declaracoes.push(new declaracoes_1.Expressao(declaracaoPara.incrementar));
|
|
25945
|
+
resultado += this.dicionarioDeclaracoes[declaracaoPara.corpo.constructor.name](declaracaoPara.corpo);
|
|
25946
|
+
return resultado;
|
|
25947
|
+
}
|
|
26062
25948
|
traduzirDeclaracaoParaCada(declaracaoParaCada) {
|
|
26063
25949
|
let resultado = `for ${declaracaoParaCada.nomeVariavelIteracao} in `;
|
|
26064
25950
|
resultado +=
|
|
@@ -26071,6 +25957,42 @@ class TradutorPython {
|
|
|
26071
25957
|
const nomeConstrutor = declaracaoRetorna.valor.constructor.name;
|
|
26072
25958
|
return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
|
|
26073
25959
|
}
|
|
25960
|
+
traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
|
|
25961
|
+
let resultado = '';
|
|
25962
|
+
if (iniciarComIf) {
|
|
25963
|
+
resultado += 'if ';
|
|
25964
|
+
}
|
|
25965
|
+
else {
|
|
25966
|
+
resultado += 'elif ';
|
|
25967
|
+
}
|
|
25968
|
+
const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
|
|
25969
|
+
resultado += condicao;
|
|
25970
|
+
resultado += ':\n';
|
|
25971
|
+
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
|
|
25972
|
+
if (declaracaoSe.caminhoSenao) {
|
|
25973
|
+
resultado += ' '.repeat(this.indentacao);
|
|
25974
|
+
const senao = declaracaoSe.caminhoSenao;
|
|
25975
|
+
if (senao === null || senao === void 0 ? void 0 : senao.caminhoEntao) {
|
|
25976
|
+
resultado += 'elif ';
|
|
25977
|
+
resultado += this.dicionarioConstrutos[senao.condicao.constructor.name](senao.condicao, false);
|
|
25978
|
+
resultado += ':\n';
|
|
25979
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoEntao.constructor.name](senao.caminhoEntao);
|
|
25980
|
+
resultado += ' '.repeat(this.indentacao);
|
|
25981
|
+
if (senao === null || senao === void 0 ? void 0 : senao.caminhoSenao) {
|
|
25982
|
+
if (senao.caminhoSenao instanceof declaracoes_1.Bloco) {
|
|
25983
|
+
resultado += 'else:\n';
|
|
25984
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
|
|
25985
|
+
return resultado;
|
|
25986
|
+
}
|
|
25987
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
|
|
25988
|
+
return resultado;
|
|
25989
|
+
}
|
|
25990
|
+
}
|
|
25991
|
+
resultado += 'else:\n';
|
|
25992
|
+
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
|
|
25993
|
+
}
|
|
25994
|
+
return resultado;
|
|
25995
|
+
}
|
|
26074
25996
|
traduzirDeclaracaoTente(declaracaoTente) {
|
|
26075
25997
|
let resultado = 'try:\n';
|
|
26076
25998
|
this.indentacao += 4;
|
|
@@ -26104,9 +26026,7 @@ class TradutorPython {
|
|
|
26104
26026
|
return resultado;
|
|
26105
26027
|
}
|
|
26106
26028
|
traduzirDeclaracaoVar(declaracaoVar) {
|
|
26107
|
-
let resultado = '';
|
|
26108
|
-
resultado += this.traduzirNomeVariavel(declaracaoVar.simbolo.lexema);
|
|
26109
|
-
resultado += ' = ';
|
|
26029
|
+
let resultado = declaracaoVar.simbolo.lexema + ' = ';
|
|
26110
26030
|
const inicializador = declaracaoVar.inicializador;
|
|
26111
26031
|
if (inicializador) {
|
|
26112
26032
|
if (this.dicionarioConstrutos[inicializador.constructor.name]) {
|