@designliquido/delegua 1.7.0 → 1.7.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/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +4 -1
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +4 -0
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +59 -28
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +11 -4
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +48 -19
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +10 -3
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +46 -18
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-intervalo-variavel.d.ts +3 -2
- package/construtos/acesso-intervalo-variavel.d.ts.map +1 -1
- package/construtos/acesso-intervalo-variavel.js +5 -2
- package/construtos/acesso-intervalo-variavel.js.map +1 -1
- package/interpretador/comum.js +1 -1
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +35 -6
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +12 -0
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +83 -0
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts +48 -2
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +535 -30
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/umd/delegua.js +652 -81
|
@@ -12,7 +12,9 @@ class TradutorAssemblyScript {
|
|
|
12
12
|
this.indentacao = 0;
|
|
13
13
|
this.dicionarioConstrutos = {
|
|
14
14
|
AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
|
|
15
|
+
AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
|
|
15
16
|
AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodo.bind(this),
|
|
17
|
+
AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
|
|
16
18
|
Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
|
|
17
19
|
ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
|
|
18
20
|
AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
|
|
@@ -20,19 +22,34 @@ class TradutorAssemblyScript {
|
|
|
20
22
|
Binario: this.traduzirConstrutoBinario.bind(this),
|
|
21
23
|
Chamada: this.traduzirConstrutoChamada.bind(this),
|
|
22
24
|
ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
|
|
25
|
+
Deceto: this.traduzirConstrutoDeceto.bind(this),
|
|
23
26
|
DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
|
|
27
|
+
Dicionario: this.traduzirConstrutoDicionario.bind(this),
|
|
28
|
+
Dupla: this.traduzirConstrutoDupla.bind(this),
|
|
29
|
+
Elvis: this.traduzirConstrutoElvis.bind(this),
|
|
30
|
+
ExpressaoRegular: this.traduzirConstrutoExpressaoRegular.bind(this),
|
|
24
31
|
FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
|
|
25
32
|
Isto: () => 'this',
|
|
26
33
|
Literal: this.traduzirConstrutoLiteral.bind(this),
|
|
27
34
|
Logico: this.traduzirConstrutoLogico.bind(this),
|
|
35
|
+
Noneto: this.traduzirConstrutoNoneto.bind(this),
|
|
36
|
+
Octeto: this.traduzirConstrutoOcteto.bind(this),
|
|
37
|
+
Quarteto: this.traduzirConstrutoQuarteto.bind(this),
|
|
38
|
+
Quinteto: this.traduzirConstrutoQuinteto.bind(this),
|
|
28
39
|
ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
|
|
29
40
|
Separador: this.traduzirConstrutoSeparador.bind(this),
|
|
41
|
+
SeTernario: this.traduzirConstrutoSeTernario.bind(this),
|
|
42
|
+
Sexteto: this.traduzirConstrutoSexteto.bind(this),
|
|
43
|
+
Septeto: this.traduzirConstrutoSepteto.bind(this),
|
|
30
44
|
TipoDe: this.traduzirConstrutoTipoDe.bind(this),
|
|
45
|
+
Trio: this.traduzirConstrutoTrio.bind(this),
|
|
46
|
+
TuplaN: this.traduzirConstrutoTuplaN.bind(this),
|
|
31
47
|
Unario: this.traduzirConstrutoUnario.bind(this),
|
|
32
48
|
Variavel: this.traduzirConstrutoVariavel.bind(this),
|
|
33
49
|
Vetor: this.traduzirConstrutoVetor.bind(this),
|
|
34
50
|
};
|
|
35
51
|
this.dicionarioDeclaracoes = {
|
|
52
|
+
Ajuda: this.traduzirDeclaracaoAjuda.bind(this),
|
|
36
53
|
Bloco: this.traduzirDeclaracaoBloco.bind(this),
|
|
37
54
|
Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
|
|
38
55
|
Comentario: this.traduzirConstrutoComentario.bind(this),
|
|
@@ -52,8 +69,13 @@ class TradutorAssemblyScript {
|
|
|
52
69
|
Classe: this.traduzirDeclaracaoClasse.bind(this),
|
|
53
70
|
Tente: this.traduzirDeclaracaoTente.bind(this),
|
|
54
71
|
Const: this.traduzirDeclaracaoConst.bind(this),
|
|
72
|
+
ConstMultiplo: this.traduzirDeclaracaoConstMultiplo.bind(this),
|
|
55
73
|
Var: this.traduzirDeclaracaoVar.bind(this),
|
|
74
|
+
VarMultiplo: this.traduzirDeclaracaoVarMultiplo.bind(this),
|
|
56
75
|
Escreva: this.traduzirDeclaracaoEscreva.bind(this),
|
|
76
|
+
EscrevaMesmaLinha: this.traduzirDeclaracaoEscrevaMesmaLinha.bind(this),
|
|
77
|
+
TendoComo: this.traduzirDeclaracaoTendoComo.bind(this),
|
|
78
|
+
TextoDocumentacao: this.traduzirDeclaracaoTextoDocumentacao.bind(this),
|
|
57
79
|
};
|
|
58
80
|
}
|
|
59
81
|
traduzirSimboloOperador(operador) {
|
|
@@ -69,7 +91,7 @@ class TradutorAssemblyScript {
|
|
|
69
91
|
case delegua_1.default.BIT_NOT:
|
|
70
92
|
return '~';
|
|
71
93
|
case delegua_1.default.DIFERENTE:
|
|
72
|
-
return '
|
|
94
|
+
return '!=';
|
|
73
95
|
case delegua_1.default.DIVISAO:
|
|
74
96
|
return '/';
|
|
75
97
|
case delegua_1.default.E:
|
|
@@ -79,7 +101,7 @@ class TradutorAssemblyScript {
|
|
|
79
101
|
case delegua_1.default.IGUAL:
|
|
80
102
|
return '=';
|
|
81
103
|
case delegua_1.default.IGUAL_IGUAL:
|
|
82
|
-
return '
|
|
104
|
+
return '==';
|
|
83
105
|
case delegua_1.default.MAIOR:
|
|
84
106
|
return '>';
|
|
85
107
|
case delegua_1.default.MAIOR_IGUAL:
|
|
@@ -100,6 +122,7 @@ class TradutorAssemblyScript {
|
|
|
100
122
|
}
|
|
101
123
|
traduzirFuncoesNativas(metodo) {
|
|
102
124
|
switch (metodo.toLowerCase()) {
|
|
125
|
+
// Array methods
|
|
103
126
|
case 'adicionar':
|
|
104
127
|
case 'empilhar':
|
|
105
128
|
return 'push';
|
|
@@ -108,6 +131,7 @@ class TradutorAssemblyScript {
|
|
|
108
131
|
case 'fatiar':
|
|
109
132
|
return 'slice';
|
|
110
133
|
case 'inclui':
|
|
134
|
+
case 'incluido':
|
|
111
135
|
return 'includes';
|
|
112
136
|
case 'inverter':
|
|
113
137
|
return 'reverse';
|
|
@@ -121,16 +145,126 @@ class TradutorAssemblyScript {
|
|
|
121
145
|
return 'pop';
|
|
122
146
|
case 'tamanho':
|
|
123
147
|
return 'length';
|
|
148
|
+
case 'indice':
|
|
149
|
+
case 'indiceode':
|
|
150
|
+
return 'indexOf';
|
|
151
|
+
// String methods
|
|
124
152
|
case 'maiusculo':
|
|
125
153
|
return 'toUpperCase';
|
|
126
154
|
case 'minusculo':
|
|
127
155
|
return 'toLowerCase';
|
|
128
156
|
case 'substituir':
|
|
129
157
|
return 'replace';
|
|
158
|
+
case 'trimcomeco':
|
|
159
|
+
return 'trimStart';
|
|
160
|
+
case 'trimfim':
|
|
161
|
+
return 'trimEnd';
|
|
162
|
+
case 'trim':
|
|
163
|
+
return 'trim';
|
|
164
|
+
case 'comeca':
|
|
165
|
+
return 'startsWith';
|
|
166
|
+
case 'termina':
|
|
167
|
+
return 'endsWith';
|
|
168
|
+
case 'contém':
|
|
169
|
+
case 'contem':
|
|
170
|
+
return 'includes';
|
|
171
|
+
// Math constants and methods (would need Math. prefix in AS)
|
|
172
|
+
case 'abs':
|
|
173
|
+
case 'absoluto':
|
|
174
|
+
return 'Math.abs';
|
|
175
|
+
case 'ceil':
|
|
176
|
+
case 'teto':
|
|
177
|
+
return 'Math.ceil';
|
|
178
|
+
case 'floor':
|
|
179
|
+
case 'piso':
|
|
180
|
+
return 'Math.floor';
|
|
181
|
+
case 'round':
|
|
182
|
+
case 'arredondar':
|
|
183
|
+
return 'Math.round';
|
|
184
|
+
case 'sqrt':
|
|
185
|
+
case 'raizquadrada':
|
|
186
|
+
return 'Math.sqrt';
|
|
187
|
+
case 'pow':
|
|
188
|
+
case 'potencia':
|
|
189
|
+
return 'Math.pow';
|
|
190
|
+
case 'max':
|
|
191
|
+
case 'maximo':
|
|
192
|
+
return 'Math.max';
|
|
193
|
+
case 'min':
|
|
194
|
+
case 'minimo':
|
|
195
|
+
return 'Math.min';
|
|
196
|
+
case 'sin':
|
|
197
|
+
case 'seno':
|
|
198
|
+
return 'Math.sin';
|
|
199
|
+
case 'cos':
|
|
200
|
+
case 'cosseno':
|
|
201
|
+
return 'Math.cos';
|
|
202
|
+
case 'tan':
|
|
203
|
+
case 'tangente':
|
|
204
|
+
return 'Math.tan';
|
|
205
|
+
case 'pi':
|
|
206
|
+
return 'Math.PI';
|
|
207
|
+
case 'e':
|
|
208
|
+
return 'Math.E';
|
|
130
209
|
default:
|
|
131
210
|
return metodo;
|
|
132
211
|
}
|
|
133
212
|
}
|
|
213
|
+
traduzirFuncaoNativaGlobal(nomeFuncao, argumentos) {
|
|
214
|
+
switch (nomeFuncao.toLowerCase()) {
|
|
215
|
+
// Math functions
|
|
216
|
+
case 'aleatorio':
|
|
217
|
+
return `Math.random()`;
|
|
218
|
+
case 'aleatorioEntre':
|
|
219
|
+
case 'aleatorioente':
|
|
220
|
+
if (argumentos.length >= 2) {
|
|
221
|
+
return `(Math.random() * (${argumentos[1]} - ${argumentos[0]}) + ${argumentos[0]})`;
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
case 'arredondar':
|
|
225
|
+
return argumentos.length > 0 ? `Math.round(${argumentos[0]})` : null;
|
|
226
|
+
case 'inteiro':
|
|
227
|
+
return argumentos.length > 0 ? `Math.trunc(${argumentos[0]})` : null;
|
|
228
|
+
case 'numero':
|
|
229
|
+
return argumentos.length > 0 ? `Number(${argumentos[0]})` : null;
|
|
230
|
+
case 'texto':
|
|
231
|
+
return argumentos.length > 0 ? `String(${argumentos[0]})` : null;
|
|
232
|
+
case 'longo':
|
|
233
|
+
return argumentos.length > 0 ? `parseInt(${argumentos[0]})` : null;
|
|
234
|
+
case 'real':
|
|
235
|
+
return argumentos.length > 0 ? `parseFloat(${argumentos[0]})` : null;
|
|
236
|
+
// Array functions
|
|
237
|
+
case 'tamanho':
|
|
238
|
+
return argumentos.length > 0 ? `(${argumentos[0]}).length` : null;
|
|
239
|
+
case 'intervalo':
|
|
240
|
+
// intervalo(inicio, fim, passo?) - returns array of numbers
|
|
241
|
+
if (argumentos.length >= 2) {
|
|
242
|
+
if (argumentos.length >= 3) {
|
|
243
|
+
return `Array.from({length: (${argumentos[1]} - ${argumentos[0]}) / ${argumentos[2]}}, (_, i) => ${argumentos[0]} + i * ${argumentos[2]})`;
|
|
244
|
+
}
|
|
245
|
+
return `Array.from({length: ${argumentos[1]} - ${argumentos[0]}}, (_, i) => ${argumentos[0]} + i)`;
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
case 'maximo':
|
|
249
|
+
return argumentos.length > 0 ? `Math.max(...${argumentos[0]})` : null;
|
|
250
|
+
case 'minimo':
|
|
251
|
+
return argumentos.length > 0 ? `Math.min(...${argumentos[0]})` : null;
|
|
252
|
+
// These need custom implementation or are too complex for Phase 5
|
|
253
|
+
case 'mapear':
|
|
254
|
+
case 'filtrarPor':
|
|
255
|
+
case 'reduzir':
|
|
256
|
+
case 'ordenar':
|
|
257
|
+
case 'encontrar':
|
|
258
|
+
case 'encontrarIndice':
|
|
259
|
+
case 'incluido':
|
|
260
|
+
case 'todos':
|
|
261
|
+
case 'algum':
|
|
262
|
+
// These would require closures/lambda support - not easily translated
|
|
263
|
+
return null;
|
|
264
|
+
default:
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
134
268
|
traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
|
|
135
269
|
const argumentosResolvidos = [];
|
|
136
270
|
for (const argumento of argumentos) {
|
|
@@ -155,7 +289,7 @@ class TradutorAssemblyScript {
|
|
|
155
289
|
return `${separador.conteudo} `;
|
|
156
290
|
}
|
|
157
291
|
traduzirDeclaracaoEscreva(declaracaoEscreva) {
|
|
158
|
-
let resultado = '
|
|
292
|
+
let resultado = 'trace(';
|
|
159
293
|
for (const argumento of declaracaoEscreva.argumentos) {
|
|
160
294
|
const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
161
295
|
resultado += valor + ', ';
|
|
@@ -166,7 +300,7 @@ class TradutorAssemblyScript {
|
|
|
166
300
|
}
|
|
167
301
|
traduzirConstrutoLiteral(literal) {
|
|
168
302
|
if (typeof literal.valor === 'string')
|
|
169
|
-
return `
|
|
303
|
+
return `"${literal.valor}"`;
|
|
170
304
|
return String(literal.valor);
|
|
171
305
|
}
|
|
172
306
|
resolveTipoDeclaracaoVarEContante(tipo) {
|
|
@@ -174,25 +308,67 @@ class TradutorAssemblyScript {
|
|
|
174
308
|
case 'texto':
|
|
175
309
|
return ': string';
|
|
176
310
|
case 'inteiro':
|
|
311
|
+
return ': i32';
|
|
312
|
+
case 'longo':
|
|
313
|
+
return ': i64';
|
|
314
|
+
case 'inteiro_curto':
|
|
315
|
+
case 'inteiroCurto':
|
|
316
|
+
return ': i16';
|
|
317
|
+
case 'byte':
|
|
318
|
+
return ': i8';
|
|
177
319
|
case 'numero':
|
|
178
320
|
case 'número':
|
|
179
321
|
case 'real':
|
|
180
322
|
return ': f64';
|
|
323
|
+
case 'real_curto':
|
|
324
|
+
case 'realCurto':
|
|
325
|
+
return ': f32';
|
|
181
326
|
case 'logico':
|
|
182
327
|
case 'lógico':
|
|
183
328
|
return ': bool';
|
|
329
|
+
case 'vazio':
|
|
330
|
+
case 'nada':
|
|
331
|
+
return ': void';
|
|
184
332
|
case 'nulo':
|
|
185
|
-
|
|
333
|
+
throw new Error(`Tipo 'nulo' não é válido no AssemblyScript. Use 'Type | null' para tipos anuláveis.`);
|
|
186
334
|
case 'inteiro[]':
|
|
335
|
+
return ': i32[]';
|
|
336
|
+
case 'longo[]':
|
|
337
|
+
return ': i64[]';
|
|
187
338
|
case 'real[]':
|
|
339
|
+
case 'numero[]':
|
|
340
|
+
case 'número[]':
|
|
188
341
|
return ': f64[]';
|
|
189
342
|
case 'texto[]':
|
|
190
343
|
return ': string[]';
|
|
191
344
|
case 'logico[]':
|
|
192
345
|
case 'lógico[]':
|
|
193
346
|
return ': bool[]';
|
|
347
|
+
case 'dicionario':
|
|
348
|
+
case 'dicionário':
|
|
349
|
+
return ': Map<string, i32>';
|
|
350
|
+
case 'dupla':
|
|
351
|
+
return ': i32[]';
|
|
352
|
+
case 'trio':
|
|
353
|
+
return ': i32[]';
|
|
354
|
+
case 'quarteto':
|
|
355
|
+
return ': i32[]';
|
|
356
|
+
case 'quinteto':
|
|
357
|
+
return ': i32[]';
|
|
358
|
+
case 'sexteto':
|
|
359
|
+
return ': i32[]';
|
|
360
|
+
case 'septeto':
|
|
361
|
+
return ': i32[]';
|
|
362
|
+
case 'octeto':
|
|
363
|
+
return ': i32[]';
|
|
364
|
+
case 'noneto':
|
|
365
|
+
return ': i32[]';
|
|
366
|
+
case 'deceto':
|
|
367
|
+
return ': i32[]';
|
|
368
|
+
case 'tupla':
|
|
369
|
+
return ': i32[]';
|
|
194
370
|
default:
|
|
195
|
-
|
|
371
|
+
throw new Error(`Tipo não reconhecido ou não suportado no AssemblyScript: '${tipo}'. AssemblyScript requer anotações de tipo explícitas.`);
|
|
196
372
|
}
|
|
197
373
|
}
|
|
198
374
|
traduzirDeclaracaoVar(declaracaoVar) {
|
|
@@ -232,7 +408,8 @@ class TradutorAssemblyScript {
|
|
|
232
408
|
return resultado;
|
|
233
409
|
}
|
|
234
410
|
traduzirDeclaracaoTente(declaracaoTente) {
|
|
235
|
-
let resultado = 'try
|
|
411
|
+
let resultado = '/* AVISO: AssemblyScript não suporta try/catch/finally. Este código pode não funcionar como esperado. */\n';
|
|
412
|
+
resultado += 'try {\n';
|
|
236
413
|
this.indentacao += 4;
|
|
237
414
|
resultado += ' '.repeat(this.indentacao);
|
|
238
415
|
for (let condicao of declaracaoTente.caminhoTente) {
|
|
@@ -268,6 +445,81 @@ class TradutorAssemblyScript {
|
|
|
268
445
|
}
|
|
269
446
|
return resultado;
|
|
270
447
|
}
|
|
448
|
+
traduzirDeclaracaoVarMultiplo(declaracaoVarMultiplo) {
|
|
449
|
+
const variaveis = declaracaoVarMultiplo.simbolos.map(s => s.lexema).join(', ');
|
|
450
|
+
let resultado = 'let ';
|
|
451
|
+
resultado += variaveis;
|
|
452
|
+
resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoVarMultiplo.tipo);
|
|
453
|
+
if (!(declaracaoVarMultiplo === null || declaracaoVarMultiplo === void 0 ? void 0 : declaracaoVarMultiplo.inicializador))
|
|
454
|
+
resultado += ';';
|
|
455
|
+
else {
|
|
456
|
+
resultado += ' = ';
|
|
457
|
+
if (this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name]) {
|
|
458
|
+
resultado += this.dicionarioConstrutos[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
resultado += this.dicionarioDeclaracoes[declaracaoVarMultiplo.inicializador.constructor.name](declaracaoVarMultiplo.inicializador);
|
|
462
|
+
}
|
|
463
|
+
resultado += ';';
|
|
464
|
+
}
|
|
465
|
+
return resultado;
|
|
466
|
+
}
|
|
467
|
+
traduzirDeclaracaoConstMultiplo(declaracaoConstMultiplo) {
|
|
468
|
+
const constantes = declaracaoConstMultiplo.simbolos.map(s => s.lexema).join(', ');
|
|
469
|
+
let resultado = 'const ';
|
|
470
|
+
resultado += constantes;
|
|
471
|
+
resultado += this.resolveTipoDeclaracaoVarEContante(declaracaoConstMultiplo.tipo);
|
|
472
|
+
if (!(declaracaoConstMultiplo === null || declaracaoConstMultiplo === void 0 ? void 0 : declaracaoConstMultiplo.inicializador))
|
|
473
|
+
resultado += ';';
|
|
474
|
+
else {
|
|
475
|
+
resultado += ' = ';
|
|
476
|
+
if (this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name]) {
|
|
477
|
+
resultado += this.dicionarioConstrutos[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
resultado += this.dicionarioDeclaracoes[declaracaoConstMultiplo.inicializador.constructor.name](declaracaoConstMultiplo.inicializador);
|
|
481
|
+
}
|
|
482
|
+
resultado += ';';
|
|
483
|
+
}
|
|
484
|
+
return resultado;
|
|
485
|
+
}
|
|
486
|
+
traduzirDeclaracaoEscrevaMesmaLinha(declaracaoEscrevaMesmaLinha) {
|
|
487
|
+
let resultado = 'trace(';
|
|
488
|
+
for (const argumento of declaracaoEscrevaMesmaLinha.argumentos) {
|
|
489
|
+
const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
490
|
+
resultado += valor + ', ';
|
|
491
|
+
}
|
|
492
|
+
resultado = resultado.slice(0, -2);
|
|
493
|
+
resultado += ')';
|
|
494
|
+
return resultado;
|
|
495
|
+
}
|
|
496
|
+
traduzirDeclaracaoTendoComo(declaracaoTendoComo) {
|
|
497
|
+
// TendoComo is a resource management pattern (like try-with-resources in Java)
|
|
498
|
+
// AssemblyScript doesn't have built-in support, so we'll just treat it as a scope
|
|
499
|
+
let resultado = `// tendo ${declaracaoTendoComo.simboloVariavel.lexema} como recurso\n`;
|
|
500
|
+
resultado += ' '.repeat(this.indentacao);
|
|
501
|
+
resultado += `let ${declaracaoTendoComo.simboloVariavel.lexema} = `;
|
|
502
|
+
if (this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name]) {
|
|
503
|
+
resultado += this.dicionarioConstrutos[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.inicializacaoVariavel.constructor.name](declaracaoTendoComo.inicializacaoVariavel);
|
|
507
|
+
}
|
|
508
|
+
resultado += ';\n';
|
|
509
|
+
resultado += ' '.repeat(this.indentacao);
|
|
510
|
+
resultado += this.dicionarioDeclaracoes[declaracaoTendoComo.corpo.constructor.name](declaracaoTendoComo.corpo);
|
|
511
|
+
return resultado;
|
|
512
|
+
}
|
|
513
|
+
traduzirDeclaracaoAjuda(declaracaoAjuda) {
|
|
514
|
+
// Ajuda is a help/documentation statement
|
|
515
|
+
// In AssemblyScript, we'll just comment it out
|
|
516
|
+
return '// ajuda' + '\n';
|
|
517
|
+
}
|
|
518
|
+
traduzirDeclaracaoTextoDocumentacao(declaracaoTextoDoc) {
|
|
519
|
+
// TextoDocumentacao is documentation text
|
|
520
|
+
// We'll convert it to a comment
|
|
521
|
+
return `/** ${declaracaoTextoDoc} */\n`;
|
|
522
|
+
}
|
|
271
523
|
logicaComumBlocoEscopo(declaracoes) {
|
|
272
524
|
let resultado = '{\n';
|
|
273
525
|
this.indentacao += 4;
|
|
@@ -351,10 +603,38 @@ class TradutorAssemblyScript {
|
|
|
351
603
|
return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
|
|
352
604
|
}
|
|
353
605
|
traduzirDeclaracaoParaCada(declaracaoParaCada) {
|
|
354
|
-
|
|
606
|
+
// AssemblyScript não suporta for...of. Convertendo para loop baseado em índice.
|
|
607
|
+
if (declaracaoParaCada.variavelIteracao.constructor.name !== 'Variavel') {
|
|
608
|
+
throw new Error('Desestruturação em paraCada não é suportada no AssemblyScript. Use uma variável simples.');
|
|
609
|
+
}
|
|
610
|
+
const nomeVariavel = declaracaoParaCada.variavelIteracao.simbolo.lexema;
|
|
611
|
+
const nomeVetor = `__arr_${nomeVariavel}`;
|
|
612
|
+
let resultado = `const ${nomeVetor} = `;
|
|
355
613
|
resultado +=
|
|
356
|
-
this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + '
|
|
357
|
-
resultado +=
|
|
614
|
+
this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario) + ';';
|
|
615
|
+
resultado += '\n';
|
|
616
|
+
resultado += ' '.repeat(this.indentacao);
|
|
617
|
+
resultado += `for (let __i_${nomeVariavel} = 0; __i_${nomeVariavel} < ${nomeVetor}.length; __i_${nomeVariavel}++) `;
|
|
618
|
+
// Injeta a atribuição da variável de iteração no início do corpo do bloco
|
|
619
|
+
const corpoBloco = declaracaoParaCada.corpo;
|
|
620
|
+
const declaracoesCorpo = corpoBloco.declaracoes || [];
|
|
621
|
+
let resultadoCorpo = '{\n';
|
|
622
|
+
this.indentacao += 4;
|
|
623
|
+
resultadoCorpo += ' '.repeat(this.indentacao) + `const ${nomeVariavel} = ${nomeVetor}[__i_${nomeVariavel}];\n`;
|
|
624
|
+
for (const declaracaoOuConstruto of declaracoesCorpo) {
|
|
625
|
+
resultadoCorpo += ' '.repeat(this.indentacao);
|
|
626
|
+
const nomeConstrutor = declaracaoOuConstruto.constructor.name;
|
|
627
|
+
if (this.dicionarioConstrutos.hasOwnProperty(nomeConstrutor)) {
|
|
628
|
+
resultadoCorpo += this.dicionarioConstrutos[nomeConstrutor](declaracaoOuConstruto);
|
|
629
|
+
}
|
|
630
|
+
else {
|
|
631
|
+
resultadoCorpo += this.dicionarioDeclaracoes[nomeConstrutor](declaracaoOuConstruto);
|
|
632
|
+
}
|
|
633
|
+
resultadoCorpo += '\n';
|
|
634
|
+
}
|
|
635
|
+
this.indentacao -= 4;
|
|
636
|
+
resultadoCorpo += ' '.repeat(this.indentacao) + '}\n';
|
|
637
|
+
resultado += resultadoCorpo;
|
|
358
638
|
return resultado;
|
|
359
639
|
}
|
|
360
640
|
traduzirDeclaracaoPara(declaracaoPara) {
|
|
@@ -383,19 +663,89 @@ class TradutorAssemblyScript {
|
|
|
383
663
|
}
|
|
384
664
|
traduzirDeclaracaoFuncao(declaracaoFuncao) {
|
|
385
665
|
let resultado = 'function ';
|
|
386
|
-
resultado += declaracaoFuncao.simbolo.lexema + '
|
|
666
|
+
resultado += declaracaoFuncao.simbolo.lexema + '(';
|
|
667
|
+
// Adiciona parâmetros com tipos
|
|
387
668
|
for (const parametro of declaracaoFuncao.funcao.parametros) {
|
|
388
|
-
resultado += parametro.nome.lexema
|
|
669
|
+
resultado += parametro.nome.lexema;
|
|
670
|
+
// Adiciona tipo do parâmetro se disponível
|
|
671
|
+
if (parametro.tipoDado) {
|
|
672
|
+
try {
|
|
673
|
+
resultado += this.resolveTipoDeclaracaoVarEContante(parametro.tipoDado);
|
|
674
|
+
}
|
|
675
|
+
catch (e) {
|
|
676
|
+
// Se não conseguir resolver o tipo, lança erro mais específico
|
|
677
|
+
throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' tem tipo não suportado: '${parametro.tipoDado}'`);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
// AssemblyScript requer tipos explícitos em todos os parâmetros
|
|
682
|
+
throw new Error(`Parâmetro '${parametro.nome.lexema}' da função '${declaracaoFuncao.simbolo.lexema}' não tem tipo definido. AssemblyScript requer tipos explícitos.`);
|
|
683
|
+
}
|
|
684
|
+
resultado += ', ';
|
|
389
685
|
}
|
|
390
686
|
if (declaracaoFuncao.funcao.parametros.length > 0) {
|
|
391
687
|
resultado = resultado.slice(0, -2);
|
|
392
688
|
}
|
|
393
|
-
resultado += ')
|
|
689
|
+
resultado += ')';
|
|
690
|
+
// Adiciona tipo de retorno
|
|
691
|
+
const tipoRetorno = this.inferirTipoRetornoFuncao(declaracaoFuncao.funcao);
|
|
692
|
+
resultado += tipoRetorno;
|
|
693
|
+
resultado += ' ';
|
|
394
694
|
resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
|
|
395
695
|
return resultado;
|
|
396
696
|
}
|
|
697
|
+
inferirTipoRetornoFuncao(funcao) {
|
|
698
|
+
// Se a função tem tipo de retorno explícito, usa ele
|
|
699
|
+
if (funcao.tipo && funcao.tipo !== 'qualquer') {
|
|
700
|
+
try {
|
|
701
|
+
return this.resolveTipoDeclaracaoVarEContante(funcao.tipo);
|
|
702
|
+
}
|
|
703
|
+
catch (e) {
|
|
704
|
+
// Se não conseguir resolver, retorna void por padrão
|
|
705
|
+
return ': void';
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
// Procura por declarações de retorno no corpo e infere tipo a partir delas
|
|
709
|
+
const tipoInferido = this.inferirTipoDeRetorno(funcao.corpo);
|
|
710
|
+
if (tipoInferido) {
|
|
711
|
+
try {
|
|
712
|
+
return this.resolveTipoDeclaracaoVarEContante(tipoInferido);
|
|
713
|
+
}
|
|
714
|
+
catch (e) {
|
|
715
|
+
return ': void';
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
return ': void';
|
|
719
|
+
}
|
|
720
|
+
inferirTipoDeRetorno(corpo) {
|
|
721
|
+
if (!corpo)
|
|
722
|
+
return null;
|
|
723
|
+
for (const declaracao of corpo) {
|
|
724
|
+
if (declaracao.constructor.name === 'Retorna') {
|
|
725
|
+
const retorna = declaracao;
|
|
726
|
+
if (retorna.tipo && retorna.tipo !== 'vazio') {
|
|
727
|
+
return retorna.tipo;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
// Verifica recursivamente em blocos aninhados
|
|
731
|
+
if (declaracao.corpo) {
|
|
732
|
+
const corpoInterno = declaracao.corpo;
|
|
733
|
+
if (Array.isArray(corpoInterno)) {
|
|
734
|
+
const tipo = this.inferirTipoDeRetorno(corpoInterno);
|
|
735
|
+
if (tipo)
|
|
736
|
+
return tipo;
|
|
737
|
+
}
|
|
738
|
+
else if (corpoInterno.declaracoes) {
|
|
739
|
+
const tipo = this.inferirTipoDeRetorno(corpoInterno.declaracoes);
|
|
740
|
+
if (tipo)
|
|
741
|
+
return tipo;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
return null;
|
|
746
|
+
}
|
|
397
747
|
traduzirDeclaracaoFalhar(falhar) {
|
|
398
|
-
return `
|
|
748
|
+
return `abort('${falhar.explicacao.valor}')`;
|
|
399
749
|
}
|
|
400
750
|
traduzirDeclaracaoFazer(declaracaoFazer) {
|
|
401
751
|
let resultado = 'do ';
|
|
@@ -474,6 +824,146 @@ class TradutorAssemblyScript {
|
|
|
474
824
|
resultado += ']';
|
|
475
825
|
return resultado;
|
|
476
826
|
}
|
|
827
|
+
traduzirConstrutoDicionario(dicionario) {
|
|
828
|
+
// AssemblyScript Maps são inicializados via construtor
|
|
829
|
+
// Map<K, V>() requer: new Map<string, ValueType>()
|
|
830
|
+
if (!dicionario.chaves.length) {
|
|
831
|
+
return 'new Map<string, i32>()';
|
|
832
|
+
}
|
|
833
|
+
// AssemblyScript não suporta literal syntax para Map, precisa usar constructor
|
|
834
|
+
// Gerar algo como: { let m = new Map<string, i32>(); m.set("key", value); ... return m; }
|
|
835
|
+
let resultado = '(() => { let m = new Map<string, i32>(); ';
|
|
836
|
+
for (let i = 0; i < dicionario.chaves.length; i++) {
|
|
837
|
+
const chave = dicionario.chaves[i];
|
|
838
|
+
const valor = dicionario.valores[i];
|
|
839
|
+
// A chave pode ser um Construto (como Literal) ou um valor simples
|
|
840
|
+
let chaveStr;
|
|
841
|
+
if (typeof chave === 'string') {
|
|
842
|
+
chaveStr = `"${chave}"`;
|
|
843
|
+
}
|
|
844
|
+
else if (chave && chave.constructor && this.dicionarioConstrutos[chave.constructor.name]) {
|
|
845
|
+
// Se for um Construto, traduzi-lo
|
|
846
|
+
chaveStr = this.dicionarioConstrutos[chave.constructor.name](chave);
|
|
847
|
+
}
|
|
848
|
+
else {
|
|
849
|
+
// Fallback: converter para string
|
|
850
|
+
chaveStr = `"${String(chave)}"`;
|
|
851
|
+
}
|
|
852
|
+
resultado += `m.set(${chaveStr}, ${this.dicionarioConstrutos[valor.constructor.name](valor)}); `;
|
|
853
|
+
}
|
|
854
|
+
resultado += 'return m; })()';
|
|
855
|
+
return resultado;
|
|
856
|
+
}
|
|
857
|
+
traduzirConstrutoDupla(dupla) {
|
|
858
|
+
const primeiro = this.dicionarioConstrutos[dupla.primeiro.constructor.name](dupla.primeiro);
|
|
859
|
+
const segundo = this.dicionarioConstrutos[dupla.segundo.constructor.name](dupla.segundo);
|
|
860
|
+
return `[${primeiro}, ${segundo}]`;
|
|
861
|
+
}
|
|
862
|
+
traduzirConstrutoTrio(trio) {
|
|
863
|
+
const primeiro = this.dicionarioConstrutos[trio.primeiro.constructor.name](trio.primeiro);
|
|
864
|
+
const segundo = this.dicionarioConstrutos[trio.segundo.constructor.name](trio.segundo);
|
|
865
|
+
const terceiro = this.dicionarioConstrutos[trio.terceiro.constructor.name](trio.terceiro);
|
|
866
|
+
return `[${primeiro}, ${segundo}, ${terceiro}]`;
|
|
867
|
+
}
|
|
868
|
+
traduzirConstrutoQuarteto(quarteto) {
|
|
869
|
+
const primeiro = this.dicionarioConstrutos[quarteto.primeiro.constructor.name](quarteto.primeiro);
|
|
870
|
+
const segundo = this.dicionarioConstrutos[quarteto.segundo.constructor.name](quarteto.segundo);
|
|
871
|
+
const terceiro = this.dicionarioConstrutos[quarteto.terceiro.constructor.name](quarteto.terceiro);
|
|
872
|
+
const quarto = this.dicionarioConstrutos[quarteto.quarto.constructor.name](quarteto.quarto);
|
|
873
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}]`;
|
|
874
|
+
}
|
|
875
|
+
traduzirConstrutoQuinteto(quinteto) {
|
|
876
|
+
const primeiro = this.dicionarioConstrutos[quinteto.primeiro.constructor.name](quinteto.primeiro);
|
|
877
|
+
const segundo = this.dicionarioConstrutos[quinteto.segundo.constructor.name](quinteto.segundo);
|
|
878
|
+
const terceiro = this.dicionarioConstrutos[quinteto.terceiro.constructor.name](quinteto.terceiro);
|
|
879
|
+
const quarto = this.dicionarioConstrutos[quinteto.quarto.constructor.name](quinteto.quarto);
|
|
880
|
+
const quinto = this.dicionarioConstrutos[quinteto.quinto.constructor.name](quinteto.quinto);
|
|
881
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}]`;
|
|
882
|
+
}
|
|
883
|
+
traduzirConstrutoSexteto(sexteto) {
|
|
884
|
+
const primeiro = this.dicionarioConstrutos[sexteto.primeiro.constructor.name](sexteto.primeiro);
|
|
885
|
+
const segundo = this.dicionarioConstrutos[sexteto.segundo.constructor.name](sexteto.segundo);
|
|
886
|
+
const terceiro = this.dicionarioConstrutos[sexteto.terceiro.constructor.name](sexteto.terceiro);
|
|
887
|
+
const quarto = this.dicionarioConstrutos[sexteto.quarto.constructor.name](sexteto.quarto);
|
|
888
|
+
const quinto = this.dicionarioConstrutos[sexteto.quinto.constructor.name](sexteto.quinto);
|
|
889
|
+
const sexto = this.dicionarioConstrutos[sexteto.sexto.constructor.name](sexteto.sexto);
|
|
890
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}]`;
|
|
891
|
+
}
|
|
892
|
+
traduzirConstrutoSepteto(septeto) {
|
|
893
|
+
const primeiro = this.dicionarioConstrutos[septeto.primeiro.constructor.name](septeto.primeiro);
|
|
894
|
+
const segundo = this.dicionarioConstrutos[septeto.segundo.constructor.name](septeto.segundo);
|
|
895
|
+
const terceiro = this.dicionarioConstrutos[septeto.terceiro.constructor.name](septeto.terceiro);
|
|
896
|
+
const quarto = this.dicionarioConstrutos[septeto.quarto.constructor.name](septeto.quarto);
|
|
897
|
+
const quinto = this.dicionarioConstrutos[septeto.quinto.constructor.name](septeto.quinto);
|
|
898
|
+
const sexto = this.dicionarioConstrutos[septeto.sexto.constructor.name](septeto.sexto);
|
|
899
|
+
const setimo = this.dicionarioConstrutos[septeto.setimo.constructor.name](septeto.setimo);
|
|
900
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}]`;
|
|
901
|
+
}
|
|
902
|
+
traduzirConstrutoOcteto(octeto) {
|
|
903
|
+
const primeiro = this.dicionarioConstrutos[octeto.primeiro.constructor.name](octeto.primeiro);
|
|
904
|
+
const segundo = this.dicionarioConstrutos[octeto.segundo.constructor.name](octeto.segundo);
|
|
905
|
+
const terceiro = this.dicionarioConstrutos[octeto.terceiro.constructor.name](octeto.terceiro);
|
|
906
|
+
const quarto = this.dicionarioConstrutos[octeto.quarto.constructor.name](octeto.quarto);
|
|
907
|
+
const quinto = this.dicionarioConstrutos[octeto.quinto.constructor.name](octeto.quinto);
|
|
908
|
+
const sexto = this.dicionarioConstrutos[octeto.sexto.constructor.name](octeto.sexto);
|
|
909
|
+
const setimo = this.dicionarioConstrutos[octeto.setimo.constructor.name](octeto.setimo);
|
|
910
|
+
const oitavo = this.dicionarioConstrutos[octeto.oitavo.constructor.name](octeto.oitavo);
|
|
911
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}]`;
|
|
912
|
+
}
|
|
913
|
+
traduzirConstrutoNoneto(noneto) {
|
|
914
|
+
const primeiro = this.dicionarioConstrutos[noneto.primeiro.constructor.name](noneto.primeiro);
|
|
915
|
+
const segundo = this.dicionarioConstrutos[noneto.segundo.constructor.name](noneto.segundo);
|
|
916
|
+
const terceiro = this.dicionarioConstrutos[noneto.terceiro.constructor.name](noneto.terceiro);
|
|
917
|
+
const quarto = this.dicionarioConstrutos[noneto.quarto.constructor.name](noneto.quarto);
|
|
918
|
+
const quinto = this.dicionarioConstrutos[noneto.quinto.constructor.name](noneto.quinto);
|
|
919
|
+
const sexto = this.dicionarioConstrutos[noneto.sexto.constructor.name](noneto.sexto);
|
|
920
|
+
const setimo = this.dicionarioConstrutos[noneto.setimo.constructor.name](noneto.setimo);
|
|
921
|
+
const oitavo = this.dicionarioConstrutos[noneto.oitavo.constructor.name](noneto.oitavo);
|
|
922
|
+
const nono = this.dicionarioConstrutos[noneto.nono.constructor.name](noneto.nono);
|
|
923
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}]`;
|
|
924
|
+
}
|
|
925
|
+
traduzirConstrutoDeceto(deceto) {
|
|
926
|
+
const primeiro = this.dicionarioConstrutos[deceto.primeiro.constructor.name](deceto.primeiro);
|
|
927
|
+
const segundo = this.dicionarioConstrutos[deceto.segundo.constructor.name](deceto.segundo);
|
|
928
|
+
const terceiro = this.dicionarioConstrutos[deceto.terceiro.constructor.name](deceto.terceiro);
|
|
929
|
+
const quarto = this.dicionarioConstrutos[deceto.quarto.constructor.name](deceto.quarto);
|
|
930
|
+
const quinto = this.dicionarioConstrutos[deceto.quinto.constructor.name](deceto.quinto);
|
|
931
|
+
const sexto = this.dicionarioConstrutos[deceto.sexto.constructor.name](deceto.sexto);
|
|
932
|
+
const setimo = this.dicionarioConstrutos[deceto.setimo.constructor.name](deceto.setimo);
|
|
933
|
+
const oitavo = this.dicionarioConstrutos[deceto.oitavo.constructor.name](deceto.oitavo);
|
|
934
|
+
const nono = this.dicionarioConstrutos[deceto.nono.constructor.name](deceto.nono);
|
|
935
|
+
const decimo = this.dicionarioConstrutos[deceto.decimo.constructor.name](deceto.decimo);
|
|
936
|
+
return `[${primeiro}, ${segundo}, ${terceiro}, ${quarto}, ${quinto}, ${sexto}, ${setimo}, ${oitavo}, ${nono}, ${decimo}]`;
|
|
937
|
+
}
|
|
938
|
+
traduzirConstrutoTuplaN(tuplaN) {
|
|
939
|
+
const elementos = tuplaN.elementos.map(elemento => this.dicionarioConstrutos[elemento.constructor.name](elemento));
|
|
940
|
+
return `[${elementos.join(', ')}]`;
|
|
941
|
+
}
|
|
942
|
+
traduzirConstrutoSeTernario(seTernario) {
|
|
943
|
+
const condicao = this.dicionarioConstrutos[seTernario.condicao.constructor.name](seTernario.condicao);
|
|
944
|
+
const expressaoSe = this.dicionarioConstrutos[seTernario.expressaoSe.constructor.name](seTernario.expressaoSe);
|
|
945
|
+
const expressaoSenao = this.dicionarioConstrutos[seTernario.expressaoSenao.constructor.name](seTernario.expressaoSenao);
|
|
946
|
+
return `${condicao} ? ${expressaoSe} : ${expressaoSenao}`;
|
|
947
|
+
}
|
|
948
|
+
traduzirConstrutoElvis(elvis) {
|
|
949
|
+
const esquerda = this.dicionarioConstrutos[elvis.esquerda.constructor.name](elvis.esquerda);
|
|
950
|
+
const direita = this.dicionarioConstrutos[elvis.direita.constructor.name](elvis.direita);
|
|
951
|
+
// Elvis operator (?:) is equivalent to || in JavaScript for null-coalescing
|
|
952
|
+
return `${esquerda} || ${direita}`;
|
|
953
|
+
}
|
|
954
|
+
traduzirConstrutoAcessoPropriedade(acessoPropriedade) {
|
|
955
|
+
const objeto = this.dicionarioConstrutos[acessoPropriedade.objeto.constructor.name](acessoPropriedade.objeto);
|
|
956
|
+
return `${objeto}.${acessoPropriedade.nomePropriedade}`;
|
|
957
|
+
}
|
|
958
|
+
traduzirConstrutoExpressaoRegular(expressaoRegular) {
|
|
959
|
+
// AssemblyScript doesn't have native regex support like JavaScript
|
|
960
|
+
// Return the pattern as a string for now
|
|
961
|
+
const valor = expressaoRegular.valor;
|
|
962
|
+
if (typeof valor === 'string') {
|
|
963
|
+
return `"${valor}"`;
|
|
964
|
+
}
|
|
965
|
+
return String(valor);
|
|
966
|
+
}
|
|
477
967
|
traduzirConstrutoVariavel(variavel) {
|
|
478
968
|
return variavel.simbolo.lexema;
|
|
479
969
|
}
|
|
@@ -491,20 +981,13 @@ class TradutorAssemblyScript {
|
|
|
491
981
|
return resultado;
|
|
492
982
|
}
|
|
493
983
|
traduzirConstrutoTipoDe(tipoDe) {
|
|
494
|
-
|
|
495
|
-
if (typeof tipoDe.valor === 'string')
|
|
496
|
-
resultado += `'${tipoDe.valor}'`;
|
|
497
|
-
else if (tipoDe.valor instanceof construtos_1.Vetor)
|
|
498
|
-
resultado += this.traduzirConstrutoVetor(tipoDe.valor);
|
|
499
|
-
else
|
|
500
|
-
resultado += this.dicionarioConstrutos[tipoDe.valor.constructor.name](tipoDe.valor);
|
|
501
|
-
return resultado;
|
|
984
|
+
throw new Error('O operador typeof não é suportado no AssemblyScript. Use verificações de tipo em tempo de compilação como instanceof ou is<T>() em vez disso.');
|
|
502
985
|
}
|
|
503
986
|
traduzirConstrutoLogico(logico) {
|
|
504
|
-
let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
505
|
-
let operador = this.traduzirSimboloOperador(logico.operador);
|
|
506
987
|
let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
507
|
-
|
|
988
|
+
let operador = this.traduzirSimboloOperador(logico.operador);
|
|
989
|
+
let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
990
|
+
return `${esquerda} ${operador} ${direita}`;
|
|
508
991
|
}
|
|
509
992
|
traduzirFuncaoConstruto(funcaoConstruto) {
|
|
510
993
|
let resultado = 'function(';
|
|
@@ -529,6 +1012,15 @@ class TradutorAssemblyScript {
|
|
|
529
1012
|
}
|
|
530
1013
|
traduzirConstrutoChamada(chamada) {
|
|
531
1014
|
let resultado = '';
|
|
1015
|
+
// Check if this is a native library function call
|
|
1016
|
+
if (chamada.entidadeChamada instanceof construtos_1.Variavel) {
|
|
1017
|
+
const nomeVariavel = chamada.entidadeChamada.simbolo.lexema;
|
|
1018
|
+
const argumentosTexto = chamada.argumentos.map(arg => this.dicionarioConstrutos[arg.constructor.name](arg));
|
|
1019
|
+
const funcaoNativa = this.traduzirFuncaoNativaGlobal(nomeVariavel, argumentosTexto);
|
|
1020
|
+
if (funcaoNativa) {
|
|
1021
|
+
return funcaoNativa;
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
532
1024
|
const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
|
|
533
1025
|
const instanciaClasse = this.declaracoesDeClasses.some((declaracao) => { var _a; return ((_a = declaracao === null || declaracao === void 0 ? void 0 : declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) === retorno; });
|
|
534
1026
|
if (instanciaClasse) {
|
|
@@ -564,6 +1056,12 @@ class TradutorAssemblyScript {
|
|
|
564
1056
|
return resultado;
|
|
565
1057
|
}
|
|
566
1058
|
traduzirConstrutoBinario(binario) {
|
|
1059
|
+
// Tratamento especial para exponenciação no AssemblyScript
|
|
1060
|
+
if (binario.operador.tipo === delegua_1.default.EXPONENCIACAO) {
|
|
1061
|
+
const esquerda = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
1062
|
+
const direita = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
1063
|
+
return `Math.pow(${esquerda}, ${direita})`;
|
|
1064
|
+
}
|
|
567
1065
|
let resultado = '';
|
|
568
1066
|
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
569
1067
|
resultado +=
|
|
@@ -589,16 +1087,23 @@ class TradutorAssemblyScript {
|
|
|
589
1087
|
' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
590
1088
|
return resultado;
|
|
591
1089
|
}
|
|
592
|
-
// TODO: Eliminar o soft cast para `any`.
|
|
593
1090
|
traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
|
|
594
|
-
var _a;
|
|
595
1091
|
let resultado = '';
|
|
596
|
-
|
|
1092
|
+
// Traduz o objeto (array ou coleção)
|
|
1093
|
+
if (AtribuicaoPorIndice.objeto instanceof construtos_1.Variavel) {
|
|
1094
|
+
resultado += AtribuicaoPorIndice.objeto.simbolo.lexema;
|
|
1095
|
+
}
|
|
1096
|
+
else {
|
|
1097
|
+
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.objeto.constructor.name](AtribuicaoPorIndice.objeto);
|
|
1098
|
+
}
|
|
1099
|
+
// Adiciona o índice
|
|
1100
|
+
resultado += '[';
|
|
597
1101
|
resultado +=
|
|
598
1102
|
this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
|
|
599
1103
|
resultado += ' = ';
|
|
600
|
-
|
|
601
|
-
|
|
1104
|
+
// Traduz o valor a ser atribuído
|
|
1105
|
+
if (AtribuicaoPorIndice.valor instanceof construtos_1.Variavel) {
|
|
1106
|
+
resultado += AtribuicaoPorIndice.valor.simbolo.lexema;
|
|
602
1107
|
}
|
|
603
1108
|
else {
|
|
604
1109
|
resultado += this.dicionarioConstrutos[AtribuicaoPorIndice.valor.constructor.name](AtribuicaoPorIndice.valor);
|