@designliquido/delegua 0.37.0 → 0.37.2

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/umd/delegua.js CHANGED
@@ -539,11 +539,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
539
539
  delegua_2.default.DIVISAO_INTEIRA_IGUAL,
540
540
  delegua_2.default.MODULO_IGUAL,
541
541
  ].includes(expressao.operador.tipo)) {
542
- let simbolo = expressao.esquerda.simbolo;
543
542
  if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
544
- simbolo = expressao.esquerda.entidadeChamada.simbolo;
545
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, expressao.esquerda.indice);
543
+ const entidade = expressao.esquerda;
544
+ const simbolo = entidade.entidadeChamada.simbolo;
545
+ return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, entidade.indice);
546
546
  }
547
+ const simbolo = expressao.esquerda.simbolo;
547
548
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
548
549
  }
549
550
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
@@ -553,11 +554,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
553
554
  const simbolo = expressao.simbolo;
554
555
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
555
556
  }
556
- else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
557
+ if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
557
558
  const get = expressao;
558
559
  return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
559
560
  }
560
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
561
+ if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
561
562
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
562
563
  }
563
564
  this.erro(igual, 'Tarefa de atribuição inválida');
@@ -610,10 +611,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
610
611
  return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
611
612
  }
612
613
  declaracaoExpressao() {
614
+ // Se há decoradores a serem adicionados aqui, obtemo-los agora,
615
+ // para evitar que outros passos recursivos peguem-los antes.
616
+ const decoradores = Array.from(this.pilhaDecoradores);
617
+ this.pilhaDecoradores = [];
613
618
  const expressao = this.expressao();
614
619
  // Ponto-e-vírgula é opcional aqui.
615
620
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
616
- const decoradores = Array.from(this.pilhaDecoradores);
617
621
  return new declaracoes_1.Expressao(expressao, decoradores);
618
622
  }
619
623
  declaracaoComentarioMultilinha() {
@@ -4039,7 +4043,7 @@ exports.Atribuir = void 0;
4039
4043
  class Atribuir {
4040
4044
  constructor(hashArquivo, simbolo, valor,
4041
4045
  // indice so é usado para variaveis de vetores
4042
- // TODO: criar alguma validaçao para garantir que indice so seja passado para variaveis de vetores
4046
+ // TODO: criar alguma validaçao para garantir que `indice` seja passado para variáveis de vetores
4043
4047
  indice) {
4044
4048
  this.linha = Number(simbolo.linha);
4045
4049
  this.hashArquivo = hashArquivo;
@@ -24846,14 +24850,15 @@ class TradutorAssemblyScript {
24846
24850
  resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
24847
24851
  return resultado;
24848
24852
  }
24853
+ // TODO: Eliminar o soft cast para `any`.
24849
24854
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
24850
- var _a, _b;
24855
+ var _a;
24851
24856
  let resultado = '';
24852
24857
  resultado += AtribuicaoPorIndice.objeto.simbolo.lexema + '[';
24853
24858
  resultado +=
24854
24859
  this.dicionarioConstrutos[AtribuicaoPorIndice.indice.constructor.name](AtribuicaoPorIndice.indice) + ']';
24855
24860
  resultado += ' = ';
24856
- if ((_b = (_a = AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor) === null || _a === void 0 ? void 0 : _a.simbolo) === null || _b === void 0 ? void 0 : _b.lexema) {
24861
+ if ((_a = (AtribuicaoPorIndice === null || AtribuicaoPorIndice === void 0 ? void 0 : AtribuicaoPorIndice.valor).simbolo) === null || _a === void 0 ? void 0 : _a.lexema) {
24857
24862
  resultado += `${AtribuicaoPorIndice.valor.simbolo.lexema}`;
24858
24863
  }
24859
24864
  else {
@@ -24991,7 +24996,6 @@ class TradutorJavaScript {
24991
24996
  return '-';
24992
24997
  }
24993
24998
  }
24994
- //TODO: @Samuel
24995
24999
  traduzirFuncoesNativas(metodo) {
24996
25000
  switch (metodo.toLowerCase()) {
24997
25001
  case 'adicionar':
@@ -25021,6 +25025,8 @@ class TradutorJavaScript {
25021
25025
  return 'toLowerCase';
25022
25026
  case 'substituir':
25023
25027
  return 'replace';
25028
+ case 'texto':
25029
+ return 'String';
25024
25030
  default:
25025
25031
  return metodo;
25026
25032
  }
@@ -25047,22 +25053,6 @@ class TradutorJavaScript {
25047
25053
  resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
25048
25054
  return resultado;
25049
25055
  }
25050
- traduzirConstrutoDefinirValor(definirValor) {
25051
- let resultado = '';
25052
- if (definirValor.objeto instanceof construtos_1.Isto) {
25053
- resultado = 'this.' + definirValor.nome.lexema + ' = ';
25054
- }
25055
- resultado += definirValor.valor.simbolo.lexema;
25056
- return resultado;
25057
- }
25058
- traduzirConstrutoLiteral(literal) {
25059
- if (typeof literal.valor === 'string')
25060
- return `'${literal.valor}'`;
25061
- return literal.valor;
25062
- }
25063
- traduzirConstrutoVariavel(variavel) {
25064
- return variavel.simbolo.lexema;
25065
- }
25066
25056
  traduzirConstrutoChamada(chamada) {
25067
25057
  let resultado = '';
25068
25058
  const retorno = `${this.dicionarioConstrutos[chamada.entidadeChamada.constructor.name](chamada.entidadeChamada)}`;
@@ -25103,6 +25093,22 @@ class TradutorJavaScript {
25103
25093
  }
25104
25094
  return resultado;
25105
25095
  }
25096
+ traduzirConstrutoDefinirValor(definirValor) {
25097
+ let resultado = '';
25098
+ if (definirValor.objeto instanceof construtos_1.Isto) {
25099
+ resultado = 'this.' + definirValor.nome.lexema + ' = ';
25100
+ }
25101
+ resultado += definirValor.valor.simbolo.lexema;
25102
+ return resultado;
25103
+ }
25104
+ traduzirConstrutoLiteral(literal) {
25105
+ if (typeof literal.valor === 'string')
25106
+ return `'${literal.valor}'`;
25107
+ return literal.valor;
25108
+ }
25109
+ traduzirConstrutoVariavel(variavel) {
25110
+ return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
25111
+ }
25106
25112
  logicaComumBlocoEscopo(declaracoes) {
25107
25113
  let resultado = '{\n';
25108
25114
  this.indentacao += 4;
@@ -25254,13 +25260,12 @@ class TradutorJavaScript {
25254
25260
  let resultado = 'for (';
25255
25261
  if (declaracaoPara.inicializador.constructor.name === 'Array') {
25256
25262
  resultado +=
25257
- this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0]) + ' ';
25263
+ this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0], false) + '; ';
25258
25264
  }
25259
25265
  else {
25260
25266
  resultado +=
25261
- this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + ' ';
25267
+ this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador, false) + '; ';
25262
25268
  }
25263
- resultado += !resultado.includes(';') ? ';' : '';
25264
25269
  resultado +=
25265
25270
  this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao) + '; ';
25266
25271
  resultado +=
@@ -25351,10 +25356,10 @@ class TradutorJavaScript {
25351
25356
  }
25352
25357
  return resultado;
25353
25358
  }
25354
- traduzirDeclaracaoVar(declaracaoVar) {
25359
+ traduzirDeclaracaoVar(declaracaoVar, adicionarPontoEVirgula = true) {
25355
25360
  let resultado = 'let ';
25356
25361
  resultado += declaracaoVar.simbolo.lexema;
25357
- if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador))
25362
+ if (!(declaracaoVar === null || declaracaoVar === void 0 ? void 0 : declaracaoVar.inicializador) && adicionarPontoEVirgula)
25358
25363
  resultado += ';';
25359
25364
  else {
25360
25365
  resultado += ' = ';
@@ -25364,7 +25369,8 @@ class TradutorJavaScript {
25364
25369
  else {
25365
25370
  resultado += this.dicionarioDeclaracoes[declaracaoVar.inicializador.constructor.name](declaracaoVar.inicializador);
25366
25371
  }
25367
- resultado += ';';
25372
+ if (adicionarPontoEVirgula)
25373
+ resultado += ';';
25368
25374
  }
25369
25375
  return resultado;
25370
25376
  }
@@ -25393,6 +25399,7 @@ class TradutorJavaScript {
25393
25399
  let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25394
25400
  return `${direita} ${operador} ${esquerda}`;
25395
25401
  }
25402
+ // TODO: Eliminar o soft cast para `any`.
25396
25403
  traduzirConstrutoAtribuicaoPorIndice(AtribuicaoPorIndice) {
25397
25404
  var _a, _b;
25398
25405
  let resultado = '';
@@ -25441,7 +25448,8 @@ class TradutorJavaScript {
25441
25448
  return resultado;
25442
25449
  }
25443
25450
  traduzirDeclaracaoFalhar(falhar) {
25444
- return `throw '${falhar.explicacao.valor}'`;
25451
+ const explicacao = this.dicionarioConstrutos[falhar.explicacao.constructor.name](falhar.explicacao);
25452
+ return `throw ${explicacao}`;
25445
25453
  }
25446
25454
  traduzirConstrutoUnario(unario) {
25447
25455
  var _a, _b;
@@ -25543,8 +25551,10 @@ class TradutorPython {
25543
25551
  constructor() {
25544
25552
  this.indentacao = 0;
25545
25553
  this.dicionarioConstrutos = {
25546
- AcessoMetodoOuPropriedade: this.trazudirConstrutoAcessoMetodo.bind(this),
25554
+ AcessoMetodoOuPropriedade: this.traduzirConstrutoAcessoMetodoOuPropriedade.bind(this),
25555
+ AcessoIndiceVariavel: this.traduzirConstrutoAcessoIndiceVariavel.bind(this),
25547
25556
  Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
25557
+ AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
25548
25558
  Atribuir: this.traduzirConstrutoAtribuir.bind(this),
25549
25559
  Binario: this.traduzirConstrutoBinario.bind(this),
25550
25560
  Chamada: this.traduzirConstrutoChamada.bind(this),
@@ -25552,6 +25562,7 @@ class TradutorPython {
25552
25562
  DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
25553
25563
  Literal: this.traduzirConstrutoLiteral.bind(this),
25554
25564
  Logico: this.traduzirConstrutoLogico.bind(this),
25565
+ Unario: this.traduzirConstrutoUnario.bind(this),
25555
25566
  Variavel: this.traduzirConstrutoVariavel.bind(this),
25556
25567
  Vetor: this.traduzirConstrutoVetor.bind(this),
25557
25568
  };
@@ -25561,10 +25572,12 @@ class TradutorPython {
25561
25572
  Comentario: this.traduzirConstrutoComentario.bind(this),
25562
25573
  Const: this.traduzirDeclaracaoConst.bind(this),
25563
25574
  Continua: () => 'continue',
25575
+ Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
25564
25576
  Escreva: this.traduzirDeclaracaoEscreva.bind(this),
25565
25577
  Expressao: this.traduzirDeclaracaoExpressao.bind(this),
25566
25578
  FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
25567
25579
  Leia: this.traduzirDeclaracaoLeia.bind(this),
25580
+ Para: this.traduzirDeclaracaoPara.bind(this),
25568
25581
  ParaCada: this.traduzirDeclaracaoParaCada.bind(this),
25569
25582
  Retorna: this.traduzirDeclaracaoRetorna.bind(this),
25570
25583
  Se: this.traduzirDeclaracaoSe.bind(this),
@@ -25573,9 +25586,6 @@ class TradutorPython {
25573
25586
  Var: this.traduzirDeclaracaoVar.bind(this),
25574
25587
  };
25575
25588
  }
25576
- traduzirNomeVariavel(variavel) {
25577
- return variavel.replace(/\.?([A-Z]+)/g, (x, y) => '_' + y.toLowerCase()).replace(/^_/, '');
25578
- }
25579
25589
  traduzirSimboloOperador(operador) {
25580
25590
  switch (operador.tipo) {
25581
25591
  case delegua_1.default.ADICAO:
@@ -25645,6 +25655,8 @@ class TradutorPython {
25645
25655
  return 'lower';
25646
25656
  case 'substituir':
25647
25657
  return 'replace';
25658
+ case 'texto':
25659
+ return 'str';
25648
25660
  default:
25649
25661
  return metodo;
25650
25662
  }
@@ -25669,7 +25681,12 @@ class TradutorPython {
25669
25681
  resultado += ' '.repeat(this.indentacao) + '\n';
25670
25682
  return resultado;
25671
25683
  }
25672
- trazudirConstrutoAcessoMetodo(acessoMetodo) {
25684
+ traduzirConstrutoAcessoIndiceVariavel(acessoIndiceVariavel) {
25685
+ const entidade = this.dicionarioConstrutos[acessoIndiceVariavel.entidadeChamada.constructor.name](acessoIndiceVariavel.entidadeChamada);
25686
+ const indice = this.dicionarioConstrutos[acessoIndiceVariavel.indice.constructor.name](acessoIndiceVariavel.indice);
25687
+ return `${entidade}[${indice}]`;
25688
+ }
25689
+ traduzirConstrutoAcessoMetodoOuPropriedade(acessoMetodo) {
25673
25690
  if (acessoMetodo.objeto instanceof construtos_1.Variavel) {
25674
25691
  let objetoVariavel = acessoMetodo.objeto;
25675
25692
  let funcaoTraduzida = this.traduzirFuncoesNativas(acessoMetodo.simbolo.lexema);
@@ -25686,6 +25703,12 @@ class TradutorPython {
25686
25703
  traduzirConstrutoAgrupamento(agrupamento) {
25687
25704
  return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
25688
25705
  }
25706
+ traduzirConstrutoAtribuicaoPorIndice(atribuicaoPorIndice) {
25707
+ const objeto = this.dicionarioConstrutos[atribuicaoPorIndice.objeto.constructor.name](atribuicaoPorIndice.objeto);
25708
+ const indice = this.dicionarioConstrutos[atribuicaoPorIndice.indice.constructor.name](atribuicaoPorIndice.indice);
25709
+ const valor = this.dicionarioConstrutos[atribuicaoPorIndice.valor.constructor.name](atribuicaoPorIndice.valor);
25710
+ return `${objeto}[${indice}] = ${valor}`;
25711
+ }
25689
25712
  traduzirConstrutoAtribuir(atribuir) {
25690
25713
  let resultado = atribuir.simbolo.lexema;
25691
25714
  resultado += ' = ' + this.dicionarioConstrutos[atribuir.valor.constructor.name](atribuir.valor);
@@ -25759,18 +25782,31 @@ class TradutorPython {
25759
25782
  if (typeof literal.valor === 'boolean') {
25760
25783
  return literal.valor ? 'True' : 'False';
25761
25784
  }
25785
+ if (typeof literal.valor === 'number') {
25786
+ return String(literal.valor);
25787
+ }
25762
25788
  if (!literal.valor)
25763
25789
  return 'None';
25764
25790
  return literal.valor;
25765
25791
  }
25766
25792
  traduzirConstrutoLogico(logico) {
25767
- let direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
25768
- let operador = this.traduzirSimboloOperador(logico.operador);
25769
- let esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25793
+ const direita = this.dicionarioConstrutos[logico.direita.constructor.name](logico.direita);
25794
+ const operador = this.traduzirSimboloOperador(logico.operador);
25795
+ const esquerda = this.dicionarioConstrutos[logico.esquerda.constructor.name](logico.esquerda);
25770
25796
  return `${esquerda} ${operador} ${direita}`;
25771
25797
  }
25798
+ traduzirConstrutoUnario(unario) {
25799
+ const operador = this.traduzirSimboloOperador(unario.operador);
25800
+ const operando = this.dicionarioConstrutos[unario.operando.constructor.name](unario.operando);
25801
+ switch (unario.incidenciaOperador) {
25802
+ case 'ANTES':
25803
+ return `${operador}${operando}`;
25804
+ case 'DEPOIS':
25805
+ return `${operando}${operador}`;
25806
+ }
25807
+ }
25772
25808
  traduzirConstrutoVariavel(variavel) {
25773
- return variavel.simbolo.lexema;
25809
+ return this.traduzirFuncoesNativas(variavel.simbolo.lexema);
25774
25810
  }
25775
25811
  traduzirConstrutoVetor(vetor) {
25776
25812
  if (!vetor.valores.length) {
@@ -25786,45 +25822,6 @@ class TradutorPython {
25786
25822
  resultado += ']';
25787
25823
  return resultado;
25788
25824
  }
25789
- traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
25790
- let resultado = '';
25791
- if (iniciarComIf) {
25792
- resultado += 'if ';
25793
- }
25794
- else {
25795
- resultado += 'elif ';
25796
- }
25797
- const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
25798
- resultado += condicao;
25799
- resultado += ':\n';
25800
- resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
25801
- if (declaracaoSe.caminhoSenao !== null) {
25802
- resultado += ' '.repeat(this.indentacao);
25803
- const se = declaracaoSe === null || declaracaoSe === void 0 ? void 0 : declaracaoSe.caminhoSenao;
25804
- if (se === null || se === void 0 ? void 0 : se.caminhoEntao) {
25805
- resultado += 'elif ';
25806
- resultado += this.dicionarioConstrutos[se.condicao.constructor.name](se.condicao, false);
25807
- resultado += ':\n';
25808
- resultado += this.dicionarioDeclaracoes[se.caminhoEntao.constructor.name](se.caminhoEntao);
25809
- resultado += ' '.repeat(this.indentacao);
25810
- if (se === null || se === void 0 ? void 0 : se.caminhoSenao) {
25811
- if (se.caminhoSenao instanceof declaracoes_1.Bloco) {
25812
- resultado += 'else:\n';
25813
- resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
25814
- return resultado;
25815
- }
25816
- else {
25817
- resultado += this.dicionarioDeclaracoes[se.caminhoSenao.constructor.name](se.caminhoSenao, false);
25818
- return resultado;
25819
- }
25820
- }
25821
- }
25822
- resultado += 'else:\n';
25823
- resultado += ' '.repeat(this.indentacao);
25824
- resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
25825
- }
25826
- return resultado;
25827
- }
25828
25825
  logicaTraducaoMetodoClasse(metodoClasse) {
25829
25826
  this.indentacao += 4;
25830
25827
  let resultado = ' '.repeat(this.indentacao);
@@ -25867,9 +25864,7 @@ class TradutorPython {
25867
25864
  return resultado;
25868
25865
  }
25869
25866
  traduzirDeclaracaoConst(declaracaoConst) {
25870
- let resultado = '';
25871
- resultado += this.traduzirNomeVariavel(declaracaoConst.simbolo.lexema);
25872
- resultado += ' = ';
25867
+ let resultado = declaracaoConst.simbolo.lexema + ' = ';
25873
25868
  const inicializador = declaracaoConst.inicializador;
25874
25869
  if (inicializador) {
25875
25870
  if (this.dicionarioConstrutos[inicializador.constructor.name]) {
@@ -25884,6 +25879,13 @@ class TradutorPython {
25884
25879
  }
25885
25880
  return resultado;
25886
25881
  }
25882
+ traduzirDeclaracaoEnquanto(declaracaoEnquanto) {
25883
+ let resultado = ' '.repeat(this.indentacao) + 'while ';
25884
+ const condicao = this.dicionarioConstrutos[declaracaoEnquanto.condicao.constructor.name](declaracaoEnquanto.condicao);
25885
+ resultado += condicao + ':\n';
25886
+ resultado += this.dicionarioDeclaracoes[declaracaoEnquanto.corpo.constructor.name](declaracaoEnquanto.corpo);
25887
+ return resultado;
25888
+ }
25887
25889
  traduzirDeclaracaoEscreva(declaracaoEscreva) {
25888
25890
  let resultado = 'print(';
25889
25891
  for (const argumento of declaracaoEscreva.argumentos) {
@@ -25906,7 +25908,7 @@ class TradutorPython {
25906
25908
  if (declaracaoFuncao.funcao.parametros.length > 0) {
25907
25909
  resultado = resultado.slice(0, -2);
25908
25910
  }
25909
- resultado += '):';
25911
+ resultado += '):\n';
25910
25912
  resultado += this.logicaComumBlocoEscopo(declaracaoFuncao.funcao.corpo);
25911
25913
  return resultado;
25912
25914
  }
@@ -25920,6 +25922,32 @@ class TradutorPython {
25920
25922
  resultado += ')';
25921
25923
  return resultado;
25922
25924
  }
25925
+ /**
25926
+ * Como não existe declaração `para` com variáveis de controle em Python, o
25927
+ * que tentamos aqui é criar a mesma coisa usando `while()`.
25928
+ * @param declaracaoPara A declaração `Para`.
25929
+ * @returns Um bloco equivalente ao que seria um bloco `for` com variáveis de controle em Python.
25930
+ */
25931
+ traduzirDeclaracaoPara(declaracaoPara) {
25932
+ let resultado = '';
25933
+ // Em uma declaração `Para` em Delégua, são obrigatórios a condição e o incremento.
25934
+ if (declaracaoPara.inicializador) {
25935
+ if (Array.isArray(declaracaoPara.inicializador)) {
25936
+ for (const declaracaoInicializador of declaracaoPara.inicializador) {
25937
+ resultado += this.dicionarioDeclaracoes[declaracaoInicializador.constructor.name](declaracaoInicializador) + `\n`;
25938
+ }
25939
+ }
25940
+ else {
25941
+ resultado += this.dicionarioDeclaracoes[declaracaoPara.inicializador.constructor.name](declaracaoPara.inicializador) + `\n`;
25942
+ }
25943
+ }
25944
+ const condicao = this.dicionarioConstrutos[declaracaoPara.condicao.constructor.name](declaracaoPara.condicao);
25945
+ resultado += ' '.repeat(this.indentacao) + `while ${condicao}:\n`;
25946
+ // O incremento passa a ser a última instrução do bloco.
25947
+ declaracaoPara.corpo.declaracoes.push(new declaracoes_1.Expressao(declaracaoPara.incrementar));
25948
+ resultado += this.dicionarioDeclaracoes[declaracaoPara.corpo.constructor.name](declaracaoPara.corpo);
25949
+ return resultado;
25950
+ }
25923
25951
  traduzirDeclaracaoParaCada(declaracaoParaCada) {
25924
25952
  let resultado = `for ${declaracaoParaCada.nomeVariavelIteracao} in `;
25925
25953
  resultado +=
@@ -25932,6 +25960,42 @@ class TradutorPython {
25932
25960
  const nomeConstrutor = declaracaoRetorna.valor.constructor.name;
25933
25961
  return (resultado += this.dicionarioConstrutos[nomeConstrutor](declaracaoRetorna === null || declaracaoRetorna === void 0 ? void 0 : declaracaoRetorna.valor));
25934
25962
  }
25963
+ traduzirDeclaracaoSe(declaracaoSe, iniciarComIf = true) {
25964
+ let resultado = '';
25965
+ if (iniciarComIf) {
25966
+ resultado += 'if ';
25967
+ }
25968
+ else {
25969
+ resultado += 'elif ';
25970
+ }
25971
+ const condicao = this.dicionarioConstrutos[declaracaoSe.condicao.constructor.name](declaracaoSe.condicao);
25972
+ resultado += condicao;
25973
+ resultado += ':\n';
25974
+ resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
25975
+ if (declaracaoSe.caminhoSenao) {
25976
+ resultado += ' '.repeat(this.indentacao);
25977
+ const senao = declaracaoSe.caminhoSenao;
25978
+ if (senao === null || senao === void 0 ? void 0 : senao.caminhoEntao) {
25979
+ resultado += 'elif ';
25980
+ resultado += this.dicionarioConstrutos[senao.condicao.constructor.name](senao.condicao, false);
25981
+ resultado += ':\n';
25982
+ resultado += this.dicionarioDeclaracoes[senao.caminhoEntao.constructor.name](senao.caminhoEntao);
25983
+ resultado += ' '.repeat(this.indentacao);
25984
+ if (senao === null || senao === void 0 ? void 0 : senao.caminhoSenao) {
25985
+ if (senao.caminhoSenao instanceof declaracoes_1.Bloco) {
25986
+ resultado += 'else:\n';
25987
+ resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
25988
+ return resultado;
25989
+ }
25990
+ resultado += this.dicionarioDeclaracoes[senao.caminhoSenao.constructor.name](senao.caminhoSenao, false);
25991
+ return resultado;
25992
+ }
25993
+ }
25994
+ resultado += 'else:\n';
25995
+ resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoSenao.constructor.name](declaracaoSe.caminhoSenao);
25996
+ }
25997
+ return resultado;
25998
+ }
25935
25999
  traduzirDeclaracaoTente(declaracaoTente) {
25936
26000
  let resultado = 'try:\n';
25937
26001
  this.indentacao += 4;
@@ -25965,9 +26029,7 @@ class TradutorPython {
25965
26029
  return resultado;
25966
26030
  }
25967
26031
  traduzirDeclaracaoVar(declaracaoVar) {
25968
- let resultado = '';
25969
- resultado += this.traduzirNomeVariavel(declaracaoVar.simbolo.lexema);
25970
- resultado += ' = ';
26032
+ let resultado = declaracaoVar.simbolo.lexema + ' = ';
25971
26033
  const inicializador = declaracaoVar.inicializador;
25972
26034
  if (inicializador) {
25973
26035
  if (this.dicionarioConstrutos[inicializador.constructor.name]) {