@designliquido/delegua 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +0 -3
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/comum.d.ts.map +1 -1
- package/avaliador-sintatico/comum.js +4 -2
- package/avaliador-sintatico/comum.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +11 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +21 -0
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +147 -0
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +21 -0
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +147 -0
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bin/package.json +1 -1
- package/declaracoes/ajuda.d.ts +2 -0
- package/declaracoes/ajuda.d.ts.map +1 -1
- package/declaracoes/ajuda.js +3 -0
- package/declaracoes/ajuda.js.map +1 -1
- package/formatadores/formatador-pitugues.d.ts +1 -0
- package/formatadores/formatador-pitugues.d.ts.map +1 -1
- package/formatadores/formatador-pitugues.js +3 -1
- package/formatadores/formatador-pitugues.js.map +1 -1
- package/interpretador/comum.d.ts +1 -0
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +21 -0
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +1 -2
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +0 -38
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/interpretador.d.ts +4 -2
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +39 -15
- package/interpretador/interpretador.js.map +1 -1
- package/package.json +1 -1
- package/tradutores/index.d.ts +1 -0
- package/tradutores/index.d.ts.map +1 -1
- package/tradutores/index.js +1 -0
- package/tradutores/index.js.map +1 -1
- package/tradutores/mermaid/index.d.ts +1 -1
- package/tradutores/mermaid/index.js +1 -1
- package/tradutores/mermaid/subgrafo-classe.d.ts +7 -5
- package/tradutores/mermaid/subgrafo-classe.d.ts.map +1 -1
- package/tradutores/mermaid/subgrafo-classe.js +18 -18
- package/tradutores/mermaid/subgrafo-classe.js.map +1 -1
- package/tradutores/mermaid/subgrafo-metodo.d.ts +13 -0
- package/tradutores/mermaid/subgrafo-metodo.d.ts.map +1 -0
- package/tradutores/mermaid/subgrafo-metodo.js +16 -0
- package/tradutores/mermaid/subgrafo-metodo.js.map +1 -0
- package/tradutores/tradutor-mermaidjs.d.ts +15 -6
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +145 -52
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +11 -0
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +32 -2
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-javascript.js +0 -2
- package/tradutores/tradutor-reverso-javascript.js.map +1 -1
- package/tradutores/tradutor-ruby.d.ts +101 -0
- package/tradutores/tradutor-ruby.d.ts.map +1 -0
- package/tradutores/tradutor-ruby.js +687 -0
- package/tradutores/tradutor-ruby.js.map +1 -0
- package/umd/delegua.js +1369 -368
- package/tradutores/mermaid/diagrama-classe.d.ts +0 -16
- package/tradutores/mermaid/diagrama-classe.d.ts.map +0 -1
- package/tradutores/mermaid/diagrama-classe.js +0 -33
- package/tradutores/mermaid/diagrama-classe.js.map +0 -1
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TradutorRuby = void 0;
|
|
7
|
+
const construtos_1 = require("../construtos");
|
|
8
|
+
const declaracoes_1 = require("../declaracoes");
|
|
9
|
+
const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
10
|
+
class TradutorRuby {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.indentacao = 0;
|
|
13
|
+
this.classesConhecidas = [];
|
|
14
|
+
this.dicionarioConstrutos = {
|
|
15
|
+
AcessoMetodo: this.traduzirConstrutoAcessoMetodo.bind(this),
|
|
16
|
+
AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodoOuPropriedade.bind(this),
|
|
17
|
+
AcessoPropriedade: this.traduzirConstrutoAcessoPropriedade.bind(this),
|
|
18
|
+
AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
|
|
19
|
+
Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
|
|
20
|
+
ArgumentoReferenciaFuncao: this.traduzirConstrutoArgumentoReferenciaFuncao.bind(this),
|
|
21
|
+
AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
|
|
22
|
+
Atribuir: this.traduzirConstrutoAtribuir.bind(this),
|
|
23
|
+
Binario: this.traduzirConstrutoBinario.bind(this),
|
|
24
|
+
Chamada: this.traduzirConstrutoChamada.bind(this),
|
|
25
|
+
ComentarioComoConstruto: this.traduzirConstrutoComentario.bind(this),
|
|
26
|
+
DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
|
|
27
|
+
Dicionario: this.traduzirConstrutoDicionario.bind(this),
|
|
28
|
+
FuncaoConstruto: this.traduzirFuncaoAnonimaParaLambda.bind(this),
|
|
29
|
+
Literal: this.traduzirConstrutoLiteral.bind(this),
|
|
30
|
+
Logico: this.traduzirConstrutoLogico.bind(this),
|
|
31
|
+
ReferenciaFuncao: this.traduzirConstrutoReferenciaFuncao.bind(this),
|
|
32
|
+
Separador: this.traduzirConstrutoSeparador.bind(this),
|
|
33
|
+
SeTernario: this.traduzirConstrutoSeTernario.bind(this),
|
|
34
|
+
Unario: this.traduzirConstrutoUnario.bind(this),
|
|
35
|
+
Variavel: this.traduzirConstrutoVariavel.bind(this),
|
|
36
|
+
Vetor: this.traduzirConstrutoVetor.bind(this),
|
|
37
|
+
};
|
|
38
|
+
this.dicionarioDeclaracoes = {
|
|
39
|
+
Bloco: this.traduzirDeclaracaoBloco.bind(this),
|
|
40
|
+
Classe: this.traduzirDeclaracaoClasse.bind(this),
|
|
41
|
+
Comentario: this.traduzirConstrutoComentario.bind(this),
|
|
42
|
+
Const: this.traduzirDeclaracaoConst.bind(this),
|
|
43
|
+
Continua: () => 'next',
|
|
44
|
+
Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
|
|
45
|
+
Escreva: this.traduzirDeclaracaoEscreva.bind(this),
|
|
46
|
+
Expressao: this.traduzirDeclaracaoExpressao.bind(this),
|
|
47
|
+
FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
|
|
48
|
+
Leia: this.traduzirDeclaracaoLeia.bind(this),
|
|
49
|
+
Para: this.traduzirDeclaracaoPara.bind(this),
|
|
50
|
+
ParaCada: this.traduzirDeclaracaoParaCada.bind(this),
|
|
51
|
+
Retorna: this.traduzirDeclaracaoRetorna.bind(this),
|
|
52
|
+
Se: this.traduzirDeclaracaoSe.bind(this),
|
|
53
|
+
Sustar: () => 'break',
|
|
54
|
+
Tente: this.traduzirDeclaracaoTente.bind(this),
|
|
55
|
+
Var: this.traduzirDeclaracaoVar.bind(this),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
traduzirSimboloOperador(operador) {
|
|
59
|
+
switch (operador.tipo) {
|
|
60
|
+
case delegua_1.default.ADICAO:
|
|
61
|
+
return '+';
|
|
62
|
+
case delegua_1.default.BIT_AND:
|
|
63
|
+
return '&';
|
|
64
|
+
case delegua_1.default.BIT_OR:
|
|
65
|
+
return '|';
|
|
66
|
+
case delegua_1.default.BIT_XOR:
|
|
67
|
+
return '^';
|
|
68
|
+
case delegua_1.default.BIT_NOT:
|
|
69
|
+
return '~';
|
|
70
|
+
case delegua_1.default.DIFERENTE:
|
|
71
|
+
return '!=';
|
|
72
|
+
case delegua_1.default.DIVISAO:
|
|
73
|
+
return '/';
|
|
74
|
+
case delegua_1.default.E:
|
|
75
|
+
return '&&';
|
|
76
|
+
case delegua_1.default.EXPONENCIACAO:
|
|
77
|
+
return '**';
|
|
78
|
+
case delegua_1.default.IGUAL:
|
|
79
|
+
return '=';
|
|
80
|
+
case delegua_1.default.IGUAL_IGUAL:
|
|
81
|
+
return '==';
|
|
82
|
+
case delegua_1.default.MAIOR:
|
|
83
|
+
return '>';
|
|
84
|
+
case delegua_1.default.MAIOR_IGUAL:
|
|
85
|
+
return '>=';
|
|
86
|
+
case delegua_1.default.MENOR:
|
|
87
|
+
return '<';
|
|
88
|
+
case delegua_1.default.MENOR_IGUAL:
|
|
89
|
+
return '<=';
|
|
90
|
+
case delegua_1.default.MODULO:
|
|
91
|
+
return '%';
|
|
92
|
+
case delegua_1.default.MULTIPLICACAO:
|
|
93
|
+
return '*';
|
|
94
|
+
case delegua_1.default.OU:
|
|
95
|
+
return '||';
|
|
96
|
+
case delegua_1.default.SUBTRACAO:
|
|
97
|
+
return '-';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
traduzirFuncaoOuMetodo(nomeMetodo, objetoResolvido, argumentos) {
|
|
101
|
+
const argumentosResolvidos = [];
|
|
102
|
+
for (const argumento of argumentos) {
|
|
103
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
104
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
105
|
+
}
|
|
106
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
107
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
108
|
+
switch (nomeMetodo) {
|
|
109
|
+
case 'adicionar':
|
|
110
|
+
case 'empilhar':
|
|
111
|
+
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
112
|
+
case 'fatiar':
|
|
113
|
+
return `${objetoResolvido}[${argumentos[0]}..${argumentos[1]}]`;
|
|
114
|
+
case 'inclui':
|
|
115
|
+
return `${objetoResolvido}.include?(${argumentosResolvidos[0]})`;
|
|
116
|
+
case 'inverter':
|
|
117
|
+
return `${objetoResolvido}.reverse`;
|
|
118
|
+
case 'juntar':
|
|
119
|
+
return `${objetoResolvido}.join(${argumentosResolvidos[0]})`;
|
|
120
|
+
case 'maiusculo':
|
|
121
|
+
return `${objetoResolvido}.upcase`;
|
|
122
|
+
case 'mapear':
|
|
123
|
+
return `${objetoResolvido}.map(&${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
124
|
+
case 'minusculo':
|
|
125
|
+
return `${objetoResolvido}.downcase`;
|
|
126
|
+
case 'ordenar':
|
|
127
|
+
return `${objetoResolvido}.sort!`;
|
|
128
|
+
case 'remover':
|
|
129
|
+
return `${objetoResolvido}.delete_at(${argumentosResolvidos[0]})`;
|
|
130
|
+
case 'removerPrimeiro':
|
|
131
|
+
return `${objetoResolvido}.shift`;
|
|
132
|
+
case 'removerUltimo':
|
|
133
|
+
return `${objetoResolvido}.pop`;
|
|
134
|
+
case 'somar':
|
|
135
|
+
return `${objetoResolvido}.sum`;
|
|
136
|
+
case 'tamanho':
|
|
137
|
+
return `${objetoResolvido}.length`;
|
|
138
|
+
}
|
|
139
|
+
return `${objetoResolvido}.${nomeMetodo}(${textoArgumentos})`;
|
|
140
|
+
}
|
|
141
|
+
logicaComumBlocoEscopo(declaracoes) {
|
|
142
|
+
let resultado = '';
|
|
143
|
+
this.indentacao += 4;
|
|
144
|
+
if (typeof declaracoes[Symbol.iterator] === 'function') {
|
|
145
|
+
for (const declaracaoOuConstruto of declaracoes) {
|
|
146
|
+
resultado += ' '.repeat(this.indentacao);
|
|
147
|
+
const nomeConstrutor = declaracaoOuConstruto.constructor.name;
|
|
148
|
+
if (this.dicionarioConstrutos.hasOwnProperty(nomeConstrutor)) {
|
|
149
|
+
resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoOuConstruto);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
resultado += this.dicionarioDeclaracoes[nomeConstrutor](declaracaoOuConstruto);
|
|
153
|
+
}
|
|
154
|
+
resultado += '\n';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this.indentacao -= 4;
|
|
158
|
+
return resultado;
|
|
159
|
+
}
|
|
160
|
+
traduzirConstrutoAcessoIndiceVariavel(acessoIndiceVariavel) {
|
|
161
|
+
const entidade = this.dicionarioConstrutos[acessoIndiceVariavel.entidadeChamada.constructor.name](acessoIndiceVariavel.entidadeChamada);
|
|
162
|
+
const indice = this.dicionarioConstrutos[acessoIndiceVariavel.indice.constructor.name](acessoIndiceVariavel.indice);
|
|
163
|
+
return `${entidade}[${indice}]`;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Traduz uma função anônima de Delégua para um lambda do Ruby.
|
|
167
|
+
* Em Delégua: funcao(x) { retorna x * 2 }
|
|
168
|
+
* Em Ruby: lambda { |x| x * 2 }
|
|
169
|
+
*
|
|
170
|
+
* @param argumento O construto da função anônima
|
|
171
|
+
* @returns String com o lambda do Ruby
|
|
172
|
+
*/
|
|
173
|
+
traduzirFuncaoAnonimaParaLambda(argumento) {
|
|
174
|
+
if (!(argumento instanceof construtos_1.FuncaoConstruto)) {
|
|
175
|
+
return '';
|
|
176
|
+
}
|
|
177
|
+
const funcao = argumento;
|
|
178
|
+
// Extrai os nomes dos parâmetros
|
|
179
|
+
const parametros = funcao.parametros.map(param => param.nome.lexema).join(', ');
|
|
180
|
+
// Assumimos que a função tem um corpo simples com uma declaração de retorno
|
|
181
|
+
let expressao = '';
|
|
182
|
+
if (funcao.corpo.length > 0) {
|
|
183
|
+
const primeiraDeclaracao = funcao.corpo[0];
|
|
184
|
+
// Se for uma declaração de retorno, extraímos a expressão
|
|
185
|
+
if (primeiraDeclaracao.constructor.name === 'Retorna') {
|
|
186
|
+
const retorna = primeiraDeclaracao;
|
|
187
|
+
if (retorna.valor) {
|
|
188
|
+
expressao = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Retorna o lambda formatado
|
|
193
|
+
const parametrosFormatados = parametros ? `|${parametros}| ` : '';
|
|
194
|
+
return `lambda { ${parametrosFormatados}${expressao} }`;
|
|
195
|
+
}
|
|
196
|
+
traduzirAcessoMetodoVetor(objeto, nomeMetodo, argumentos) {
|
|
197
|
+
const objetoResolvido = this.dicionarioConstrutos[objeto.constructor.name](objeto);
|
|
198
|
+
const argumentosResolvidos = [];
|
|
199
|
+
for (const argumento of argumentos) {
|
|
200
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
201
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
202
|
+
}
|
|
203
|
+
switch (nomeMetodo) {
|
|
204
|
+
case 'adicionar':
|
|
205
|
+
case 'empilhar':
|
|
206
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
207
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
208
|
+
return `${objetoResolvido}.push(${textoArgumentos})`;
|
|
209
|
+
case 'fatiar':
|
|
210
|
+
return `${objetoResolvido}[${argumentos[0]}..${argumentos[1]}]`;
|
|
211
|
+
case 'inclui':
|
|
212
|
+
return `${objetoResolvido}.include?(${argumentos[0]})`;
|
|
213
|
+
case 'inverter':
|
|
214
|
+
return `${objetoResolvido}.reverse`;
|
|
215
|
+
case 'juntar':
|
|
216
|
+
return `${objetoResolvido}.join(${argumentos[0]})`;
|
|
217
|
+
case 'mapear':
|
|
218
|
+
return `${objetoResolvido}.map(&${this.traduzirFuncaoAnonimaParaLambda(argumentos[0])})`;
|
|
219
|
+
case 'ordenar':
|
|
220
|
+
return `${objetoResolvido}.sort!`;
|
|
221
|
+
case 'remover':
|
|
222
|
+
return `${objetoResolvido}.delete_at(${argumentos[0]})`;
|
|
223
|
+
case 'removerPrimeiro':
|
|
224
|
+
return `${objetoResolvido}.shift`;
|
|
225
|
+
case 'removerUltimo':
|
|
226
|
+
return `${objetoResolvido}.pop`;
|
|
227
|
+
case 'somar':
|
|
228
|
+
return `${objetoResolvido}.sum`;
|
|
229
|
+
case 'tamanho':
|
|
230
|
+
return `${objetoResolvido}.length`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
traduzirConstrutoAcessoMetodo(acessoMetodo, argumentos) {
|
|
234
|
+
switch (acessoMetodo.objeto.constructor.name) {
|
|
235
|
+
case 'Isto':
|
|
236
|
+
return `self.${acessoMetodo.nomeMetodo}`;
|
|
237
|
+
case 'Variavel':
|
|
238
|
+
let objetoVariavel = acessoMetodo.objeto;
|
|
239
|
+
return this.traduzirFuncaoOuMetodo(acessoMetodo.nomeMetodo, objetoVariavel.simbolo.lexema, argumentos);
|
|
240
|
+
case 'Vetor':
|
|
241
|
+
return this.traduzirAcessoMetodoVetor(acessoMetodo.objeto, acessoMetodo.nomeMetodo, argumentos);
|
|
242
|
+
default:
|
|
243
|
+
const objetoResolvido = this.dicionarioConstrutos[acessoMetodo.objeto.constructor.name](acessoMetodo.objeto);
|
|
244
|
+
return `${objetoResolvido}.${acessoMetodo.nomeMetodo}`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo, argumentos) {
|
|
248
|
+
if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
|
|
249
|
+
let objetoVariavel = acessoMetodo.objeto;
|
|
250
|
+
return this.traduzirFuncaoOuMetodo(acessoMetodo.simbolo.lexema, objetoVariavel.simbolo.lexema, argumentos);
|
|
251
|
+
}
|
|
252
|
+
return `@${acessoMetodo.simbolo.lexema}`;
|
|
253
|
+
}
|
|
254
|
+
traduzirConstrutoAcessoPropriedade(acessoPropriedade, argumentos) {
|
|
255
|
+
if (acessoPropriedade.objeto instanceof construtos_1.Variavel) {
|
|
256
|
+
let objetoVariavel = acessoPropriedade.objeto;
|
|
257
|
+
return this.traduzirFuncaoOuMetodo(objetoVariavel.simbolo.lexema, acessoPropriedade.nomePropriedade, argumentos);
|
|
258
|
+
}
|
|
259
|
+
return `@${acessoPropriedade.nomePropriedade}`;
|
|
260
|
+
}
|
|
261
|
+
traduzirConstrutoAgrupamento(agrupamento) {
|
|
262
|
+
return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
|
|
263
|
+
}
|
|
264
|
+
traduzirConstrutoArgumentoReferenciaFuncao(argumentoReferenciaFuncao, argumentos) {
|
|
265
|
+
const argumentosResolvidos = [];
|
|
266
|
+
const argumentosValidados = argumentos || [];
|
|
267
|
+
for (const argumento of argumentosValidados) {
|
|
268
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
269
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
270
|
+
}
|
|
271
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
272
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
273
|
+
return `${argumentoReferenciaFuncao.simboloFuncao.lexema}(${textoArgumentos})`;
|
|
274
|
+
}
|
|
275
|
+
traduzirConstrutoAtribuicaoPorIndice(atribuicaoPorIndice) {
|
|
276
|
+
const objeto = this.dicionarioConstrutos[atribuicaoPorIndice.objeto.constructor.name](atribuicaoPorIndice.objeto);
|
|
277
|
+
const indice = this.dicionarioConstrutos[atribuicaoPorIndice.indice.constructor.name](atribuicaoPorIndice.indice);
|
|
278
|
+
const valor = this.dicionarioConstrutos[atribuicaoPorIndice.valor.constructor.name](atribuicaoPorIndice.valor);
|
|
279
|
+
return `${objeto}[${indice}] = ${valor}`;
|
|
280
|
+
}
|
|
281
|
+
traduzirConstrutoAtribuir(atribuir) {
|
|
282
|
+
var _a;
|
|
283
|
+
let resultado = this.dicionarioConstrutos[atribuir.alvo.constructor.name](atribuir.alvo);
|
|
284
|
+
const operador = ((_a = atribuir.simboloOperador) === null || _a === void 0 ? void 0 : _a.lexema) || '=';
|
|
285
|
+
// Em Delégua, atribuições com operações embutidas devolvem um construto `Binario` no valor
|
|
286
|
+
// por várias razões, sendo a mais importante delas a lógica de interpretação.
|
|
287
|
+
let valorResolvido = '';
|
|
288
|
+
if (atribuir.simboloOperador && atribuir.valor.constructor === construtos_1.Binario) {
|
|
289
|
+
valorResolvido = this.dicionarioConstrutos[atribuir.valor.direita.constructor.name](atribuir.valor.direita);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
valorResolvido = this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
|
|
293
|
+
}
|
|
294
|
+
resultado += ` ${operador} ` + valorResolvido;
|
|
295
|
+
return resultado;
|
|
296
|
+
}
|
|
297
|
+
traduzirConstrutoBinario(binario) {
|
|
298
|
+
let resultado = '';
|
|
299
|
+
const valorEsquerdo = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
|
|
300
|
+
if (binario.esquerda.constructor.name === 'Agrupamento')
|
|
301
|
+
resultado += '(' + valorEsquerdo + ')';
|
|
302
|
+
else
|
|
303
|
+
resultado += valorEsquerdo;
|
|
304
|
+
let operador = this.traduzirSimboloOperador(binario.operador);
|
|
305
|
+
resultado += ` ${operador} `;
|
|
306
|
+
const valorDireito = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
|
|
307
|
+
if (binario.direita.constructor.name === 'Agrupamento')
|
|
308
|
+
resultado += '(' + valorDireito + ')';
|
|
309
|
+
else
|
|
310
|
+
resultado += valorDireito;
|
|
311
|
+
return resultado;
|
|
312
|
+
}
|
|
313
|
+
traduzirConstrutoChamada(chamada) {
|
|
314
|
+
return `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada, chamada.argumentos)}`;
|
|
315
|
+
}
|
|
316
|
+
traduzirConstrutoComentario(comentario) {
|
|
317
|
+
let resultado = '';
|
|
318
|
+
if (comentario.multilinha) {
|
|
319
|
+
resultado += `=begin\n`;
|
|
320
|
+
for (let linhaComentario of comentario.conteudo) {
|
|
321
|
+
resultado += `${linhaComentario}\n`;
|
|
322
|
+
}
|
|
323
|
+
resultado += `=end`;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
resultado += `# ${comentario.conteudo}`;
|
|
327
|
+
}
|
|
328
|
+
return resultado;
|
|
329
|
+
}
|
|
330
|
+
traduzirConstrutoDefinirValor(definirValor) {
|
|
331
|
+
let resultado = '';
|
|
332
|
+
if (definirValor.objeto instanceof construtos_1.Isto) {
|
|
333
|
+
resultado = '@' + definirValor.nome.lexema + ' = ';
|
|
334
|
+
}
|
|
335
|
+
resultado += definirValor.valor.simbolo.lexema;
|
|
336
|
+
return resultado;
|
|
337
|
+
}
|
|
338
|
+
traduzirConstrutoDicionario(dicionario) {
|
|
339
|
+
let resultado = `{${dicionario.chaves.length > 0 ? '\n' : ''}`;
|
|
340
|
+
for (let indice = 0; indice < dicionario.chaves.length; indice++) {
|
|
341
|
+
resultado += ' '.repeat(this.indentacao + 4);
|
|
342
|
+
if (dicionario.esSpread && dicionario.esSpread[indice]) {
|
|
343
|
+
resultado += '**';
|
|
344
|
+
const valor = dicionario.valores[indice];
|
|
345
|
+
resultado += `${this.dicionarioConstrutos[valor.constructor.name](valor)},\n`;
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
const chave = dicionario.chaves[indice];
|
|
349
|
+
resultado += `${this.dicionarioConstrutos[chave.constructor.name](chave)} => `;
|
|
350
|
+
const valor = dicionario.valores[indice];
|
|
351
|
+
resultado += `${this.dicionarioConstrutos[valor.constructor.name](valor)},\n`;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
resultado += '}';
|
|
355
|
+
return resultado;
|
|
356
|
+
}
|
|
357
|
+
traduzirConstrutoLiteral(literal) {
|
|
358
|
+
if (typeof literal.valor === 'string')
|
|
359
|
+
return `'${literal.valor}'`;
|
|
360
|
+
if (typeof literal.valor === 'boolean') {
|
|
361
|
+
return literal.valor ? 'true' : 'false';
|
|
362
|
+
}
|
|
363
|
+
if (typeof literal.valor === 'number') {
|
|
364
|
+
return String(literal.valor);
|
|
365
|
+
}
|
|
366
|
+
if (!literal.valor)
|
|
367
|
+
return 'nil';
|
|
368
|
+
return String(literal.valor);
|
|
369
|
+
}
|
|
370
|
+
traduzirConstrutoLogico(logico) {
|
|
371
|
+
const direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
|
|
372
|
+
const operador = this.traduzirSimboloOperador(logico.operador);
|
|
373
|
+
const esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
|
|
374
|
+
return `${esquerda} ${operador} ${direita}`;
|
|
375
|
+
}
|
|
376
|
+
traduzirConstrutoReferenciaFuncao(referenciaFuncao, argumentos) {
|
|
377
|
+
const argumentosResolvidos = [];
|
|
378
|
+
const argumentosValidados = argumentos || [];
|
|
379
|
+
for (const argumento of argumentosValidados) {
|
|
380
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
381
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
382
|
+
}
|
|
383
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
384
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
385
|
+
return `${referenciaFuncao.simboloFuncao.lexema}(${textoArgumentos})`;
|
|
386
|
+
}
|
|
387
|
+
traduzirConstrutoSeparador(separador) {
|
|
388
|
+
return `${separador.conteudo} `;
|
|
389
|
+
}
|
|
390
|
+
traduzirConstrutoSeTernario(seTernario) {
|
|
391
|
+
const condicao = this.dicionarioConstrutos[seTernario.condicao.constructor.name](seTernario.condicao);
|
|
392
|
+
const expressaoSe = this.dicionarioConstrutos[seTernario.expressaoSe.constructor.name](seTernario.expressaoSe);
|
|
393
|
+
const expressaoSenao = this.dicionarioConstrutos[seTernario.expressaoSenao.constructor.name](seTernario.expressaoSenao);
|
|
394
|
+
return `${condicao} ? ${expressaoSe} : ${expressaoSenao}`;
|
|
395
|
+
}
|
|
396
|
+
traduzirConstrutoUnario(unario) {
|
|
397
|
+
const operador = this.traduzirSimboloOperador(unario.operador);
|
|
398
|
+
const operando = this.dicionarioConstrutos[unario.operando.constructor.name](unario.operando);
|
|
399
|
+
switch (unario.incidenciaOperador) {
|
|
400
|
+
case 'ANTES':
|
|
401
|
+
return `${operador}${operando}`;
|
|
402
|
+
case 'DEPOIS':
|
|
403
|
+
return `${operando}${operador}`;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
traduzirConstrutoVariavel(variavel, argumentos) {
|
|
407
|
+
const argumentosResolvidos = [];
|
|
408
|
+
const argumentosValidados = argumentos || [];
|
|
409
|
+
for (const argumento of argumentosValidados) {
|
|
410
|
+
const argumentoResolvido = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
411
|
+
argumentosResolvidos.push(argumentoResolvido);
|
|
412
|
+
}
|
|
413
|
+
let textoArgumentos = argumentosResolvidos.reduce((atual, proximo) => (atual += proximo + ', '), '');
|
|
414
|
+
textoArgumentos = textoArgumentos.slice(0, -2);
|
|
415
|
+
switch (variavel.simbolo.lexema) {
|
|
416
|
+
case 'texto':
|
|
417
|
+
return `(${textoArgumentos}).to_s`;
|
|
418
|
+
default:
|
|
419
|
+
if (argumentosValidados.length === 0 &&
|
|
420
|
+
!this.classesConhecidas.includes(variavel.simbolo.lexema)) {
|
|
421
|
+
return `${variavel.simbolo.lexema}`;
|
|
422
|
+
}
|
|
423
|
+
return `${variavel.simbolo.lexema}(${textoArgumentos})`;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
traduzirConstrutoVetor(vetor) {
|
|
427
|
+
if (!vetor.valores.length) {
|
|
428
|
+
return '[]';
|
|
429
|
+
}
|
|
430
|
+
let resultado = '[';
|
|
431
|
+
for (let valor of vetor.valores) {
|
|
432
|
+
resultado += `${this.dicionarioConstrutos[valor.constructor.name](valor)}`;
|
|
433
|
+
}
|
|
434
|
+
resultado += ']';
|
|
435
|
+
return resultado;
|
|
436
|
+
}
|
|
437
|
+
logicaTraducaoMetodoClasse(metodoClasse) {
|
|
438
|
+
this.indentacao += 4;
|
|
439
|
+
let resultado = ' '.repeat(this.indentacao);
|
|
440
|
+
let temContrutor = metodoClasse.simbolo.lexema === 'construtor';
|
|
441
|
+
resultado += temContrutor ? 'def initialize(' : 'def ' + metodoClasse.simbolo.lexema + '(';
|
|
442
|
+
for (let parametro of metodoClasse.funcao.parametros) {
|
|
443
|
+
resultado += parametro.nome.lexema + ', ';
|
|
444
|
+
}
|
|
445
|
+
if (metodoClasse.funcao.parametros.length > 0) {
|
|
446
|
+
resultado = resultado.slice(0, -2);
|
|
447
|
+
}
|
|
448
|
+
resultado += ')\n';
|
|
449
|
+
if (metodoClasse.funcao.corpo.length === 0) {
|
|
450
|
+
this.indentacao -= 4;
|
|
451
|
+
resultado += ' '.repeat(this.indentacao + 4) + 'end\n';
|
|
452
|
+
return resultado;
|
|
453
|
+
}
|
|
454
|
+
resultado += this.logicaComumBlocoEscopo(metodoClasse.funcao.corpo);
|
|
455
|
+
resultado += ' '.repeat(this.indentacao + 4) + 'end\n';
|
|
456
|
+
this.indentacao -= 4;
|
|
457
|
+
return resultado;
|
|
458
|
+
}
|
|
459
|
+
traduzirDeclaracaoBloco(declaracaoBloco) {
|
|
460
|
+
return this.logicaComumBlocoEscopo(declaracaoBloco.declaracoes);
|
|
461
|
+
}
|
|
462
|
+
traduzirDeclaracaoClasse(declaracaoClasse) {
|
|
463
|
+
let resultado = 'class ';
|
|
464
|
+
if (declaracaoClasse.superClasse)
|
|
465
|
+
resultado += `${declaracaoClasse.simbolo.lexema} < ${declaracaoClasse.superClasse.simbolo.lexema}\n`;
|
|
466
|
+
else
|
|
467
|
+
resultado += declaracaoClasse.simbolo.lexema + '\n';
|
|
468
|
+
if (declaracaoClasse.metodos.length === 0) {
|
|
469
|
+
this.classesConhecidas.push(declaracaoClasse.simbolo.lexema);
|
|
470
|
+
return (resultado += 'end\n');
|
|
471
|
+
}
|
|
472
|
+
for (let metodo of declaracaoClasse.metodos) {
|
|
473
|
+
resultado += this.logicaTraducaoMetodoClasse(metodo);
|
|
474
|
+
}
|
|
475
|
+
resultado += 'end\n';
|
|
476
|
+
this.classesConhecidas.push(declaracaoClasse.simbolo.lexema);
|
|
477
|
+
return resultado;
|
|
478
|
+
}
|
|
479
|
+
traduzirDeclaracaoConst(declaracaoConst) {
|
|
480
|
+
let resultado = declaracaoConst.simbolo.lexema.toUpperCase() + ' = ';
|
|
481
|
+
const inicializador = declaracaoConst.inicializador;
|
|
482
|
+
if (inicializador) {
|
|
483
|
+
if (this.dicionarioConstrutos[inicializador.constructor.name]) {
|
|
484
|
+
resultado += this.dicionarioConstrutos[declaracaoConst.inicializador.constructor.name](declaracaoConst.inicializador);
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
resultado += this.dicionarioDeclaracoes[declaracaoConst.inicializador.constructor.name](declaracaoConst.inicializador);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
resultado += 'nil';
|
|
492
|
+
}
|
|
493
|
+
return resultado;
|
|
494
|
+
}
|
|
495
|
+
traduzirDeclaracaoEnquanto(declaracaoEnquanto) {
|
|
496
|
+
let resultado = ' '.repeat(this.indentacao) + 'while ';
|
|
497
|
+
const condicao = this.dicionarioConstrutos[declaracaoEnquanto.condicao.constructor.name](declaracaoEnquanto.condicao);
|
|
498
|
+
resultado += condicao + '\n';
|
|
499
|
+
resultado += this.dicionarioDeclaracoes[declaracaoEnquanto.corpo.constructor.name](declaracaoEnquanto.corpo);
|
|
500
|
+
resultado += ' '.repeat(this.indentacao) + 'end\n';
|
|
501
|
+
return resultado;
|
|
502
|
+
}
|
|
503
|
+
traduzirDeclaracaoEscreva(declaracaoEscreva) {
|
|
504
|
+
let resultado = 'puts(';
|
|
505
|
+
for (const argumento of declaracaoEscreva.argumentos) {
|
|
506
|
+
const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
507
|
+
resultado += valor + ', ';
|
|
508
|
+
}
|
|
509
|
+
resultado = resultado.slice(0, -2);
|
|
510
|
+
resultado += ')';
|
|
511
|
+
return resultado;
|
|
512
|
+
}
|
|
513
|
+
traduzirDeclaracaoExpressao(declaracaoExpressao) {
|
|
514
|
+
return this.dicionarioConstrutos[declaracaoExpressao.expressao.constructor.name](declaracaoExpressao.expressao);
|
|
515
|
+
}
|
|
516
|
+
traduzirDeclaracaoFuncao(declaracaoFuncao) {
|
|
517
|
+
let resultado = 'def ';
|
|
518
|
+
resultado += declaracaoFuncao.simbolo.lexema + '(';
|
|
519
|
+
for (const parametro of declaracaoFuncao.funcao.parametros) {
|
|
520
|
+
resultado += parametro.nome.lexema + ', ';
|
|
521
|
+
}
|
|
522
|
+
if (declaracaoFuncao.funcao.parametros.length > 0) {
|
|
523
|
+
resultado = resultado.slice(0, -2);
|
|
524
|
+
}
|
|
525
|
+
resultado += ')\n';
|
|
526
|
+
resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
|
|
527
|
+
resultado += 'end\n';
|
|
528
|
+
return resultado;
|
|
529
|
+
}
|
|
530
|
+
traduzirDeclaracaoLeia(declaracaoLeia) {
|
|
531
|
+
let resultado = 'gets';
|
|
532
|
+
if (declaracaoLeia.argumentos.length > 0) {
|
|
533
|
+
resultado = 'print(';
|
|
534
|
+
for (const argumento of declaracaoLeia.argumentos) {
|
|
535
|
+
const valor = this.dicionarioConstrutos[argumento.constructor.name](argumento);
|
|
536
|
+
resultado += valor + ', ';
|
|
537
|
+
}
|
|
538
|
+
resultado = resultado.slice(0, -2);
|
|
539
|
+
resultado += '); gets.chomp';
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
resultado += '.chomp';
|
|
543
|
+
}
|
|
544
|
+
return resultado;
|
|
545
|
+
}
|
|
546
|
+
traduzirDeclaracaoPara(declaracaoPara) {
|
|
547
|
+
let resultado = '';
|
|
548
|
+
// Em uma declaração `Para` em Delégua, são obrigatórios a condição e o incremento.
|
|
549
|
+
if (declaracaoPara.inicializador) {
|
|
550
|
+
if (Array.isArray(declaracaoPara.inicializador)) {
|
|
551
|
+
for (const declaracaoInicializador of declaracaoPara.inicializador) {
|
|
552
|
+
resultado +=
|
|
553
|
+
this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
resultado +=
|
|
558
|
+
this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + `\n`;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
const condicao = this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao);
|
|
562
|
+
resultado += ' '.repeat(this.indentacao) + `while ${condicao}\n`;
|
|
563
|
+
// O incremento passa a ser a última instrução do bloco.
|
|
564
|
+
declaracaoPara.corpo.declaracoes.push(new declaracoes_1.Expressao(declaracaoPara.incrementar));
|
|
565
|
+
resultado += this.dicionarioDeclaracoes[declaracaoPara.corpo.constructor.name](declaracaoPara.corpo);
|
|
566
|
+
resultado += ' '.repeat(this.indentacao) + 'end\n';
|
|
567
|
+
return resultado;
|
|
568
|
+
}
|
|
569
|
+
traduzirDeclaracaoParaCada(declaracaoParaCada) {
|
|
570
|
+
const variavelIteracao = this.dicionarioConstrutos[declaracaoParaCada.variavelIteracao.constructor.name](declaracaoParaCada.variavelIteracao);
|
|
571
|
+
const vetorOuDicionario = this.dicionarioConstrutos[declaracaoParaCada.vetorOuDicionario.constructor.name](declaracaoParaCada.vetorOuDicionario);
|
|
572
|
+
let resultado = `${vetorOuDicionario}.each do |${variavelIteracao}|\n`;
|
|
573
|
+
resultado += this.dicionarioDeclaracoes[declaracaoParaCada.corpo.constructor.name](declaracaoParaCada.corpo);
|
|
574
|
+
resultado += ' '.repeat(this.indentacao) + 'end\n';
|
|
575
|
+
return resultado;
|
|
576
|
+
}
|
|
577
|
+
traduzirDeclaracaoRetorna(declaracaoRetorna) {
|
|
578
|
+
let resultado = 'return ';
|
|
579
|
+
const nomeConstrutor = declaracaoRetorna.valor.constructor.name;
|
|
580
|
+
return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
|
|
581
|
+
}
|
|
582
|
+
traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
|
|
583
|
+
let resultado = '';
|
|
584
|
+
if (iniciarComIf) {
|
|
585
|
+
resultado += 'if ';
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
resultado += 'elsif ';
|
|
589
|
+
}
|
|
590
|
+
const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
|
|
591
|
+
resultado += condicao;
|
|
592
|
+
resultado += '\n';
|
|
593
|
+
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
|
|
594
|
+
if (declaracaoSe.caminhoSenao) {
|
|
595
|
+
resultado += ' '.repeat(this.indentacao);
|
|
596
|
+
const senao = declaracaoSe.caminhoSenao;
|
|
597
|
+
if (senao === null || senao === void 0 ? void 0 : senao.caminhoEntao) {
|
|
598
|
+
resultado += 'elsif ';
|
|
599
|
+
resultado += this.dicionarioConstrutos[senao.condicao.constructor.name](senao.condicao, false);
|
|
600
|
+
resultado += '\n';
|
|
601
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoEntao.constructor.name](senao.caminhoEntao);
|
|
602
|
+
resultado += ' '.repeat(this.indentacao);
|
|
603
|
+
if (senao === null || senao === void 0 ? void 0 : senao.caminhoSenao) {
|
|
604
|
+
if (senao.caminhoSenao instanceof declaracoes_1.Bloco) {
|
|
605
|
+
resultado += 'else\n';
|
|
606
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
|
|
607
|
+
resultado += ' '.repeat(this.indentacao) + 'end\n';
|
|
608
|
+
return resultado;
|
|
609
|
+
}
|
|
610
|
+
resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
|
|
611
|
+
return resultado;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
resultado += 'else\n';
|
|
615
|
+
resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
|
|
616
|
+
}
|
|
617
|
+
resultado += ' '.repeat(this.indentacao) + 'end\n';
|
|
618
|
+
return resultado;
|
|
619
|
+
}
|
|
620
|
+
traduzirDeclaracaoTente(declaracaoTente) {
|
|
621
|
+
let resultado = 'begin\n';
|
|
622
|
+
this.indentacao += 4;
|
|
623
|
+
resultado += ' '.repeat(this.indentacao);
|
|
624
|
+
for (let condicao of declaracaoTente.caminhoTente) {
|
|
625
|
+
resultado += this.dicionarioDeclaracoes[condicao.constructor.name](condicao) + '\n';
|
|
626
|
+
resultado += ' '.repeat(this.indentacao);
|
|
627
|
+
}
|
|
628
|
+
if (declaracaoTente.caminhoPegue !== null) {
|
|
629
|
+
resultado += '\nrescue\n';
|
|
630
|
+
resultado += ' '.repeat(this.indentacao);
|
|
631
|
+
if (Array.isArray(declaracaoTente.caminhoPegue)) {
|
|
632
|
+
for (let declaracao of declaracaoTente.caminhoPegue) {
|
|
633
|
+
resultado +=
|
|
634
|
+
this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao) + '\n';
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
for (let corpo of declaracaoTente.caminhoPegue.corpo) {
|
|
639
|
+
resultado += this.dicionarioDeclaracoes[corpo.constructor.name](corpo) + '\n';
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
resultado += ' '.repeat(this.indentacao);
|
|
643
|
+
}
|
|
644
|
+
if (declaracaoTente.caminhoFinalmente !== null) {
|
|
645
|
+
resultado += '\nensure\n';
|
|
646
|
+
resultado += ' '.repeat(this.indentacao);
|
|
647
|
+
for (let finalmente of declaracaoTente.caminhoFinalmente) {
|
|
648
|
+
resultado +=
|
|
649
|
+
this.dicionarioDeclaracoes[finalmente.constructor.name](finalmente) + '\n';
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
this.indentacao -= 4;
|
|
653
|
+
resultado += 'end\n';
|
|
654
|
+
return resultado;
|
|
655
|
+
}
|
|
656
|
+
traduzirDeclaracaoVar(declaracaoVar) {
|
|
657
|
+
let resultado = declaracaoVar.simbolo.lexema + ' = ';
|
|
658
|
+
const inicializador = declaracaoVar.inicializador;
|
|
659
|
+
if (inicializador) {
|
|
660
|
+
if (inicializador.constructor.name in this.dicionarioConstrutos) {
|
|
661
|
+
resultado += this.dicionarioConstrutos[declaracaoVar.inicializador.constructor.name](declaracaoVar.inicializador);
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
resultado += this.dicionarioDeclaracoes[declaracaoVar.inicializador.constructor.name](declaracaoVar.inicializador);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
resultado += 'nil';
|
|
669
|
+
}
|
|
670
|
+
return resultado;
|
|
671
|
+
}
|
|
672
|
+
traduzir(declaracoes) {
|
|
673
|
+
let resultado = '';
|
|
674
|
+
this.classesConhecidas = [];
|
|
675
|
+
try {
|
|
676
|
+
for (const declaracao of declaracoes) {
|
|
677
|
+
resultado += `${this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao)}`;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
catch (erro) {
|
|
681
|
+
console.error(`Erro em tradução para Ruby: ${erro}`);
|
|
682
|
+
}
|
|
683
|
+
return resultado.replace(/\n{2,}/g, '\n');
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
exports.TradutorRuby = TradutorRuby;
|
|
687
|
+
//# sourceMappingURL=tradutor-ruby.js.map
|