@designliquido/delegua 0.63.0 → 0.64.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 (61) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +18 -1
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +129 -0
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/analisador-semantico/analisador-semantico.d.ts +38 -19
  6. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  7. package/analisador-semantico/analisador-semantico.js +353 -112
  8. package/analisador-semantico/analisador-semantico.js.map +1 -1
  9. package/analisador-semantico/escopo-variavel.d.ts +11 -0
  10. package/analisador-semantico/escopo-variavel.d.ts.map +1 -0
  11. package/analisador-semantico/escopo-variavel.js +3 -0
  12. package/analisador-semantico/escopo-variavel.js.map +1 -0
  13. package/analisador-semantico/funcao-hipotetica-interface.d.ts +5 -0
  14. package/analisador-semantico/funcao-hipotetica-interface.d.ts.map +1 -0
  15. package/analisador-semantico/funcao-hipotetica-interface.js +3 -0
  16. package/analisador-semantico/funcao-hipotetica-interface.js.map +1 -0
  17. package/analisador-semantico/gerenciador-escopos.d.ts +15 -0
  18. package/analisador-semantico/gerenciador-escopos.d.ts.map +1 -0
  19. package/analisador-semantico/gerenciador-escopos.js +77 -0
  20. package/analisador-semantico/gerenciador-escopos.js.map +1 -0
  21. package/analisador-semantico/index.d.ts +4 -0
  22. package/analisador-semantico/index.d.ts.map +1 -1
  23. package/analisador-semantico/index.js +4 -0
  24. package/analisador-semantico/index.js.map +1 -1
  25. package/analisador-semantico/variavel-hipotetica-interface.d.ts +7 -0
  26. package/analisador-semantico/variavel-hipotetica-interface.d.ts.map +1 -0
  27. package/analisador-semantico/variavel-hipotetica-interface.js +3 -0
  28. package/analisador-semantico/variavel-hipotetica-interface.js.map +1 -0
  29. package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
  30. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  31. package/avaliador-sintatico/avaliador-sintatico.js +49 -2
  32. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  33. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +4 -0
  34. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  35. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +91 -11
  36. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  37. package/bin/package.json +1 -1
  38. package/construtos/acesso-indice-variavel.d.ts +2 -1
  39. package/construtos/acesso-indice-variavel.d.ts.map +1 -1
  40. package/construtos/acesso-indice-variavel.js +3 -1
  41. package/construtos/acesso-indice-variavel.js.map +1 -1
  42. package/construtos/binario.d.ts +4 -0
  43. package/construtos/binario.d.ts.map +1 -1
  44. package/construtos/binario.js +7 -6
  45. package/construtos/binario.js.map +1 -1
  46. package/construtos/leia.d.ts +1 -1
  47. package/construtos/leia.d.ts.map +1 -1
  48. package/construtos/leia.js +1 -0
  49. package/construtos/leia.js.map +1 -1
  50. package/construtos/unario.d.ts +1 -0
  51. package/construtos/unario.d.ts.map +1 -1
  52. package/construtos/unario.js +2 -0
  53. package/construtos/unario.js.map +1 -1
  54. package/formatadores/formatador-pitugues.js +1 -1
  55. package/formatadores/formatador-pitugues.js.map +1 -1
  56. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts +0 -3
  57. package/lexador/dialetos/palavras-reservadas/pitugues.d.ts.map +1 -1
  58. package/lexador/dialetos/palavras-reservadas/pitugues.js +0 -3
  59. package/lexador/dialetos/palavras-reservadas/pitugues.js.map +1 -1
  60. package/package.json +1 -1
  61. package/umd/delegua.js +154 -24
package/umd/delegua.js CHANGED
@@ -705,6 +705,29 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
705
705
  }
706
706
  throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
707
707
  }
708
+ resolverTipoAcessoIndiceVariavel(expressaoAnterior) {
709
+ let identificadorAcessado = '';
710
+ switch (expressaoAnterior.constructor) {
711
+ case construtos_1.Variavel:
712
+ identificadorAcessado = expressaoAnterior.simbolo.lexema;
713
+ break;
714
+ default:
715
+ return 'qualquer';
716
+ }
717
+ // Primeiro verificar se é acesso a índice de vetor.
718
+ const tipoIdentificadorCorrespondente = this.pilhaEscopos.obterTipoVariavelPorNome(expressaoAnterior.simbolo.lexema);
719
+ if (!tipoIdentificadorCorrespondente.endsWith('[]') && !['dicionário', 'qualquer', 'texto', 'tupla', 'vetor'].includes(tipoIdentificadorCorrespondente)) {
720
+ throw this.erro(this.simbolos[this.atual], `Tipo ${tipoIdentificadorCorrespondente} não suporta acesso por índice.`);
721
+ }
722
+ let tipoAcesso = 'qualquer';
723
+ if (tipoIdentificadorCorrespondente.endsWith('[]')) {
724
+ tipoAcesso = tipoIdentificadorCorrespondente.replace('[]', '');
725
+ }
726
+ else {
727
+ tipoAcesso = 'qualquer';
728
+ }
729
+ return tipoAcesso;
730
+ }
708
731
  resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
709
732
  if (!this.simbolos[this.atual]) {
710
733
  return expressaoAnterior;
@@ -733,10 +756,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
733
756
  const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
734
757
  return this.resolverCadeiaChamadas(acesso, tipoInferido);
735
758
  case delegua_2.default.COLCHETE_ESQUERDO:
759
+ const tipoAcesso = this.resolverTipoAcessoIndiceVariavel(expressaoAnterior);
736
760
  this.avancarEDevolverAnterior();
737
761
  const indice = this.expressao();
738
762
  const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
739
- const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento);
763
+ const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento, tipoAcesso);
740
764
  return this.resolverCadeiaChamadas(acessoVariavel);
741
765
  default:
742
766
  return expressaoAnterior;
@@ -931,11 +955,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
931
955
  }
932
956
  return expressao;
933
957
  }
958
+ verificacaoOperacoesBinariasIlegais(esquerdo, direito, operador) {
959
+ if (esquerdo.tipo === 'vetor' || esquerdo.tipo.endsWith('[]')) {
960
+ if (['dicionario', 'dicionário', 'nulo'].includes(direito.tipo)) {
961
+ throw this.erro(operador, `Operação inválida: não é possível realizar operação ${operador.lexema} entre vetor e ${direito.tipo}.`);
962
+ }
963
+ }
964
+ if (direito.tipo === 'vetor' || direito.tipo.endsWith('[]')) {
965
+ if (['dicionario', 'dicionário', 'nulo'].includes(esquerdo.tipo)) {
966
+ throw this.erro(operador, `Operação inválida: não é possível realizar operação ${operador.lexema} entre vetor e ${esquerdo.tipo}.`);
967
+ }
968
+ }
969
+ if (esquerdo.tipo === 'dicionario' || esquerdo.tipo === 'dicionário') {
970
+ if (['vetor', 'nulo'].includes(direito.tipo)) {
971
+ throw this.erro(operador, `Operação inválida: não é possível realizar operação ${operador.lexema} entre dicionário e ${direito.tipo}.`);
972
+ }
973
+ }
974
+ if (direito.tipo === 'dicionario' || direito.tipo === 'dicionário') {
975
+ if (['vetor', 'nulo'].includes(esquerdo.tipo)) {
976
+ throw this.erro(operador, `Operação inválida: não é possível realizar operação ${operador.lexema} entre dicionário e ${esquerdo.tipo}.`);
977
+ }
978
+ }
979
+ }
934
980
  multiplicar() {
935
981
  let expressao = this.exponenciacao();
936
982
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
937
983
  const operador = this.simbolos[this.atual - 1];
938
984
  const direito = this.exponenciacao();
985
+ this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
939
986
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
940
987
  }
941
988
  return expressao;
@@ -950,7 +997,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
950
997
  while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MENOS_IGUAL)) {
951
998
  const operador = this.simbolos[this.atual - 1];
952
999
  const direito = this.multiplicar();
953
- // const tipoInferido = inferirTipoParaBinario(expressao, operador, direito);
1000
+ this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
954
1001
  expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
955
1002
  }
956
1003
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIS_IGUAL)) {
@@ -3376,6 +3423,75 @@ class AvaliadorSintaticoPitugues {
3376
3423
  declaracaoDeVariavel() {
3377
3424
  throw new Error('Método não implementado.');
3378
3425
  }
3426
+ variavelJaDeclarada(nome) {
3427
+ try {
3428
+ this.pilhaEscopos.obterTipoVariavelPorNome(nome);
3429
+ return true;
3430
+ }
3431
+ catch (_a) {
3432
+ return false;
3433
+ }
3434
+ }
3435
+ declaracaoImplicita() {
3436
+ const identificador = this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado nome de variável.');
3437
+ this.consumir(pitugues_2.default.IGUAL, "Esperado '=' após identificador.");
3438
+ if (this.estaNoFinal()) {
3439
+ throw this.erro(this.simboloAnterior(), 'Esperado valor após o símbolo de igual.');
3440
+ }
3441
+ const valor = this.expressao();
3442
+ const tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(valor, 'qualquer');
3443
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
3444
+ return new declaracoes_1.Var(identificador, valor, tipo);
3445
+ }
3446
+ temPadraoMultiplaAtribuicao() {
3447
+ // Verifica padrão: IDENTIFICADOR, VIRGULA, IDENTIFICADOR, ..., IGUAL
3448
+ let pos = this.atual;
3449
+ let contadorIdentificadores = 0;
3450
+ while (pos < this.simbolos.length) {
3451
+ if (this.simbolos[pos].tipo === pitugues_2.default.IDENTIFICADOR) {
3452
+ contadorIdentificadores++;
3453
+ pos++;
3454
+ if (pos >= this.simbolos.length)
3455
+ return false;
3456
+ // Se encontrou =, verifica se tinha mais de 1 identificador
3457
+ if (this.simbolos[pos].tipo === pitugues_2.default.IGUAL) {
3458
+ return contadorIdentificadores > 1;
3459
+ }
3460
+ // Se não é vírgula, não é padrão múltiplo
3461
+ if (this.simbolos[pos].tipo !== pitugues_2.default.VIRGULA) {
3462
+ return false;
3463
+ }
3464
+ pos++;
3465
+ continue;
3466
+ }
3467
+ break;
3468
+ }
3469
+ return false;
3470
+ }
3471
+ temPadraoVarComoPalavraChave() {
3472
+ // Verifica padrão: var identificador = ...
3473
+ var _a;
3474
+ if (this.simbolos[this.atual].lexema !== 'var') {
3475
+ return false;
3476
+ }
3477
+ // Exemplos permitidos: var = 10 | var, a = 10, 20
3478
+ if (((_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo) !== pitugues_2.default.IDENTIFICADOR) {
3479
+ return false;
3480
+ }
3481
+ let pos = this.atual + 1;
3482
+ while (pos < this.simbolos.length) {
3483
+ if (this.simbolos[pos].tipo === pitugues_2.default.IGUAL) {
3484
+ return true; // Encontrou padrão var identificador = ...
3485
+ }
3486
+ // Se encontrou algo que não seja IDENTIFICADOR ou VIRGULA, não é o padrão
3487
+ if (this.simbolos[pos].tipo !== pitugues_2.default.IDENTIFICADOR &&
3488
+ this.simbolos[pos].tipo !== pitugues_2.default.VIRGULA) {
3489
+ return false;
3490
+ }
3491
+ pos++;
3492
+ }
3493
+ return false;
3494
+ }
3379
3495
  declaracaoDeVariaveis() {
3380
3496
  const identificadores = [];
3381
3497
  let retorno = [];
@@ -3383,14 +3499,7 @@ class AvaliadorSintaticoPitugues {
3383
3499
  do {
3384
3500
  identificadores.push(this.consumir(pitugues_2.default.IDENTIFICADOR, 'Esperado nome de variável.'));
3385
3501
  } while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.VIRGULA));
3386
- if (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.IGUAL)) {
3387
- // Inicialização de variáveis sem valor.
3388
- for (let [indice, identificador] of identificadores.entries()) {
3389
- retorno.push(new declaracoes_1.Var(identificador, null));
3390
- }
3391
- this.verificarSeSimboloAtualEIgualA(pitugues_2.default.PONTO_E_VIRGULA);
3392
- return retorno;
3393
- }
3502
+ this.consumir(pitugues_2.default.IGUAL, 'Esperado o símbolo igual(=) após identificador.');
3394
3503
  const inicializadores = [];
3395
3504
  do {
3396
3505
  inicializadores.push(this.expressao());
@@ -4158,7 +4267,9 @@ class AvaliadorSintaticoPitugues {
4158
4267
  const possivelDocumentacao = this.declaracaoTextoDeDocumentacao();
4159
4268
  const metodos = [];
4160
4269
  const propriedades = [];
4270
+ const indentacaoLinha = this.localizacoes[this.simboloAtual().linha].espacosIndentacao;
4161
4271
  while (!this.estaNoFinal() &&
4272
+ this.localizacoes[this.simboloAtual().linha].espacosIndentacao === indentacaoLinha &&
4162
4273
  this.verificarSeSimboloAtualEIgualA(pitugues_2.default.CONSTRUTOR, pitugues_2.default.FUNCAO, pitugues_2.default.FUNÇÃO, pitugues_2.default.IDENTIFICADOR)) {
4163
4274
  const simboloAnterior = this.simbolos[this.atual - 1];
4164
4275
  if (simboloAnterior.tipo === pitugues_2.default.IDENTIFICADOR) {
@@ -4235,6 +4346,25 @@ class AvaliadorSintaticoPitugues {
4235
4346
  }
4236
4347
  }
4237
4348
  resolverDeclaracao() {
4349
+ var _a;
4350
+ // Detecção de declaração implícita
4351
+ if (this.simbolos[this.atual].tipo === pitugues_2.default.IDENTIFICADOR) {
4352
+ // Detecta e bloqueia "var x = 10"
4353
+ if (this.temPadraoVarComoPalavraChave()) {
4354
+ throw this.erro(this.simbolos[this.atual], 'Palavra "var" não pode ser usada como palavra-chave para declaração. Use declarações implícitas: "x = 10" em vez de "var x = 10".');
4355
+ }
4356
+ // Verifica se é múltipla atribuição (a, b, c = 1, 2, 3)
4357
+ if (this.temPadraoMultiplaAtribuicao()) {
4358
+ return this.declaracaoDeVariaveis();
4359
+ }
4360
+ // Verifica se é atribuição simples (a = 1)
4361
+ if (((_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo) === pitugues_2.default.IGUAL) {
4362
+ const nomeVariavel = this.simbolos[this.atual].lexema;
4363
+ if (!this.variavelJaDeclarada(nomeVariavel)) {
4364
+ return this.declaracaoImplicita();
4365
+ }
4366
+ }
4367
+ }
4238
4368
  switch (this.simbolos[this.atual].tipo) {
4239
4369
  case pitugues_2.default.COMENTARIO:
4240
4370
  return this.declaracaoComentario();
@@ -4279,9 +4409,6 @@ class AvaliadorSintaticoPitugues {
4279
4409
  return this.declaracaoTente();
4280
4410
  case pitugues_2.default.TEXTO_MULTILINHAS:
4281
4411
  return this.declaracaoTextoDeDocumentacao();
4282
- case pitugues_2.default.VARIAVEL:
4283
- this.avancarEDevolverAnterior();
4284
- return this.declaracaoDeVariaveis();
4285
4412
  }
4286
4413
  return this.declaracaoExpressao();
4287
4414
  }
@@ -8616,12 +8743,14 @@ exports.AcessoIndiceVariavel = void 0;
8616
8743
  * vetores e dicionários.
8617
8744
  */
8618
8745
  class AcessoIndiceVariavel {
8619
- constructor(hashArquivo, entidadeChamada, indice, simboloFechamento) {
8746
+ constructor(hashArquivo, entidadeChamada, indice, simboloFechamento, tipo = 'qualquer') {
8747
+ this.tipo = 'qualquer';
8620
8748
  this.linha = entidadeChamada.linha;
8621
8749
  this.hashArquivo = hashArquivo;
8622
8750
  this.entidadeChamada = entidadeChamada;
8623
8751
  this.indice = indice;
8624
8752
  this.simboloFechamento = simboloFechamento;
8753
+ this.tipo = tipo;
8625
8754
  }
8626
8755
  async aceitar(visitante) {
8627
8756
  return await visitante.visitarExpressaoAcessoIndiceVariavel(this);
@@ -8904,21 +9033,22 @@ class Binario {
8904
9033
  this.direita = direita;
8905
9034
  this.tipo = this.deduzirTipo();
8906
9035
  }
9036
+ /**
9037
+ * Dedução otimista de tipos para expressões binárias.
9038
+ * @returns O tipo deduzido.
9039
+ */
8907
9040
  deduzirTipo() {
8908
9041
  if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
8909
9042
  ['logico', 'lógico'].includes(this.direita.tipo)) {
8910
9043
  return 'lógico';
8911
9044
  }
8912
- if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
8913
- return 'texto';
8914
- }
8915
- if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
8916
- return 'inteiro';
8917
- }
8918
9045
  if (['numero', 'número'].includes(this.esquerda.tipo) ||
8919
9046
  ['numero', 'número'].includes(this.direita.tipo)) {
8920
9047
  return 'número';
8921
9048
  }
9049
+ if (this.esquerda.tipo === this.direita.tipo) {
9050
+ return this.esquerda.tipo;
9051
+ }
8922
9052
  return 'qualquer';
8923
9053
  }
8924
9054
  async aceitar(visitante) {
@@ -9428,6 +9558,7 @@ const geracao_identificadores_1 = require("../geracao-identificadores");
9428
9558
  */
9429
9559
  class Leia {
9430
9560
  constructor(simbolo, argumentos) {
9561
+ this.tipo = 'texto';
9431
9562
  this.linha = simbolo.linha;
9432
9563
  this.hashArquivo = simbolo.hashArquivo;
9433
9564
  this.simbolo = simbolo;
@@ -10110,11 +10241,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
10110
10241
  exports.Unario = void 0;
10111
10242
  class Unario {
10112
10243
  constructor(hashArquivo, operador, operando, incidenciaOperador = 'ANTES') {
10244
+ this.tipo = 'qualquer';
10113
10245
  this.linha = operador.linha;
10114
10246
  this.hashArquivo = hashArquivo;
10115
10247
  this.operador = operador;
10116
10248
  this.operando = operando;
10117
10249
  this.incidenciaOperador = incidenciaOperador;
10250
+ this.tipo = operando.tipo;
10118
10251
  }
10119
10252
  async aceitar(visitante) {
10120
10253
  return await visitante.visitarExpressaoUnaria(this);
@@ -11817,7 +11950,7 @@ class FormatadorPitugues {
11817
11950
  this.códigoFormatado += `'''${declaracao.conteudo}'''`;
11818
11951
  }
11819
11952
  async visitarDeclaracaoVar(declaração) {
11820
- this.códigoFormatado += this.indentar() + `var ${declaração.simbolo.lexema} = `;
11953
+ this.códigoFormatado += this.indentar() + `${declaração.simbolo.lexema} = `;
11821
11954
  if (declaração.inicializador) {
11822
11955
  this.códigoFormatado += await declaração.inicializador.aceitar(this);
11823
11956
  }
@@ -18373,9 +18506,6 @@ exports.palavrasReservadasPitugues = {
18373
18506
  tendo: pitugues_1.default.TENDO,
18374
18507
  tente: pitugues_1.default.TENTE,
18375
18508
  tipo: pitugues_1.default.TIPO,
18376
- var: pitugues_1.default.VARIAVEL,
18377
- variavel: pitugues_1.default.VARIAVEL,
18378
- variável: pitugues_1.default.VARIAVEL,
18379
18509
  verdadeiro: pitugues_1.default.VERDADEIRO,
18380
18510
  };
18381
18511
  exports.palavrasReservadasMicroGramatica = {