@designliquido/delegua 1.15.0 → 1.15.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.
Files changed (48) hide show
  1. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +1 -0
  2. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  3. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +18 -0
  4. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +13 -3
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts +10 -3
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +279 -57
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  12. package/bibliotecas/dialetos/prisma/biblioteca-global.d.ts +10 -0
  13. package/bibliotecas/dialetos/prisma/biblioteca-global.d.ts.map +1 -0
  14. package/bibliotecas/dialetos/prisma/biblioteca-global.js +224 -0
  15. package/bibliotecas/dialetos/prisma/biblioteca-global.js.map +1 -0
  16. package/bin/package.json +1 -1
  17. package/interpretador/dialetos/index.d.ts +1 -0
  18. package/interpretador/dialetos/index.d.ts.map +1 -1
  19. package/interpretador/dialetos/index.js +1 -0
  20. package/interpretador/dialetos/index.js.map +1 -1
  21. package/interpretador/dialetos/prisma/index.d.ts +2 -0
  22. package/interpretador/dialetos/prisma/index.d.ts.map +1 -0
  23. package/interpretador/dialetos/prisma/index.js +18 -0
  24. package/interpretador/dialetos/prisma/index.js.map +1 -0
  25. package/interpretador/dialetos/prisma/interpretador-prisma.d.ts +13 -0
  26. package/interpretador/dialetos/prisma/interpretador-prisma.d.ts.map +1 -0
  27. package/interpretador/dialetos/prisma/interpretador-prisma.js +49 -0
  28. package/interpretador/dialetos/prisma/interpretador-prisma.js.map +1 -0
  29. package/lexador/dialetos/lexador-prisma.d.ts.map +1 -1
  30. package/lexador/dialetos/lexador-prisma.js +24 -6
  31. package/lexador/dialetos/lexador-prisma.js.map +1 -1
  32. package/lexador/dialetos/palavras-reservadas/prisma.d.ts +3 -0
  33. package/lexador/dialetos/palavras-reservadas/prisma.d.ts.map +1 -1
  34. package/lexador/dialetos/palavras-reservadas/prisma.js +3 -0
  35. package/lexador/dialetos/palavras-reservadas/prisma.js.map +1 -1
  36. package/lexador/lexador.d.ts.map +1 -1
  37. package/lexador/lexador.js +55 -4
  38. package/lexador/lexador.js.map +1 -1
  39. package/package.json +1 -1
  40. package/tipos-de-simbolos/prisma.d.ts +4 -0
  41. package/tipos-de-simbolos/prisma.d.ts.map +1 -1
  42. package/tipos-de-simbolos/prisma.js +4 -0
  43. package/tipos-de-simbolos/prisma.js.map +1 -1
  44. package/tradutores/tradutor-assemblyscript.d.ts +2 -0
  45. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  46. package/tradutores/tradutor-assemblyscript.js +63 -0
  47. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  48. package/umd/delegua.js +442 -71
package/umd/delegua.js CHANGED
@@ -6284,7 +6284,7 @@ class AvaliadorSintaticoPitugues {
6284
6284
  while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
6285
6285
  const operador = this.simbolos[this.atual - 1];
6286
6286
  const expressaoOuCondicao = await this.seTernario();
6287
- this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
6287
+ this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
6288
6288
  ${this.simbolos[this.atual].lexema}.`);
6289
6289
  const expressaoSenao = await this.seTernario();
6290
6290
  expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
@@ -6554,10 +6554,20 @@ class AvaliadorSintaticoPitugues {
6554
6554
  }
6555
6555
  async declaracaoSe() {
6556
6556
  const condicao = await this.expressao();
6557
- const caminhoEntao = (await this.resolverDeclaracao());
6557
+ this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' após condição do 'se'.");
6558
+ const simboloColonEntao = this.simboloAnterior();
6559
+ const caminhoEntao = new declaracoes_1.Bloco(simboloColonEntao.hashArquivo, Number(simboloColonEntao.linha), await this.blocoEscopo());
6558
6560
  let caminhoSenao = null;
6559
6561
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SENAO, pitugues_2.default.SENÃO)) {
6560
- caminhoSenao = await this.resolverDeclaracao();
6562
+ if (this.verificarTipoSimboloAtual(pitugues_2.default.SE)) {
6563
+ // 'senao se' - encadeamento de condicionais, sem dois-pontos
6564
+ caminhoSenao = await this.resolverDeclaracao();
6565
+ }
6566
+ else {
6567
+ this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' após 'senao'.");
6568
+ const simboloColonSenao = this.simboloAnterior();
6569
+ caminhoSenao = new declaracoes_1.Bloco(simboloColonSenao.hashArquivo, Number(simboloColonSenao.linha), await this.blocoEscopo());
6570
+ }
6561
6571
  }
6562
6572
  return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
6563
6573
  }
@@ -7400,6 +7410,7 @@ const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime
7400
7410
  const construtos_1 = require("../../construtos");
7401
7411
  const declaracoes_1 = require("../../declaracoes");
7402
7412
  const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
7413
+ const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
7403
7414
  const inferenciador_1 = require("../../inferenciador");
7404
7415
  const pilha_escopos_1 = require("../pilha-escopos");
7405
7416
  const informacao_escopo_1 = require("../informacao-escopo");
@@ -7484,6 +7495,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7484
7495
  return false;
7485
7496
  }
7486
7497
  async primario() {
7498
+ var _a;
7487
7499
  const simboloAtual = this.simbolos[this.atual];
7488
7500
  let valores = [];
7489
7501
  switch (simboloAtual.tipo) {
@@ -7505,10 +7517,16 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7505
7517
  }
7506
7518
  let indice = 1;
7507
7519
  do {
7508
- let chave = String(indice);
7509
- if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.COLCHETE_ESQUERDO)) {
7510
- // Lógica para índice nomeado
7511
- // TODO: Terminar
7520
+ let chave;
7521
+ if (this.verificarTipoSimboloAtual(prisma_1.default.IDENTIFICADOR) &&
7522
+ ((_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo) === prisma_1.default.IGUAL) {
7523
+ // Chave nomeada: {nome = "João"}
7524
+ const chaveIdentificador = this.avancarEDevolverAnterior();
7525
+ this.avancarEDevolverAnterior(); // consume IGUAL
7526
+ chave = new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, chaveIdentificador.lexema);
7527
+ }
7528
+ else {
7529
+ chave = new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, String(indice));
7512
7530
  }
7513
7531
  const valor = await this.ou();
7514
7532
  chaves.push(chave);
@@ -7568,8 +7586,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7568
7586
  }
7569
7587
  throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
7570
7588
  }
7571
- expressaoImportar() {
7572
- throw new Error('Método não implementado.');
7589
+ async expressaoImportar() {
7590
+ this.avancarEDevolverAnterior();
7591
+ this.consumir(prisma_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
7592
+ const caminho = await this.expressao();
7593
+ this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
7594
+ return new construtos_1.ImportarComoConstruto(caminho);
7573
7595
  }
7574
7596
  /**
7575
7597
  * Construto para texto multilinhas.
@@ -7637,7 +7659,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7637
7659
  return expressao;
7638
7660
  }
7639
7661
  async unario() {
7640
- if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.NEGACAO, prisma_1.default.SUBTRACAO, prisma_1.default.BIT_NOT)) {
7662
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.NEGACAO, prisma_1.default.SUBTRACAO, prisma_1.default.BIT_NOT, prisma_1.default.NAO, prisma_1.default.COMPRIMENTO)) {
7641
7663
  const operador = this.simboloAnterior();
7642
7664
  const direito = await this.unario();
7643
7665
  return new construtos_1.Unario(this.hashArquivo, operador, direito);
@@ -7671,8 +7693,17 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7671
7693
  }
7672
7694
  return expressao;
7673
7695
  }
7674
- async bitShift() {
7696
+ async concatenacao() {
7675
7697
  let expressao = await this.adicaoOuSubtracao();
7698
+ while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CONCATENACAO)) {
7699
+ const operador = this.simboloAnterior();
7700
+ const direito = await this.adicaoOuSubtracao();
7701
+ expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
7702
+ }
7703
+ return expressao;
7704
+ }
7705
+ async bitShift() {
7706
+ let expressao = await this.concatenacao();
7676
7707
  while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.MENOR_MENOR, prisma_1.default.MAIOR_MAIOR)) {
7677
7708
  const operador = this.simboloAnterior();
7678
7709
  const direito = await this.adicaoOuSubtracao();
@@ -7743,8 +7774,19 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7743
7774
  }
7744
7775
  return expressao;
7745
7776
  }
7777
+ async ternario() {
7778
+ let expressaoOuCondicao = await this.ou();
7779
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.INTERROGACAO)) {
7780
+ const operador = this.simboloAnterior();
7781
+ const caminhoEntao = await this.e();
7782
+ this.consumir(prisma_1.default.OU, "Esperado palavra reservada 'ou' após caminho positivo em operador ternário.");
7783
+ const caminhoSenao = await this.ternario();
7784
+ expressaoOuCondicao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, caminhoEntao, operador, caminhoSenao);
7785
+ }
7786
+ return expressaoOuCondicao;
7787
+ }
7746
7788
  async atribuir() {
7747
- const expressao = await this.ou();
7789
+ const expressao = await this.ternario();
7748
7790
  if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.IGUAL) ||
7749
7791
  this.verificarSeSimboloAtualEIgualA(prisma_1.default.MAIS_IGUAL)) {
7750
7792
  const igual = this.simboloAnterior();
@@ -7796,7 +7838,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7796
7838
  }
7797
7839
  this.consumir(prisma_1.default.FIM, "Esperado 'fim' após o bloco.");
7798
7840
  this.pilhaEscopos.removerUltimo();
7799
- return declaracoes;
7841
+ return declaracoes.filter((d) => d);
7800
7842
  }
7801
7843
  async declaracaoDeLocal() {
7802
7844
  const identificador = this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome de variável.');
@@ -7821,6 +7863,65 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7821
7863
  this.blocos -= 1;
7822
7864
  }
7823
7865
  }
7866
+ async declaracaoEscolha() {
7867
+ try {
7868
+ this.blocos += 1;
7869
+ const condicao = await this.expressao();
7870
+ const caminhos = [];
7871
+ let caminhoPadrao = null;
7872
+ while (!this.verificarTipoSimboloAtual(prisma_1.default.FIM) && !this.estaNoFinal()) {
7873
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CASO)) {
7874
+ const caminhoCondicoes = [await this.expressao()];
7875
+ while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CASO)) {
7876
+ caminhoCondicoes.push(await this.expressao());
7877
+ }
7878
+ this.consumir(prisma_1.default.ENTAO, "Esperado palavra reservada 'entao' ou 'então' após valor do 'caso'.");
7879
+ const declaracoes = [];
7880
+ while (!this.estaNoFinal() &&
7881
+ ![
7882
+ prisma_1.default.CASO,
7883
+ prisma_1.default.PADRAO,
7884
+ prisma_1.default.FIM,
7885
+ ].includes(this.simbolos[this.atual].tipo)) {
7886
+ declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
7887
+ }
7888
+ caminhos.push({
7889
+ condicoes: caminhoCondicoes,
7890
+ declaracoes: declaracoes.filter((d) => d),
7891
+ });
7892
+ }
7893
+ else if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.PADRAO)) {
7894
+ if (caminhoPadrao !== null) {
7895
+ const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
7896
+ this.erros.push(excecao);
7897
+ throw excecao;
7898
+ }
7899
+ this.consumir(prisma_1.default.ENTAO, "Esperado palavra reservada 'entao' ou 'então' após declaração do 'padrao'.");
7900
+ const declaracoes = [];
7901
+ while (!this.estaNoFinal() &&
7902
+ ![
7903
+ prisma_1.default.CASO,
7904
+ prisma_1.default.PADRAO,
7905
+ prisma_1.default.FIM,
7906
+ ].includes(this.simbolos[this.atual].tipo)) {
7907
+ declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
7908
+ }
7909
+ caminhoPadrao = {
7910
+ condicoes: [],
7911
+ declaracoes: declaracoes.filter((d) => d),
7912
+ };
7913
+ }
7914
+ else {
7915
+ throw this.erro(this.simbolos[this.atual], "Esperado 'caso', 'padrao' ou 'fim' em declaração 'escolha'.");
7916
+ }
7917
+ }
7918
+ this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'escolha'.");
7919
+ return new declaracoes_1.Escolha(condicao, caminhos, caminhoPadrao);
7920
+ }
7921
+ finally {
7922
+ this.blocos -= 1;
7923
+ }
7924
+ }
7824
7925
  async declaracaoSe() {
7825
7926
  const simboloSe = this.simbolos[this.atual];
7826
7927
  const condicao = await this.expressao();
@@ -7831,17 +7932,57 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7831
7932
  } while (!this.estaNoFinal() &&
7832
7933
  ![prisma_1.default.SENAO, prisma_1.default.SENÃO, prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo));
7833
7934
  let caminhoSenao = null;
7935
+ let fimConsumidoNoCaminhoSenao = false;
7834
7936
  if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.SENAO, prisma_1.default.SENÃO)) {
7835
7937
  const simboloSenao = this.simbolos[this.atual - 1];
7836
- const declaracoesSenao = [];
7837
- do {
7838
- declaracoesSenao.push(await this.resolverDeclaracaoForaDeBloco());
7839
- } while (![prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo));
7840
- caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
7938
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.SE)) {
7939
+ caminhoSenao = await this.declaracaoSe();
7940
+ fimConsumidoNoCaminhoSenao = true;
7941
+ }
7942
+ else {
7943
+ const declaracoesSenao = [];
7944
+ do {
7945
+ declaracoesSenao.push(await this.resolverDeclaracaoForaDeBloco());
7946
+ } while (![prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo));
7947
+ caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
7948
+ }
7949
+ }
7950
+ if (!fimConsumidoNoCaminhoSenao) {
7951
+ this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'se'.");
7841
7952
  }
7842
- this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
7843
7953
  return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
7844
7954
  }
7955
+ async declaracaoTente() {
7956
+ const simboloTente = this.simboloAnterior();
7957
+ const blocoTente = [];
7958
+ while (!this.estaNoFinal() &&
7959
+ ![
7960
+ prisma_1.default.PEGUE,
7961
+ prisma_1.default.FINALMENTE,
7962
+ prisma_1.default.FIM,
7963
+ ].includes(this.simbolos[this.atual].tipo)) {
7964
+ blocoTente.push(await this.resolverDeclaracaoForaDeBloco());
7965
+ }
7966
+ let blocoPegue = null;
7967
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.PEGUE)) {
7968
+ const declaracoesPegue = [];
7969
+ while (!this.estaNoFinal() &&
7970
+ ![prisma_1.default.FINALMENTE, prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo)) {
7971
+ declaracoesPegue.push(await this.resolverDeclaracaoForaDeBloco());
7972
+ }
7973
+ blocoPegue = declaracoesPegue.filter((d) => d);
7974
+ }
7975
+ let blocoFinalmente = null;
7976
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.FINALMENTE)) {
7977
+ const declaracoesFinalmente = [];
7978
+ while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.FIM)) {
7979
+ declaracoesFinalmente.push(await this.resolverDeclaracaoForaDeBloco());
7980
+ }
7981
+ blocoFinalmente = declaracoesFinalmente.filter((d) => d);
7982
+ }
7983
+ this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'tente'.");
7984
+ return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente.filter((d) => d), blocoPegue, null, blocoFinalmente);
7985
+ }
7845
7986
  async declaracaoQuebre() {
7846
7987
  if (this.blocos < 1) {
7847
7988
  throw this.erro(this.simboloAnterior(), "'quebre' deve estar dentro de um laço de repetição.");
@@ -7925,11 +8066,15 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7925
8066
  return null;
7926
8067
  case prisma_1.default.ENTAO:
7927
8068
  case prisma_1.default.INICIO:
8069
+ case prisma_1.default.FAZER:
7928
8070
  const simboloInicioBloco = this.avancarEDevolverAnterior();
7929
8071
  return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
7930
8072
  case prisma_1.default.ENQUANTO:
7931
8073
  this.avancarEDevolverAnterior();
7932
8074
  return await this.declaracaoEnquanto();
8075
+ case prisma_1.default.ESCOLHA:
8076
+ this.avancarEDevolverAnterior();
8077
+ return await this.declaracaoEscolha();
7933
8078
  case prisma_1.default.IDENTIFICADOR:
7934
8079
  const proximoSimbolo = this.simbolos[this.atual + 1];
7935
8080
  if (proximoSimbolo && proximoSimbolo.tipo === prisma_1.default.IGUAL) {
@@ -7951,6 +8096,9 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7951
8096
  case prisma_1.default.RETORNE:
7952
8097
  this.avancarEDevolverAnterior();
7953
8098
  return await this.declaracaoRetorna();
8099
+ case prisma_1.default.TENTE:
8100
+ this.avancarEDevolverAnterior();
8101
+ return await this.declaracaoTente();
7954
8102
  case prisma_1.default.LOCAL:
7955
8103
  this.avancarEDevolverAnterior();
7956
8104
  return await this.declaracaoDeLocal();
@@ -7993,20 +8141,40 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7993
8141
  console.log(inicializador.constructor.name);
7994
8142
  }
7995
8143
  }
8144
+ async declaracaoParaCada(simboloPara) {
8145
+ const variavelIteracao = this.consumir(prisma_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
8146
+ this.consumir(prisma_1.default.EM, "Esperado palavra reservada 'em' após variável de iteração.");
8147
+ const vetorOuDicionario = await this.expressao();
8148
+ this.consumir(prisma_1.default.INICIO, `espera-se 'inicio' proximo a '${this.simbolos[this.atual].lexema}'.`);
8149
+ this.pilhaEscopos.definirInformacoesVariavel(variavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelIteracao.lexema, 'qualquer'));
8150
+ const declaracoesBlocoParaCada = [];
8151
+ while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.FIM)) {
8152
+ declaracoesBlocoParaCada.push(await this.resolverDeclaracaoForaDeBloco());
8153
+ }
8154
+ this.consumir(prisma_1.default.FIM, "Esperado 'fim' após bloco do para cada.");
8155
+ const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoParaCada.filter((d) => d));
8156
+ return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'qualquer'), vetorOuDicionario, corpo);
8157
+ }
7996
8158
  async declaracaoPara() {
7997
8159
  try {
7998
8160
  this.blocos += 1;
7999
8161
  const simboloPara = this.avancarEDevolverAnterior();
8162
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CADA)) {
8163
+ return await this.declaracaoParaCada(simboloPara);
8164
+ }
8000
8165
  const variavelIteracao = this.consumir(prisma_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
8001
8166
  this.consumir(prisma_1.default.IGUAL, `'=' or 'em' esperado próximo a '${this.simbolos[this.atual].lexema}'.`);
8002
8167
  const literalOuVariavelInicio = await this.adicaoOuSubtracao();
8003
8168
  this.consumir(prisma_1.default.VIRGULA, `Espera-se '=' próximo a '${this.simbolos[this.atual].lexema}'.`);
8004
8169
  const literalOuVariavelFim = await this.adicaoOuSubtracao();
8005
8170
  let operadorCondicao = new lexador_1.Simbolo(prisma_1.default.MENOR_IGUAL, '<=', null, Number(simboloPara.linha), this.hashArquivo);
8006
- let operadorCondicaoIncremento = new lexador_1.Simbolo(prisma_1.default.MENOR, '<', null, Number(simboloPara.linha), this.hashArquivo);
8007
8171
  let passo = new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1);
8008
- const resolverIncrementoEmExecucao = false; // Mudar caso seja necessário.
8009
- this.consumir(prisma_1.default.INICIO, `espera-se 'inicio' proximo a '${this.simbolos[this.atual].lexema}'.`);
8172
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.VIRGULA)) {
8173
+ passo = await this.adicaoOuSubtracao();
8174
+ }
8175
+ if (!this.verificarSeSimboloAtualEIgualA(prisma_1.default.INICIO, prisma_1.default.FAZER)) {
8176
+ throw this.erro(this.simbolos[this.atual], `espera-se 'inicio' ou 'fazer' proximo a '${this.simbolos[this.atual].lexema}'.`);
8177
+ }
8010
8178
  // Aqui já é seguro inicializar a variável.
8011
8179
  this.pilhaEscopos.definirInformacoesVariavel(variavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelIteracao.lexema, 'inteiro'));
8012
8180
  const declaracoesBlocoPara = [];
@@ -8018,14 +8186,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
8018
8186
  this.avancarEDevolverAnterior(); // fim
8019
8187
  const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
8020
8188
  const para = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha),
8021
- // Inicialização.
8022
- new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), literalOuVariavelInicio)),
8189
+ // Inicialização: declara a variável de iteração.
8190
+ new declaracoes_1.Var(variavelIteracao, literalOuVariavelInicio, 'inteiro'),
8023
8191
  // Condição.
8024
8192
  new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), operadorCondicao, literalOuVariavelFim),
8025
- // Incremento, feito em construto especial `FimPara`.
8026
- new construtos_1.FimPara(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), operadorCondicaoIncremento, literalOuVariavelFim), new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new lexador_1.Simbolo(prisma_1.default.ADICAO, '+', null, Number(simboloPara.linha), this.hashArquivo), passo)))), corpo);
8027
- para.blocoPosExecucao = corpo;
8028
- para.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
8193
+ // Incremento simples.
8194
+ new construtos_1.Atribuir(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new lexador_1.Simbolo(prisma_1.default.ADICAO, '+', null, Number(simboloPara.linha), this.hashArquivo), passo)), corpo);
8029
8195
  return para;
8030
8196
  }
8031
8197
  finally {
@@ -8050,6 +8216,48 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
8050
8216
  return null;
8051
8217
  }
8052
8218
  }
8219
+ async metodoClassePrisma(construtor) {
8220
+ const simbolo = construtor
8221
+ ? new lexador_1.Simbolo(prisma_1.default.CONSTRUTOR, 'construtor', null, Number(this.simboloAnterior().linha), this.hashArquivo)
8222
+ : this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome do método.');
8223
+ this.consumir(prisma_1.default.PARENTESE_ESQUERDO, "Esperado '(' após nome do método.");
8224
+ let parametros = [];
8225
+ if (!this.verificarTipoSimboloAtual(prisma_1.default.PARENTESE_DIREITO)) {
8226
+ parametros = await this.logicaComumParametros();
8227
+ }
8228
+ this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
8229
+ this.consumir(prisma_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
8230
+ const declaracoesCorpo = [];
8231
+ while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.CHAVE_DIREITA)) {
8232
+ declaracoesCorpo.push(await this.resolverDeclaracaoForaDeBloco());
8233
+ }
8234
+ this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após o corpo do método.");
8235
+ const corpoDaFuncao = new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simbolo.linha), parametros, declaracoesCorpo.filter((d) => d), 'qualquer', false);
8236
+ const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
8237
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao);
8238
+ }
8239
+ propriedadesDeclaradasEmMetodo(metodo) {
8240
+ const propriedades = [];
8241
+ const nomesPropriedades = new Set();
8242
+ for (const declaracao of metodo.funcao.corpo) {
8243
+ if (!(declaracao instanceof declaracoes_1.Expressao)) {
8244
+ continue;
8245
+ }
8246
+ if (!(declaracao.expressao instanceof construtos_1.DefinirValor)) {
8247
+ continue;
8248
+ }
8249
+ if (!(declaracao.expressao.objeto instanceof construtos_1.Isto)) {
8250
+ continue;
8251
+ }
8252
+ const nomePropriedade = declaracao.expressao.nome.lexema;
8253
+ if (nomesPropriedades.has(nomePropriedade)) {
8254
+ continue;
8255
+ }
8256
+ nomesPropriedades.add(nomePropriedade);
8257
+ propriedades.push(new declaracoes_1.PropriedadeClasse(declaracao.expressao.nome, 'qualquer'));
8258
+ }
8259
+ return propriedades;
8260
+ }
8053
8261
  async declaracaoDeClasse() {
8054
8262
  const simbolo = this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
8055
8263
  let superClasse = null;
@@ -8065,47 +8273,71 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
8065
8273
  (this.verificarTipoSimboloAtual(prisma_1.default.CONSTRUTOR) ||
8066
8274
  this.verificarTipoSimboloAtual(prisma_1.default.FUNCAO) ||
8067
8275
  this.verificarTipoSimboloAtual(prisma_1.default.FUNÇÃO))) {
8068
- const ehConstrutor = this.verificarSeSimboloAtualEIgualA(prisma_1.default.CONSTRUTOR);
8069
- metodos.push(await this.funcao('método'));
8276
+ if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CONSTRUTOR)) {
8277
+ metodos.push(await this.metodoClassePrisma(true));
8278
+ continue;
8279
+ }
8280
+ this.verificarSeSimboloAtualEIgualA(prisma_1.default.FUNCAO, prisma_1.default.FUNÇÃO);
8281
+ metodos.push(await this.metodoClassePrisma(false));
8070
8282
  }
8071
8283
  this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após métodos da classe.");
8284
+ const propriedades = [];
8285
+ const nomesPropriedades = new Set();
8286
+ for (const metodo of metodos) {
8287
+ const propriedadesDoMetodo = this.propriedadesDeclaradasEmMetodo(metodo);
8288
+ for (const propriedade of propriedadesDoMetodo) {
8289
+ if (nomesPropriedades.has(propriedade.nome.lexema)) {
8290
+ continue;
8291
+ }
8292
+ nomesPropriedades.add(propriedade.nome.lexema);
8293
+ propriedades.push(propriedade);
8294
+ }
8295
+ }
8072
8296
  this.superclasseAtual = undefined;
8073
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos);
8297
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos, propriedades);
8074
8298
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
8075
8299
  return definicaoClasse;
8076
8300
  }
8077
8301
  inicializarPilhaEscopos() {
8078
8302
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
8079
8303
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
8080
- // TODO: verificar quais são as funções nativas básicas de Prisma
8081
- /* this.pilhaEscopos.definirInformacoesVariavel(
8082
- 'aleatorio',
8083
- new InformacaoElementoSintatico('aleatorio', 'número')
8084
- );
8085
- this.pilhaEscopos.definirInformacoesVariavel(
8086
- 'inteiro',
8087
- new InformacaoElementoSintatico('inteiro', 'inteiro', true, [
8088
- new InformacaoElementoSintatico('valor', 'qualquer'),
8089
- ])
8090
- );
8091
- this.pilhaEscopos.definirInformacoesVariavel(
8092
- 'numero',
8093
- new InformacaoElementoSintatico('número', 'número', true, [
8094
- new InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
8095
- ])
8096
- );
8097
- this.pilhaEscopos.definirInformacoesVariavel(
8098
- 'texto',
8099
- new InformacaoElementoSintatico('texto', 'texto', true, [
8100
- new InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
8101
- ])
8102
- );
8103
- this.pilhaEscopos.definirInformacoesVariavel(
8104
- 'tamanho',
8105
- new InformacaoElementoSintatico('tamanho', 'inteiro', true, [
8106
- new InformacaoElementoSintatico('objeto', 'qualquer'),
8107
- ])
8108
- ); */
8304
+ // Registrar funções nativas (built-ins) do Prisma no escopo do parser
8305
+ // para evitar erros de variável não definida durante análise semântica
8306
+ this.pilhaEscopos.definirInformacoesVariavel('tipo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tipo', 'função', true, [
8307
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
8308
+ ]));
8309
+ this.pilhaEscopos.definirInformacoesVariavel('poe', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('poe', 'função', true, [
8310
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valores', 'qualquer'),
8311
+ ]));
8312
+ this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tamanho', 'número', true, [
8313
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('objeto', 'qualquer'),
8314
+ ]));
8315
+ this.pilhaEscopos.definirInformacoesVariavel('pares', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('pares', 'tabela', true, [
8316
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tabela', 'tabela'),
8317
+ ]));
8318
+ this.pilhaEscopos.definirInformacoesVariavel('ipares', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('ipares', 'tabela', true, [
8319
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tabela', 'tabela'),
8320
+ ]));
8321
+ this.pilhaEscopos.definirInformacoesVariavel('convnumero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('convnumero', 'número', true, [
8322
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
8323
+ ]));
8324
+ this.pilhaEscopos.definirInformacoesVariavel('convstring', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('convstring', 'texto', true, [
8325
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
8326
+ ]));
8327
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'função', true, []));
8328
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio_entre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio_entre', 'número', true, [
8329
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
8330
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
8331
+ ]));
8332
+ this.pilhaEscopos.definirInformacoesVariavel('coletelixo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('coletelixo', 'número', true, [
8333
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('acao', 'texto'),
8334
+ ]));
8335
+ this.pilhaEscopos.definirInformacoesVariavel('piso', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('piso', 'número', true, [
8336
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('n', 'número'),
8337
+ ]));
8338
+ this.pilhaEscopos.definirInformacoesVariavel('teto', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('teto', 'número', true, [
8339
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('n', 'número'),
8340
+ ]));
8109
8341
  }
8110
8342
  async analisar(retornoLexador, hashArquivo) {
8111
8343
  const inicioAnalise = (0, browser_process_hrtime_1.default)();
@@ -8138,7 +8370,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
8138
8370
  }
8139
8371
  exports.AvaliadorSintaticoPrisma = AvaliadorSintaticoPrisma;
8140
8372
 
8141
- },{"../../bibliotecas/primitivas-dicionario":29,"../../bibliotecas/primitivas-numero":30,"../../bibliotecas/primitivas-texto":31,"../../bibliotecas/primitivas-vetor":32,"../../construtos":62,"../../declaracoes":110,"../../inferenciador":137,"../../informacao-elemento-sintatico":138,"../../lexador":207,"../../tipos-de-simbolos/prisma":228,"../avaliador-sintatico-base":9,"../comum":11,"../informacao-escopo":22,"../pilha-escopos":26,"browser-process-hrtime":415}],16:[function(require,module,exports){
8373
+ },{"../../bibliotecas/primitivas-dicionario":29,"../../bibliotecas/primitivas-numero":30,"../../bibliotecas/primitivas-texto":31,"../../bibliotecas/primitivas-vetor":32,"../../construtos":62,"../../declaracoes":110,"../../inferenciador":137,"../../informacao-elemento-sintatico":138,"../../lexador":207,"../../tipos-de-simbolos/prisma":228,"../avaliador-sintatico-base":9,"../comum":11,"../erro-avaliador-sintatico":20,"../informacao-escopo":22,"../pilha-escopos":26,"browser-process-hrtime":415}],16:[function(require,module,exports){
8142
8374
  "use strict";
8143
8375
  var __importDefault = (this && this.__importDefault) || function (mod) {
8144
8376
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -24474,7 +24706,17 @@ class LexadorPrisma {
24474
24706
  this.avancar();
24475
24707
  break;
24476
24708
  case '.':
24477
- this.adicionarSimbolo(prisma_2.default.PONTO);
24709
+ this.avancar();
24710
+ if (this.simboloAtual() === '.') {
24711
+ this.avancar();
24712
+ this.adicionarSimbolo(prisma_2.default.CONCATENACAO);
24713
+ }
24714
+ else {
24715
+ this.adicionarSimbolo(prisma_2.default.PONTO);
24716
+ }
24717
+ break;
24718
+ case '#':
24719
+ this.adicionarSimbolo(prisma_2.default.COMPRIMENTO);
24478
24720
  this.avancar();
24479
24721
  break;
24480
24722
  case ';':
@@ -24485,6 +24727,10 @@ class LexadorPrisma {
24485
24727
  this.adicionarSimbolo(prisma_2.default.DOIS_PONTOS);
24486
24728
  this.avancar();
24487
24729
  break;
24730
+ case '?':
24731
+ this.adicionarSimbolo(prisma_2.default.INTERROGACAO);
24732
+ this.avancar();
24733
+ break;
24488
24734
  case '=':
24489
24735
  this.avancar();
24490
24736
  if (this.simboloAtual() === '=') {
@@ -24566,10 +24812,8 @@ class LexadorPrisma {
24566
24812
  case '/':
24567
24813
  this.avancar();
24568
24814
  if (this.simboloAtual() === '/') {
24569
- // Comentário de linha
24570
- while (this.simboloAtual() !== '\n' && !this.eFinalDoCodigo()) {
24571
- this.avancar();
24572
- }
24815
+ // Comentário de linha — ignorar até o final da linha
24816
+ this.atual = this.codigo[this.linha].length;
24573
24817
  }
24574
24818
  else if (this.simboloAtual() === '*') {
24575
24819
  // Comentário de bloco
@@ -24604,8 +24848,14 @@ class LexadorPrisma {
24604
24848
  this.avancar();
24605
24849
  break;
24606
24850
  case '~':
24607
- this.adicionarSimbolo(prisma_2.default.BIT_NOT);
24608
24851
  this.avancar();
24852
+ if (this.simboloAtual() === '=') {
24853
+ this.adicionarSimbolo(prisma_2.default.DIFERENTE);
24854
+ this.avancar();
24855
+ }
24856
+ else {
24857
+ this.adicionarSimbolo(prisma_2.default.BIT_XOR);
24858
+ }
24609
24859
  break;
24610
24860
  case '"':
24611
24861
  this.avancar();
@@ -25271,6 +25521,8 @@ exports.palavrasReservadas = {
25271
25521
  leia: prisma_1.default.LEIA,
25272
25522
  local: prisma_1.default.LOCAL,
25273
25523
  nulo: prisma_1.default.NULO,
25524
+ nao: prisma_1.default.NAO,
25525
+ não: prisma_1.default.NAO,
25274
25526
  ou: prisma_1.default.OU,
25275
25527
  padrao: prisma_1.default.PADRAO,
25276
25528
  padrão: prisma_1.default.PADRAO,
@@ -25282,6 +25534,7 @@ exports.palavrasReservadas = {
25282
25534
  senao: prisma_1.default.SENAO,
25283
25535
  senão: prisma_1.default.SENÃO,
25284
25536
  super: prisma_1.default.SUPER,
25537
+ quebra: prisma_1.default.QUEBRE,
25285
25538
  quebre: prisma_1.default.QUEBRE,
25286
25539
  tente: prisma_1.default.TENTE,
25287
25540
  verdadeiro: prisma_1.default.VERDADEIRO,
@@ -25779,13 +26032,13 @@ class Lexador {
25779
26032
  return this.codigo[this.linha].charAt(this.atual - 1);
25780
26033
  }
25781
26034
  analisarTexto(delimitador = '"') {
25782
- let textoCompleto = '';
26035
+ let valor = '';
25783
26036
  this.avancar();
25784
26037
  while (!this.eFinalDoCodigo()) {
25785
26038
  const caractere = this.simboloAtual();
25786
26039
  if (caractere === delimitador) {
25787
26040
  this.avancar();
25788
- this.adicionarSimbolo(delegua_1.default.TEXTO, textoCompleto.replace(/\\n/g, '\n'));
26041
+ this.adicionarSimbolo(delegua_1.default.TEXTO, valor);
25789
26042
  return;
25790
26043
  }
25791
26044
  if (caractere === '\0' && this.eUltimaLinha()) {
@@ -25797,11 +26050,62 @@ class Lexador {
25797
26050
  return;
25798
26051
  }
25799
26052
  if (caractere === '\0') {
25800
- textoCompleto += '\n';
26053
+ valor += '\n';
25801
26054
  this.avancar();
25802
26055
  continue;
25803
26056
  }
25804
- textoCompleto += caractere;
26057
+ if (caractere === '\\') {
26058
+ this.avancar();
26059
+ const proximoCaractere = this.simboloAtual();
26060
+ switch (proximoCaractere) {
26061
+ case 'n':
26062
+ valor += '\n';
26063
+ break;
26064
+ case 't':
26065
+ valor += '\t';
26066
+ break;
26067
+ case 'r':
26068
+ valor += '\r';
26069
+ break;
26070
+ case 'b':
26071
+ valor += '\b';
26072
+ break;
26073
+ case "'":
26074
+ valor += "'";
26075
+ break;
26076
+ case '"':
26077
+ valor += '"';
26078
+ break;
26079
+ case '\\':
26080
+ valor += '\\';
26081
+ break;
26082
+ case 'e':
26083
+ valor += '\x1B';
26084
+ break;
26085
+ case 'x': {
26086
+ let hex = '';
26087
+ for (let i = 0; i < 2; i++) {
26088
+ const c = this.proximoSimbolo();
26089
+ if (/[0-9a-fA-F]/.test(c)) {
26090
+ this.avancar();
26091
+ hex += c;
26092
+ }
26093
+ else {
26094
+ break;
26095
+ }
26096
+ }
26097
+ valor += hex.length === 2 ? String.fromCharCode(parseInt(hex, 16)) : '\\x' + hex;
26098
+ break;
26099
+ }
26100
+ case '\0': break; // barra invertida no fim de linha: ignora e continua na próxima linha
26101
+ default:
26102
+ valor += '\\' + proximoCaractere;
26103
+ break;
26104
+ }
26105
+ }
26106
+ else {
26107
+ valor += caractere;
26108
+ }
25805
26109
  this.avancar();
25806
26110
  }
25807
26111
  this.erros.push({
@@ -27597,6 +27901,7 @@ exports.default = {
27597
27901
  IGUAL_IGUAL: 'IGUAL_IGUAL',
27598
27902
  IMPORTAR: 'IMPORTAR',
27599
27903
  INICIO: 'INICIO',
27904
+ INTERROGACAO: 'INTERROGACAO',
27600
27905
  ISTO: 'ISTO',
27601
27906
  LEIA: 'LEIA',
27602
27907
  LOCAL: 'LOCAL',
@@ -27609,6 +27914,7 @@ exports.default = {
27609
27914
  MENOR_MENOR: 'MENOR_MENOR',
27610
27915
  MODULO: 'MODULO',
27611
27916
  MULTIPLICACAO: 'MULTIPLICACAO',
27917
+ NAO: 'NAO',
27612
27918
  NEGACAO: 'NEGACAO',
27613
27919
  NULO: 'NULO',
27614
27920
  NUMERO: 'NUMERO',
@@ -27620,6 +27926,8 @@ exports.default = {
27620
27926
  PEGUE: 'PEGUE',
27621
27927
  PONTO: 'PONTO',
27622
27928
  PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
27929
+ COMPRIMENTO: 'COMPRIMENTO',
27930
+ CONCATENACAO: 'CONCATENACAO',
27623
27931
  QUEBRA_LINHA: 'QUEBRA_LINHA',
27624
27932
  RETORNE: 'RETORNE',
27625
27933
  SE: 'SE',
@@ -43710,9 +44018,72 @@ class TradutorAssemblyScript {
43710
44018
  traduzirConstrutoAgrupamento(agrupamento) {
43711
44019
  return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
43712
44020
  }
44021
+ detectarImportacoesNecessarias(declaracoes) {
44022
+ const importsNecessarios = new Set();
44023
+ this.varrerDeclaracoesParaImports(declaracoes, importsNecessarios);
44024
+ if (importsNecessarios.size === 0) {
44025
+ return '';
44026
+ }
44027
+ return Array.from(importsNecessarios).join('\n') + '\n\n';
44028
+ }
44029
+ varrerDeclaracoesParaImports(declaracoes, imports) {
44030
+ for (const declaracao of declaracoes) {
44031
+ const nome = declaracao.constructor.name;
44032
+ if (nome === 'Escreva' || nome === 'EscrevaMesmaLinha') {
44033
+ imports.add('import "wasi";');
44034
+ }
44035
+ else if (nome === 'Bloco') {
44036
+ this.varrerDeclaracoesParaImports(declaracao.declaracoes, imports);
44037
+ }
44038
+ else if (nome === 'Se') {
44039
+ const se = declaracao;
44040
+ if (se.caminhoEntao) {
44041
+ this.varrerDeclaracoesParaImports([se.caminhoEntao], imports);
44042
+ }
44043
+ if (se.caminhoSenao) {
44044
+ this.varrerDeclaracoesParaImports([se.caminhoSenao], imports);
44045
+ }
44046
+ }
44047
+ else if (nome === 'Enquanto') {
44048
+ const enquanto = declaracao;
44049
+ this.varrerDeclaracoesParaImports([enquanto.corpo], imports);
44050
+ }
44051
+ else if (nome === 'Para') {
44052
+ const para = declaracao;
44053
+ this.varrerDeclaracoesParaImports([para.corpo], imports);
44054
+ }
44055
+ else if (nome === 'ParaCada') {
44056
+ const paraCada = declaracao;
44057
+ this.varrerDeclaracoesParaImports([paraCada.corpo], imports);
44058
+ }
44059
+ else if (nome === 'Fazer') {
44060
+ const fazer = declaracao;
44061
+ this.varrerDeclaracoesParaImports([fazer.caminhoFazer], imports);
44062
+ }
44063
+ else if (nome === 'FuncaoDeclaracao') {
44064
+ const funcao = declaracao;
44065
+ this.varrerDeclaracoesParaImports(funcao.funcao.corpo, imports);
44066
+ }
44067
+ else if (nome === 'Classe') {
44068
+ const classe = declaracao;
44069
+ this.varrerDeclaracoesParaImports(classe.metodos, imports);
44070
+ }
44071
+ else if (nome === 'Tente') {
44072
+ const tente = declaracao;
44073
+ this.varrerDeclaracoesParaImports(tente.caminhoTente, imports);
44074
+ if (Array.isArray(tente.caminhoPegue)) {
44075
+ this.varrerDeclaracoesParaImports(tente.caminhoPegue, imports);
44076
+ }
44077
+ if (tente.caminhoFinalmente && tente.caminhoFinalmente.length > 0) {
44078
+ this.varrerDeclaracoesParaImports(tente.caminhoFinalmente, imports);
44079
+ }
44080
+ }
44081
+ }
44082
+ }
43713
44083
  traduzir(declaracoes) {
43714
44084
  let resultado = '';
43715
44085
  this.declaracoesDeClasses = declaracoes.filter((declaracao) => declaracao instanceof declaracoes_1.Classe);
44086
+ resultado += this.detectarImportacoesNecessarias(declaracoes);
43716
44087
  for (const declaracao of declaracoes) {
43717
44088
  resultado += `${this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao)} \n`;
43718
44089
  }