@designliquido/delegua 1.23.3 → 1.23.5

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 (43) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +1 -3
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +3 -0
  5. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico-base.js +16 -5
  7. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.js +45 -23
  11. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +9 -6
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +98 -27
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  16. package/bin/package.json +1 -1
  17. package/construtos/binario.d.ts.map +1 -1
  18. package/construtos/binario.js +15 -0
  19. package/construtos/binario.js.map +1 -1
  20. package/interpretador/depuracao/comum.js +1 -1
  21. package/interpretador/depuracao/comum.js.map +1 -1
  22. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +2 -2
  23. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  24. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +15 -25
  25. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  26. package/interpretador/estruturas/delegua-funcao.d.ts +1 -1
  27. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  28. package/interpretador/estruturas/delegua-funcao.js +21 -8
  29. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  30. package/interpretador/interpretador-base.d.ts +10 -1
  31. package/interpretador/interpretador-base.d.ts.map +1 -1
  32. package/interpretador/interpretador-base.js +92 -31
  33. package/interpretador/interpretador-base.js.map +1 -1
  34. package/interpretador/interpretador.d.ts +2 -7
  35. package/interpretador/interpretador.d.ts.map +1 -1
  36. package/interpretador/interpretador.js +41 -47
  37. package/interpretador/interpretador.js.map +1 -1
  38. package/lexador/lexador.d.ts +15 -13
  39. package/lexador/lexador.d.ts.map +1 -1
  40. package/lexador/lexador.js +52 -17
  41. package/lexador/lexador.js.map +1 -1
  42. package/package.json +1 -1
  43. package/umd/delegua.js +384 -164
package/umd/delegua.js CHANGED
@@ -712,9 +712,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
712
712
  }
713
713
  async visitarExpressaoDeChamada(expressao) {
714
714
  for (const argumento of expressao.argumentos) {
715
- if (argumento instanceof construtos_1.Variavel) {
716
- this.gerenciadorEscopos.marcarComoUsada(argumento.simbolo.lexema);
717
- }
715
+ this.marcarVariaveisUsadasEmExpressao(argumento);
718
716
  }
719
717
  switch (expressao.entidadeChamada.constructor) {
720
718
  case construtos_1.AcessoMetodo:
@@ -2247,15 +2245,26 @@ class AvaliadorSintaticoBase {
2247
2245
  declaracaoDeVariaveis() {
2248
2246
  throw new Error('Método não implementado.');
2249
2247
  }
2250
- async comparar() {
2251
- let expressao = await this.adicaoOuSubtracao();
2248
+ validacaoComparacao(operador, esquerda, direita) { }
2249
+ criarConstrutoComparacao(esquerda, operador, direita) {
2250
+ return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
2251
+ }
2252
+ async logicaComumComparacao(metodoProximoNivel) {
2253
+ let expressao = await metodoProximoNivel();
2252
2254
  while (this.verificarSeSimboloAtualEIgualA(comum_1.default.MAIOR, comum_1.default.MAIOR_IGUAL, comum_1.default.MENOR, comum_1.default.MENOR_IGUAL)) {
2253
- const operador = this.simbolos[this.atual - 1];
2254
- const direito = await this.adicaoOuSubtracao();
2255
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
2255
+ const operador = this.simboloAnterior
2256
+ ? this.simboloAnterior()
2257
+ : this.simbolos[this.atual - 1];
2258
+ const esquerda = expressao;
2259
+ const direita = await metodoProximoNivel();
2260
+ this.validacaoComparacao(operador, esquerda, direita);
2261
+ expressao = this.criarConstrutoComparacao(esquerda, operador, direita);
2256
2262
  }
2257
2263
  return expressao;
2258
2264
  }
2265
+ async comparar() {
2266
+ return await this.logicaComumComparacao(() => this.adicaoOuSubtracao());
2267
+ }
2259
2268
  async comparacaoIgualdade() {
2260
2269
  let expressao = await this.comparar();
2261
2270
  while (this.verificarSeSimboloAtualEIgualA(comum_1.default.DIFERENTE, comum_1.default.IGUAL, comum_1.default.IGUAL_IGUAL)) {
@@ -2775,7 +2784,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2775
2784
  this.avancarEDevolverAnterior();
2776
2785
  valores = [];
2777
2786
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
2778
- return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), [], 'qualquer[]');
2787
+ return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 'qualquer[]');
2779
2788
  }
2780
2789
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
2781
2790
  return this.construtoTupla();
@@ -2810,21 +2819,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2810
2819
  const valoresSemComentarios = valores.filter((v) => v.constructor !== construtos_1.ComentarioComoConstruto);
2811
2820
  let elementoSeparador = false; // O primeiro elemento não pode ser separador.
2812
2821
  for (const elemento of valoresSemComentarios) {
2822
+ const simboloErro = elemento.simbolo || simboloAtual;
2813
2823
  if (elementoSeparador) {
2814
2824
  if (elemento.constructor !== construtos_1.Separador) {
2815
- throw this.erro(elemento.simbolo, 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
2825
+ throw this.erro(simboloErro, 'Os itens dos vetores devem ser separados através de uma vírgula.');
2816
2826
  }
2817
2827
  elementoSeparador = false;
2818
2828
  }
2819
2829
  else {
2820
2830
  if (elemento.constructor === construtos_1.Separador) {
2821
- throw this.erro(elemento.simbolo, 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
2831
+ throw this.erro(simboloErro, 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
2822
2832
  }
2823
2833
  elementoSeparador = true;
2824
2834
  }
2825
2835
  }
2826
2836
  const valoresSemSeparadores = valoresSemComentarios.filter((v) => v.constructor !== construtos_1.Separador);
2827
- const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresSemSeparadores);
2837
+ let tipoVetor;
2838
+ if (valoresSemSeparadores.length === 0) {
2839
+ tipoVetor = 'qualquer[]';
2840
+ }
2841
+ else {
2842
+ const primeiroElemento = valoresSemSeparadores[0];
2843
+ if (primeiroElemento instanceof construtos_1.Vetor) {
2844
+ tipoVetor = primeiroElemento.tipo + '[]';
2845
+ }
2846
+ else {
2847
+ tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresSemSeparadores);
2848
+ }
2849
+ }
2828
2850
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, tipoVetor);
2829
2851
  case delegua_2.default.ENQUANTO:
2830
2852
  this.avancarEDevolverAnterior();
@@ -3509,16 +3531,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3509
3531
  }
3510
3532
  return expressao;
3511
3533
  }
3534
+ validacaoComparacao(operador, esquerda, direita) {
3535
+ this.verificarOperandosComparacao(operador, esquerda, direita);
3536
+ }
3537
+ criarConstrutoComparacao(esquerda, operador, direita) {
3538
+ return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
3539
+ }
3512
3540
  async comparar() {
3513
- let expressao = await this.bitOu();
3514
- while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
3515
- const operador = this.simbolos[this.atual - 1];
3516
- const esquerda = expressao;
3517
- const direito = await this.bitOu();
3518
- this.verificarOperandosComparacao(operador, esquerda, direito);
3519
- expressao = new construtos_1.Binario(this.hashArquivo, esquerda, operador, direito);
3520
- }
3521
- return expressao;
3541
+ return await this.logicaComumComparacao(() => this.bitOu());
3522
3542
  }
3523
3543
  async comparacaoIgualdade() {
3524
3544
  let expressao = await this.comparar();
@@ -4241,17 +4261,28 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4241
4261
  }
4242
4262
  switch (inicializador.constructor) {
4243
4263
  case construtos_1.AcessoIndiceVariavel:
4244
- const entidadeChamadaAcessoIndiceVariavel = inicializador
4245
- .entidadeChamada;
4246
- // Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
4247
- if (entidadeChamadaAcessoIndiceVariavel.constructor === construtos_1.AcessoIndiceVariavel) {
4248
- return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
4249
- }
4250
- const tipoEntidadeChamadaAcessoIndiceVariavel = entidadeChamadaAcessoIndiceVariavel.tipo;
4251
- if (tipoEntidadeChamadaAcessoIndiceVariavel.endsWith('[]')) {
4252
- return tipoEntidadeChamadaAcessoIndiceVariavel.slice(0, -2);
4264
+ const acessoAtual = inicializador;
4265
+ let entidade = acessoAtual.entidadeChamada;
4266
+ let numeroIndices = 1;
4267
+ // Percorre a cadeia de acessos aninhados para contar quantos índices existem
4268
+ // Cada índice consome um nível de vetor, então removemos um '[]' por acesso.
4269
+ while (entidade.constructor === construtos_1.AcessoIndiceVariavel) {
4270
+ numeroIndices++;
4271
+ entidade = entidade
4272
+ .entidadeChamada;
4273
+ }
4274
+ const tipoBase = entidade.tipo;
4275
+ if (tipoBase.endsWith('[]')) {
4276
+ let tipoResultante = tipoBase;
4277
+ for (let i = 0; i < numeroIndices; i++) {
4278
+ if (tipoResultante.endsWith('[]')) {
4279
+ tipoResultante = tipoResultante.slice(0, -2);
4280
+ }
4281
+ else
4282
+ break;
4283
+ }
4284
+ return tipoResultante;
4253
4285
  }
4254
- // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
4255
4286
  return 'qualquer';
4256
4287
  case construtos_1.Chamada:
4257
4288
  const entidadeChamadaChamada = inicializador.entidadeChamada;
@@ -6312,6 +6343,7 @@ const primitivas_numero_1 = __importDefault(require("../../bibliotecas/primitiva
6312
6343
  const primitivas_texto_1 = __importDefault(require("../../bibliotecas/primitivas-texto"));
6313
6344
  const primitivas_vetor_1 = __importDefault(require("../../bibliotecas/primitivas-vetor"));
6314
6345
  const primitivas_tupla_1 = __importDefault(require("../../bibliotecas/dialetos/pitugues/primitivas-tupla"));
6346
+ const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
6315
6347
  /**
6316
6348
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
6317
6349
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -6320,8 +6352,9 @@ const primitivas_tupla_1 = __importDefault(require("../../bibliotecas/dialetos/p
6320
6352
  * A grande diferença entre este avaliador e os demais é a forma como são entendidos os blocos de escopo.
6321
6353
  * Este avaliador espera uma estrutura de pragmas, que explica quantos espaços há na frente de cada linha.
6322
6354
  */
6323
- class AvaliadorSintaticoPitugues {
6355
+ class AvaliadorSintaticoPitugues extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
6324
6356
  constructor(performance = false) {
6357
+ super();
6325
6358
  this.atual = 0;
6326
6359
  this.blocos = 0;
6327
6360
  this.performance = performance;
@@ -6374,14 +6407,27 @@ class AvaliadorSintaticoPitugues {
6374
6407
  return tipoPrevio;
6375
6408
  switch (inicializador.constructor) {
6376
6409
  case construtos_1.AcessoIndiceVariavel:
6377
- const entidadeChamadaAcessoIndiceVariavel = inicializador
6378
- .entidadeChamada;
6379
- // Este condicional ocorre com chamadas aninhadas. Por exemplo, `vetor[1][2]`.
6380
- if (entidadeChamadaAcessoIndiceVariavel.constructor === construtos_1.AcessoIndiceVariavel) {
6381
- return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipoPrevio);
6382
- }
6383
- if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
6384
- return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
6410
+ const acessoAtual = inicializador;
6411
+ let entidade = acessoAtual.entidadeChamada;
6412
+ let numeroIndices = 1;
6413
+ // Percorre acessos aninhados como `vetor[1][2]` contando quantos índices foram aplicados.
6414
+ // Cada índice consome um nível de vetor, então removemos um '[]' por acesso.
6415
+ while (entidade.constructor === construtos_1.AcessoIndiceVariavel) {
6416
+ numeroIndices++;
6417
+ entidade = entidade
6418
+ .entidadeChamada;
6419
+ }
6420
+ const tipoBase = entidade.tipo;
6421
+ if (tipoBase.endsWith('[]')) {
6422
+ let tipoResultante = tipoBase;
6423
+ for (let i = 0; i < numeroIndices; i++) {
6424
+ if (tipoResultante.endsWith('[]')) {
6425
+ tipoResultante = tipoResultante.slice(0, -2);
6426
+ }
6427
+ else
6428
+ break;
6429
+ }
6430
+ return tipoResultante;
6385
6431
  }
6386
6432
  // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
6387
6433
  return 'qualquer';
@@ -6807,6 +6853,9 @@ class AvaliadorSintaticoPitugues {
6807
6853
  if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
6808
6854
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 'qualquer[]');
6809
6855
  }
6856
+ if (this.verificarTipoSimboloAtual(pitugues_2.default.VIRGULA)) {
6857
+ throw this.erro(this.simboloAtual(), 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
6858
+ }
6810
6859
  // Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
6811
6860
  // de lista serão tratados como 'qualquer', para evitar erros de tipo.
6812
6861
  this.intuirTipoQualquerParaIdentificadores = true;
@@ -6817,13 +6866,35 @@ class AvaliadorSintaticoPitugues {
6817
6866
  }
6818
6867
  // Aqui já sabemos que não é uma compreensão de lista.
6819
6868
  const valoresVetor = [retornoExpressaoOuPrimeiroValor];
6869
+ this.ignorarComentarios();
6820
6870
  while (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
6821
- this.consumir(pitugues_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
6822
- this.ignorarComentarios();
6823
- valoresVetor.push(await this.atribuir());
6824
- this.ignorarComentarios();
6871
+ if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.VIRGULA)) {
6872
+ this.ignorarComentarios();
6873
+ if (this.verificarTipoSimboloAtual(pitugues_2.default.VIRGULA)) {
6874
+ throw this.erro(this.simboloAtual(), 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
6875
+ }
6876
+ }
6877
+ else {
6878
+ throw this.erro(this.simboloAtual() || simboloAtual, 'Os itens dos vetores devem ser separados através de uma vírgula.');
6879
+ }
6880
+ if (!this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO)) {
6881
+ valoresVetor.push(await this.atribuir());
6882
+ this.ignorarComentarios();
6883
+ }
6884
+ }
6885
+ let tipoVetor;
6886
+ if (valoresVetor.length === 0) {
6887
+ tipoVetor = 'qualquer[]';
6888
+ }
6889
+ else {
6890
+ const primeiroElemento = valoresVetor[0];
6891
+ if (primeiroElemento instanceof construtos_1.Vetor) {
6892
+ tipoVetor = primeiroElemento.tipo + '[]';
6893
+ }
6894
+ else {
6895
+ tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresVetor);
6896
+ }
6825
6897
  }
6826
- const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresVetor);
6827
6898
  return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, valoresVetor, tipoVetor);
6828
6899
  case pitugues_2.default.COMENTARIO:
6829
6900
  const simboloComentario = this.avancarEDevolverAnterior();
@@ -7048,14 +7119,42 @@ class AvaliadorSintaticoPitugues {
7048
7119
  }
7049
7120
  return expressao;
7050
7121
  }
7051
- async comparar() {
7052
- let expressao = await this.bitOu();
7053
- while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.MAIOR, pitugues_2.default.MAIOR_IGUAL, pitugues_2.default.MENOR, pitugues_2.default.MENOR_IGUAL)) {
7054
- const operador = this.simboloAnterior();
7055
- const direito = await this.bitOu();
7056
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
7122
+ eOperadorDeComparacao(tipo) {
7123
+ return [
7124
+ pitugues_2.default.MAIOR,
7125
+ pitugues_2.default.MAIOR_IGUAL,
7126
+ pitugues_2.default.MENOR,
7127
+ pitugues_2.default.MENOR_IGUAL
7128
+ ].includes(tipo);
7129
+ }
7130
+ criarConstrutoComparacao(esquerda, operador, direita) {
7131
+ let operandoCentral = null;
7132
+ // Lógica de desugaring para comparações encadeadas (ex: 1 < x < 10)
7133
+ if (esquerda instanceof construtos_1.Binario &&
7134
+ this.eOperadorDeComparacao(esquerda.operador.tipo)) {
7135
+ operandoCentral = esquerda.direita;
7136
+ }
7137
+ else if (esquerda instanceof construtos_1.Logico &&
7138
+ esquerda.direita instanceof construtos_1.Binario &&
7139
+ this.eOperadorDeComparacao(esquerda.direita.operador.tipo)) {
7140
+ operandoCentral = esquerda.direita.direita;
7141
+ }
7142
+ if (operandoCentral !== null) {
7143
+ const operadorE = {
7144
+ tipo: pitugues_2.default.E,
7145
+ lexema: 'e',
7146
+ literal: null,
7147
+ linha: operador.linha,
7148
+ hashArquivo: this.hashArquivo
7149
+ };
7150
+ const novaComparacaoDireita = new construtos_1.Binario(this.hashArquivo, operandoCentral, operador, direita);
7151
+ return new construtos_1.Logico(this.hashArquivo, esquerda, operadorE, novaComparacaoDireita);
7057
7152
  }
7058
- return expressao;
7153
+ // Se não for encadeada, cria o Binário normal
7154
+ return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
7155
+ }
7156
+ async comparar() {
7157
+ return await this.logicaComumComparacao(() => this.bitOu());
7059
7158
  }
7060
7159
  async comparacaoIgualdade() {
7061
7160
  let expressao = await this.comparar();
@@ -7198,7 +7297,10 @@ class AvaliadorSintaticoPitugues {
7198
7297
  }
7199
7298
  return expressao;
7200
7299
  }
7201
- async declaracaoEscreva(simboloEscreva) {
7300
+ async declaracaoEscreva() {
7301
+ const simboloEscreva = this.simboloAnterior
7302
+ ? this.simboloAnterior()
7303
+ : this.simbolos[this.atual - 1];
7202
7304
  this.consumir(pitugues_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
7203
7305
  const argumentos = [];
7204
7306
  do {
@@ -7780,10 +7882,10 @@ class AvaliadorSintaticoPitugues {
7780
7882
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
7781
7883
  return definicaoClasse;
7782
7884
  }
7783
- declaracaoFalhar() {
7885
+ async declaracaoFalhar() {
7784
7886
  const simboloFalha = this.simbolos[this.atual - 1];
7785
- const textoFalha = this.consumir(pitugues_2.default.TEXTO, 'Esperado texto para explicar falha.');
7786
- return new declaracoes_1.Falhar(simboloFalha, textoFalha.literal);
7887
+ const explicacao = await this.atribuir();
7888
+ return new declaracoes_1.Falhar(simboloFalha, explicacao);
7787
7889
  }
7788
7890
  /**
7789
7891
  * Verifica se há pontos e vírgula no final de sentenças.
@@ -7889,11 +7991,11 @@ class AvaliadorSintaticoPitugues {
7889
7991
  return this.declaracaoEscolha();
7890
7992
  case pitugues_2.default.IMPRIMA:
7891
7993
  case pitugues_2.default.ESCREVA:
7892
- const simboloEscrevaOuImprima = this.avancarEDevolverAnterior();
7893
- return this.declaracaoEscreva(simboloEscrevaOuImprima);
7994
+ this.avancarEDevolverAnterior();
7995
+ return this.declaracaoEscreva();
7894
7996
  case pitugues_2.default.FALHAR:
7895
7997
  this.avancarEDevolverAnterior();
7896
- return this.declaracaoFalhar();
7998
+ return await this.declaracaoFalhar();
7897
7999
  case pitugues_2.default.FAZER:
7898
8000
  this.avancarEDevolverAnterior();
7899
8001
  return this.declaracaoFazer();
@@ -8108,7 +8210,7 @@ class AvaliadorSintaticoPitugues {
8108
8210
  }
8109
8211
  exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
8110
8212
 
8111
- },{"../../bibliotecas/dialetos/pitugues/primitivas-tupla":30,"../../bibliotecas/primitivas-dicionario":31,"../../bibliotecas/primitivas-numero":32,"../../bibliotecas/primitivas-texto":33,"../../bibliotecas/primitivas-vetor":34,"../../construtos":67,"../../declaracoes":116,"../../inferenciador":146,"../../informacao-elemento-sintatico":147,"../../lexador":238,"../../lexador/micro-lexador-pitugues":243,"../../tipos-de-dados/dialetos/pitugues":249,"../../tipos-de-simbolos/pitugues":257,"../comum":12,"../erro-avaliador-sintatico":21,"../informacao-escopo":23,"../pilha-escopos":27,"./micro-avaliador-sintatico-pitugues":19,"browser-process-hrtime":446}],15:[function(require,module,exports){
8213
+ },{"../../bibliotecas/dialetos/pitugues/primitivas-tupla":30,"../../bibliotecas/primitivas-dicionario":31,"../../bibliotecas/primitivas-numero":32,"../../bibliotecas/primitivas-texto":33,"../../bibliotecas/primitivas-vetor":34,"../../construtos":67,"../../declaracoes":116,"../../inferenciador":146,"../../informacao-elemento-sintatico":147,"../../lexador":238,"../../lexador/micro-lexador-pitugues":243,"../../tipos-de-dados/dialetos/pitugues":249,"../../tipos-de-simbolos/pitugues":257,"../avaliador-sintatico-base":10,"../comum":12,"../erro-avaliador-sintatico":21,"../informacao-escopo":23,"../pilha-escopos":27,"./micro-avaliador-sintatico-pitugues":19,"browser-process-hrtime":446}],15:[function(require,module,exports){
8112
8214
  "use strict";
8113
8215
  var __importDefault = (this && this.__importDefault) || function (mod) {
8114
8216
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -14341,8 +14443,12 @@ exports.Atribuir = Atribuir;
14341
14443
 
14342
14444
  },{"./variavel":95}],50:[function(require,module,exports){
14343
14445
  "use strict";
14446
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14447
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14448
+ };
14344
14449
  Object.defineProperty(exports, "__esModule", { value: true });
14345
14450
  exports.Binario = void 0;
14451
+ const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
14346
14452
  /**
14347
14453
  * Binário é uma estrutura com um operador e dois operandos: esquerda e direita.
14348
14454
  * Implementa as seguintes operações para Delégua e todos os dialetos:
@@ -14380,6 +14486,17 @@ class Binario {
14380
14486
  * @returns O tipo deduzido.
14381
14487
  */
14382
14488
  deduzirTipo() {
14489
+ if ([
14490
+ delegua_1.default.MAIOR,
14491
+ delegua_1.default.MAIOR_IGUAL,
14492
+ delegua_1.default.MENOR,
14493
+ delegua_1.default.MENOR_IGUAL,
14494
+ delegua_1.default.IGUAL,
14495
+ delegua_1.default.IGUAL_IGUAL,
14496
+ delegua_1.default.DIFERENTE,
14497
+ ].includes(this.operador.tipo)) {
14498
+ return 'lógico';
14499
+ }
14383
14500
  if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
14384
14501
  ['logico', 'lógico'].includes(this.direita.tipo)) {
14385
14502
  return 'lógico';
@@ -14411,7 +14528,7 @@ class Binario {
14411
14528
  }
14412
14529
  exports.Binario = Binario;
14413
14530
 
14414
- },{}],51:[function(require,module,exports){
14531
+ },{"../tipos-de-simbolos/delegua":253}],51:[function(require,module,exports){
14415
14532
  "use strict";
14416
14533
  Object.defineProperty(exports, "__esModule", { value: true });
14417
14534
  exports.Bote = void 0;
@@ -20509,7 +20626,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
20509
20626
  }
20510
20627
  return argumentosResolvidos;
20511
20628
  }
20512
- resolverAmbiente(argumentos) {
20629
+ async resolverAmbiente(visitante, argumentos) {
20513
20630
  const ambiente = new espaco_memoria_1.EspacoMemoria();
20514
20631
  const parametros = this.declaracao.parametros || [];
20515
20632
  for (let i = 0; i < parametros.length; i++) {
@@ -20525,15 +20642,28 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
20525
20642
  };
20526
20643
  }
20527
20644
  else {
20528
- let argumento = argumentos[i];
20529
- if (argumento.valor === null) {
20530
- argumentos[i].valor = parametro.valorPadrao ? parametro.valorPadrao : null;
20645
+ let valorFinal;
20646
+ const argumento = argumentos[i];
20647
+ const valorExtraido = (argumento && argumento.hasOwnProperty('valor'))
20648
+ ? argumento.valor
20649
+ : argumento;
20650
+ if (i < argumentos.length &&
20651
+ valorExtraido !== undefined &&
20652
+ valorExtraido !== null) {
20653
+ valorFinal = valorExtraido;
20654
+ }
20655
+ else if (parametro.valorPadrao) {
20656
+ valorFinal = await visitante.avaliar(parametro.valorPadrao);
20657
+ }
20658
+ else {
20659
+ valorFinal = null;
20531
20660
  }
20532
- ambiente.valores[nome] =
20533
- argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
20661
+ ambiente.valores[nome] = valorFinal;
20534
20662
  // Se o argumento é `DeleguaFuncao`, para habilitar o recurso de _currying_,
20535
20663
  // copiamos seu valor para o escopo atual. Nem sempre podemos contar com a tipagem explícita aqui.
20536
- if (argumento.valor && ['funcao', 'função'].includes(argumento.valor.tipo)) {
20664
+ if (valorFinal &&
20665
+ typeof valorFinal === 'object' &&
20666
+ ['funcao', 'função'].includes(valorFinal.tipo)) {
20537
20667
  parametro.referencia = true;
20538
20668
  }
20539
20669
  }
@@ -20541,7 +20671,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
20541
20671
  return ambiente;
20542
20672
  }
20543
20673
  async chamar(visitante, argumentos) {
20544
- const ambiente = this.resolverAmbiente(argumentos);
20674
+ const ambiente = await this.resolverAmbiente(visitante, argumentos);
20545
20675
  if (this.instancia !== undefined) {
20546
20676
  ambiente.valores['isto'] = {
20547
20677
  valor: this.instancia,
@@ -21924,7 +22054,28 @@ class InterpretadorBase {
21924
22054
  throw new Error('Método não implementado.');
21925
22055
  }
21926
22056
  async visitarExpressaoFalhar(expressao) {
21927
- const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
22057
+ let valorAvaliado = expressao.explicacao;
22058
+ // Se for um construto (ex.: Variavel), avalia para obter seu valor real
22059
+ if (expressao.explicacao &&
22060
+ typeof expressao.explicacao.aceitar === 'function') {
22061
+ valorAvaliado = await this.avaliar(expressao.explicacao);
22062
+ }
22063
+ let textoFalha;
22064
+ if (valorAvaliado === null || valorAvaliado === undefined) {
22065
+ textoFalha = 'nulo';
22066
+ }
22067
+ else if (typeof valorAvaliado === 'string') {
22068
+ textoFalha = valorAvaliado;
22069
+ }
22070
+ else if (typeof valorAvaliado === 'object' &&
22071
+ 'valor' in valorAvaliado) {
22072
+ // Objetos tipados como { valor: 'mensagem', tipo: 'texto' }
22073
+ textoFalha = String(valorAvaliado.valor);
22074
+ }
22075
+ else {
22076
+ // Caso incomum: usa a representação textual padrão
22077
+ textoFalha = this.paraTexto(valorAvaliado);
22078
+ }
21928
22079
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
21929
22080
  }
21930
22081
  async visitarExpressaoFimPara(_) {
@@ -22181,7 +22332,7 @@ class InterpretadorBase {
22181
22332
  * @param esquerda O operando esquerdo.
22182
22333
  * @returns Se ambos os operandos são números ou não.
22183
22334
  */
22184
- verificarOperandosNumeros(operador, direita, esquerda) {
22335
+ verificarOperandosNumeros(operador, esquerda, direita) {
22185
22336
  const tipoDireita = direita.tipo
22186
22337
  ? direita.tipo
22187
22338
  : typeof direita === primitivos_1.default.NUMERO
@@ -22259,23 +22410,33 @@ class InterpretadorBase {
22259
22410
  const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
22260
22411
  return resultadoExponenciacao;
22261
22412
  case delegua_1.default.MAIOR:
22262
- if (this.tiposNumericos.includes(tipoEsquerdo) &&
22263
- this.tiposNumericos.includes(tipoDireito)) {
22413
+ if (typeof valorEsquerdo === 'string' &&
22414
+ typeof valorDireito === 'string') {
22264
22415
  return valorEsquerdo > valorDireito;
22265
22416
  }
22266
- return String(valorEsquerdo) > String(valorDireito);
22417
+ this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
22418
+ return Number(valorEsquerdo) > Number(valorDireito);
22267
22419
  case delegua_1.default.MAIOR_IGUAL:
22420
+ if (typeof valorEsquerdo === 'string' &&
22421
+ typeof valorDireito === 'string') {
22422
+ return valorEsquerdo >= valorDireito;
22423
+ }
22268
22424
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
22269
- return valorEsquerdo >= valorDireito;
22425
+ return Number(valorEsquerdo) >= Number(valorDireito);
22270
22426
  case delegua_1.default.MENOR:
22271
- if (this.tiposNumericos.includes(tipoEsquerdo) &&
22272
- this.tiposNumericos.includes(tipoDireito)) {
22427
+ if (typeof valorEsquerdo === 'string' &&
22428
+ typeof valorDireito === 'string') {
22273
22429
  return valorEsquerdo < valorDireito;
22274
22430
  }
22275
- return String(valorEsquerdo) < String(valorDireito);
22431
+ this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
22432
+ return Number(valorEsquerdo) < Number(valorDireito);
22276
22433
  case delegua_1.default.MENOR_IGUAL:
22434
+ if (typeof valorEsquerdo === 'string' &&
22435
+ typeof valorDireito === 'string') {
22436
+ return valorEsquerdo <= valorDireito;
22437
+ }
22277
22438
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
22278
- return valorEsquerdo <= valorDireito;
22439
+ return Number(valorEsquerdo) <= Number(valorDireito);
22279
22440
  case delegua_1.default.SUBTRACAO:
22280
22441
  case delegua_1.default.MENOS_IGUAL:
22281
22442
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
@@ -22605,13 +22766,29 @@ class InterpretadorBase {
22605
22766
  });
22606
22767
  }
22607
22768
  }
22769
+ /** Gancho para linguagens definirem lógica de escopo (Pituguês LEGB) ou de memória (Delégua) */
22770
+ atribuirVariavel(alvoVariavel, valorResolvido, indice) {
22771
+ this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
22772
+ }
22773
+ /** Gancho para linguagens definirem como acessar propriedades de objetos */
22774
+ async definirPropriedadeObjeto(objeto, simbolo, valor) {
22775
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse) {
22776
+ await objeto.definir(simbolo, valor, this);
22777
+ }
22778
+ else if (objeto !== null && objeto !== undefined) {
22779
+ objeto[simbolo.lexema] = valor;
22780
+ }
22781
+ }
22608
22782
  /**
22609
22783
  * Execução de uma expressão de atribuição.
22610
22784
  * @param expressao A expressão.
22611
22785
  * @returns O valor atribuído.
22612
22786
  */
22613
22787
  async visitarExpressaoDeAtribuicao(expressao) {
22614
- const valor = await this.avaliar(expressao.valor);
22788
+ let valor = await this.avaliar(expressao.valor);
22789
+ if (valor && valor.hasOwnProperty('valorRetornado')) {
22790
+ valor = valor.valorRetornado;
22791
+ }
22615
22792
  const valorResolvido = this.resolverValor(valor);
22616
22793
  let indice = null;
22617
22794
  if (expressao.indice) {
@@ -22619,22 +22796,18 @@ class InterpretadorBase {
22619
22796
  }
22620
22797
  switch (expressao.alvo.constructor) {
22621
22798
  case construtos_1.AcessoMetodoOuPropriedade:
22622
- // Nunca será método aqui: apenas propriedade.
22623
22799
  const alvoPropriedade = expressao.alvo;
22624
22800
  const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
22625
22801
  const objeto = this.resolverValor(variavelObjeto);
22626
- const valor = await this.avaliar(expressao.valor);
22627
- if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
22628
- const objetoDeleguaClasse = objeto;
22629
- await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
22630
- }
22802
+ const valorProp = await this.avaliar(expressao.valor);
22803
+ await this.definirPropriedadeObjeto(objeto, alvoPropriedade.simbolo, valorProp);
22631
22804
  break;
22632
22805
  case construtos_1.Variavel:
22633
22806
  const alvoVariavel = expressao.alvo;
22634
- this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
22807
+ this.atribuirVariavel(alvoVariavel, valorResolvido, indice);
22635
22808
  break;
22636
22809
  default:
22637
- throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
22810
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, "Alvo da atribuição inválido. O lado esquerdo de uma atribuição deve ser uma variável, propriedade ou índice.");
22638
22811
  }
22639
22812
  return valorResolvido;
22640
22813
  }
@@ -22929,36 +23102,47 @@ class InterpretadorBase {
22929
23102
  } while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
22930
23103
  this.eVerdadeiro(await this.avaliar(declaracao.condicaoEnquanto)));
22931
23104
  }
23105
+ /**
23106
+ * Unifica a execução do bloco 'pegue', tratando tanto o caso de
23107
+ * declarações simples quanto o caso de função com parâmetro de erro.
23108
+ */
23109
+ async executarBlocoPegue(pegue, erro) {
23110
+ if (Array.isArray(pegue)) {
23111
+ return await this.executarBloco(pegue);
23112
+ }
23113
+ // Caso seja FuncaoConstruto (pegue com parâmetro de erro)
23114
+ const literalErro = new construtos_1.Literal(pegue.hashArquivo, pegue.linha, erro.mensagem || erro.message || erro);
23115
+ const chamadaPegue = new construtos_1.Chamada(pegue.hashArquivo, pegue, [literalErro]);
23116
+ return await chamadaPegue.aceitar(this);
23117
+ }
22932
23118
  /**
22933
23119
  * Interpretação de uma declaração `tente`.
22934
23120
  * @param declaracao O objeto da declaração.
22935
23121
  */
22936
23122
  async visitarDeclaracaoTente(declaracao) {
22937
23123
  let valorRetorno;
23124
+ let sucessoNoTente = false;
22938
23125
  try {
22939
23126
  this.emDeclaracaoTente = true;
22940
23127
  try {
22941
23128
  valorRetorno = await this.executarBloco(declaracao.caminhoTente);
23129
+ sucessoNoTente = true;
22942
23130
  }
22943
23131
  catch (erro) {
22944
23132
  if (declaracao.caminhoPegue !== null) {
22945
- // `caminhoPegue` aqui pode ser um construto de função (se `pegue` tem parâmetros)
22946
- // ou um vetor de `Declaracao` (`pegue` sem parâmetros).
22947
- // As execuções, portanto, são diferentes.
22948
- if (Array.isArray(declaracao.caminhoPegue)) {
22949
- valorRetorno = await this.executarBloco(declaracao.caminhoPegue);
22950
- }
22951
- else {
22952
- const literalErro = new construtos_1.Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
22953
- const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [literalErro]);
22954
- valorRetorno = await chamadaPegue.aceitar(this);
22955
- }
23133
+ valorRetorno = await this.executarBlocoPegue(declaracao.caminhoPegue, erro);
22956
23134
  }
23135
+ else
23136
+ throw erro;
23137
+ }
23138
+ if (sucessoNoTente && declaracao.caminhoSenao) {
23139
+ valorRetorno = await this.executarBloco(declaracao.caminhoSenao);
22957
23140
  }
22958
23141
  }
22959
23142
  finally {
22960
- if (declaracao.caminhoFinalmente)
23143
+ if (declaracao.caminhoFinalmente) {
22961
23144
  valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
23145
+ }
22962
23146
  this.emDeclaracaoTente = false;
22963
23147
  }
22964
23148
  return valorRetorno;
@@ -23417,6 +23601,13 @@ class InterpretadorBase {
23417
23601
  if (tipoObjeto === null || tipoObjeto === undefined) {
23418
23602
  tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(variavelObjeto);
23419
23603
  }
23604
+ // Trata qualquer tipo terminado em '[]' como vetor
23605
+ if (tipoObjeto && tipoObjeto.endsWith('[]')) {
23606
+ if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
23607
+ const metodo = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
23608
+ return new metodo_primitiva_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.simbolo.lexema, tipoObjeto);
23609
+ }
23610
+ }
23420
23611
  // Caso 3: Vetor simples do JavaScript.
23421
23612
  if (Array.isArray(objeto)) {
23422
23613
  if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
@@ -23910,6 +24101,17 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
23910
24101
  pontoInicializacaoBibliotecasGlobais() {
23911
24102
  (0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
23912
24103
  }
24104
+ atribuirVariavel(alvoVariavel, valorResolvido, indice) {
24105
+ const variavelResolvida = this.pilhaEscoposExecucao.obterValorVariavel(alvoVariavel.simbolo);
24106
+ if (variavelResolvida.valor instanceof estruturas_1.ReferenciaMontao) {
24107
+ const referenciaMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, variavelResolvida.valor.endereco);
24108
+ referenciaMontao[indice] = valorResolvido;
24109
+ }
24110
+ else {
24111
+ // Se não for montão, usa o comportamento padrão da Pilha
24112
+ super.atribuirVariavel(alvoVariavel, valorResolvido, indice);
24113
+ }
24114
+ }
23913
24115
  async avaliarArgumentosEscreva(argumentos) {
23914
24116
  if (this.constructor !== Interpretador) {
23915
24117
  return await super.avaliarArgumentosEscreva(argumentos);
@@ -24684,6 +24886,23 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24684
24886
  if (tipoObjeto === null || tipoObjeto === undefined) {
24685
24887
  tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(objeto);
24686
24888
  }
24889
+ // Trata qualquer tipo terminado em '[]' como vetor
24890
+ if (tipoObjeto && tipoObjeto.endsWith('[]')) {
24891
+ if (expressao.nomeMetodo in primitivas_vetor_1.default) {
24892
+ const metodo = primitivas_vetor_1.default[expressao.nomeMetodo].implementacao;
24893
+ return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.nomeMetodo, tipoObjeto);
24894
+ }
24895
+ else {
24896
+ const funcaoExt = this.encontrarMetodoExtensao(['vetor', 'objeto'], expressao.nomeMetodo, this.hashArquivoDeclaracaoAtual);
24897
+ if (funcaoExt)
24898
+ return funcaoExt.funcaoPorExtensao(objeto);
24899
+ throw new excecoes_1.ErroEmTempoDeExecucao({
24900
+ hashArquivo: this.hashArquivoDeclaracaoAtual,
24901
+ linha: this.linhaDeclaracaoAtual,
24902
+ lexema: expressao.nomeMetodo
24903
+ }, `Método de primitiva '${expressao.nomeMetodo}' não existe para o tipo ${tipoObjeto}.`, expressao.linha);
24904
+ }
24905
+ }
24687
24906
  // Como internamente um dicionário de Delégua é simplesmente um objeto de
24688
24907
  // JavaScript, as primitivas de dicionário, especificamente, são tratadas
24689
24908
  // mais acima.
@@ -24859,6 +25078,19 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24859
25078
  if (tipoObjeto === null || tipoObjeto === undefined) {
24860
25079
  tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(objeto);
24861
25080
  }
25081
+ // Trata qualquer tipo terminado em '[]' como vetor
25082
+ if (tipoObjeto && tipoObjeto.endsWith('[]')) {
25083
+ if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
25084
+ const metodo = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
25085
+ return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.simbolo.lexema, tipoObjeto);
25086
+ }
25087
+ else {
25088
+ const funcaoExt = this.encontrarMetodoExtensao(['vetor', 'objeto'], expressao.simbolo.lexema, this.hashArquivoDeclaracaoAtual);
25089
+ if (funcaoExt)
25090
+ return funcaoExt.funcaoPorExtensao(objeto);
25091
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`, expressao.linha);
25092
+ }
25093
+ }
24862
25094
  // Como internamente um dicionário de Delégua é simplesmente um objeto de
24863
25095
  // JavaScript, as primitivas de dicionário, especificamente, são tratadas
24864
25096
  // mais acima.
@@ -25058,53 +25290,6 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
25058
25290
  async visitarExpressaoComentario(expressao) {
25059
25291
  return Promise.resolve();
25060
25292
  }
25061
- /**
25062
- * Execução de uma expressão de atribuição.
25063
- * @param expressao A expressão.
25064
- * @returns O valor atribuído.
25065
- */
25066
- async visitarExpressaoDeAtribuicao(expressao) {
25067
- let valor = await this.avaliar(expressao.valor);
25068
- if (valor && valor.hasOwnProperty('valorRetornado')) {
25069
- valor = valor.valorRetornado;
25070
- }
25071
- const valorResolvido = this.resolverValor(valor);
25072
- let indice = null;
25073
- if (expressao.indice) {
25074
- indice = this.resolverValor(await this.avaliar(expressao.indice));
25075
- }
25076
- switch (expressao.alvo.constructor) {
25077
- case construtos_1.Variavel:
25078
- const alvoVariavel = expressao.alvo;
25079
- const variavelResolvida = this.pilhaEscoposExecucao.obterValorVariavel(alvoVariavel.simbolo);
25080
- if (variavelResolvida.valor instanceof estruturas_1.ReferenciaMontao) {
25081
- const referenciaMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, variavelResolvida.valor.endereco);
25082
- referenciaMontao[indice] = valorResolvido;
25083
- }
25084
- else {
25085
- this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
25086
- }
25087
- break;
25088
- case construtos_1.AcessoMetodoOuPropriedade:
25089
- // Nunca será método aqui: apenas propriedade.
25090
- const alvoPropriedade = expressao.alvo;
25091
- const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
25092
- const objeto = this.resolverValor(variavelObjeto);
25093
- const valor = await this.avaliar(expressao.valor);
25094
- if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
25095
- const objetoDeleguaClasse = objeto;
25096
- await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
25097
- }
25098
- else {
25099
- // Se cair aqui, provavelmente `objeto.constructor.name` é 'Object'.
25100
- objeto[alvoPropriedade.simbolo.lexema] = valor;
25101
- }
25102
- break;
25103
- default:
25104
- throw new excecoes_1.ErroEmTempoDeExecucao(undefined, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
25105
- }
25106
- return valorResolvido;
25107
- }
25108
25293
  async visitarExpressaoDefinirValor(expressao) {
25109
25294
  const variavelObjeto = await this.avaliar(expressao.objeto);
25110
25295
  const objeto = this.resolverValor(variavelObjeto);
@@ -28798,11 +28983,11 @@ const simbolo_1 = require("./simbolo");
28798
28983
  const palavras_reservadas_1 = require("./palavras-reservadas");
28799
28984
  const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
28800
28985
  /**
28801
- * O Lexador é responsável por transformar o código em uma coleção de tokens de linguagem.
28802
- * Cada token de linguagem é representado por um tipo, um lexema e informações da linha de código em que foi expresso.
28803
- * Também é responsável por mapear as palavras reservadas da linguagem, que não podem ser usadas por outras
28804
- * estruturas, tais como nomes de variáveis, funções, literais, classes e assim por diante.
28805
- */
28986
+ * O Lexador é responsável por transformar o código em uma coleção de tokens de linguagem.
28987
+ * Cada token de linguagem é representado por um tipo, um lexema e informações da linha de código em que foi expresso.
28988
+ * Também é responsável por mapear as palavras reservadas da linguagem, que não podem ser usadas por outras
28989
+ * estruturas, tais como nomes de variáveis, funções, literais, classes e assim por diante.
28990
+ */
28806
28991
  class Lexador {
28807
28992
  constructor(performance = false) {
28808
28993
  this.codigo = [];
@@ -28870,10 +29055,10 @@ class Lexador {
28870
29055
  return this.atual >= this.codigo[this.linha].length;
28871
29056
  }
28872
29057
  /**
28873
- * Indica se o código está na última linha.
28874
- * @returns Verdadeiro se contador de linhas está na última linha.
28875
- * Falso caso contrário.
28876
- */
29058
+ * Indica se o código está na última linha.
29059
+ * @returns Verdadeiro se contador de linhas está na última linha.
29060
+ * Falso caso contrário.
29061
+ */
28877
29062
  eUltimaLinha() {
28878
29063
  return this.linha >= this.codigo.length - 1;
28879
29064
  }
@@ -28881,7 +29066,9 @@ class Lexador {
28881
29066
  return this.eUltimaLinha() && this.codigo[this.codigo.length - 1].length <= this.atual;
28882
29067
  }
28883
29068
  avancar() {
28884
- this.atual += 1;
29069
+ const linha = this.codigo[this.linha];
29070
+ const codePoint = linha.codePointAt(this.atual);
29071
+ this.atual += codePoint && codePoint > 0xffff ? 2 : 1;
28885
29072
  if (this.eFinalDaLinha() && !this.eUltimaLinha()) {
28886
29073
  this.linha++;
28887
29074
  this.atual = 0;
@@ -28899,7 +29086,12 @@ class Lexador {
28899
29086
  simboloAtual() {
28900
29087
  if (this.eFinalDaLinha())
28901
29088
  return '\0';
28902
- return this.codigo[this.linha].charAt(this.atual);
29089
+ const linha = this.codigo[this.linha];
29090
+ const codePoint = linha.codePointAt(this.atual);
29091
+ if (codePoint === undefined) {
29092
+ return '\0';
29093
+ }
29094
+ return String.fromCodePoint(codePoint);
28903
29095
  }
28904
29096
  comentarioMultilinha() {
28905
29097
  let conteudo = '';
@@ -28923,10 +29115,10 @@ class Lexador {
28923
29115
  }
28924
29116
  }
28925
29117
  /**
28926
- * Lê um comentário documentário (iniciado com `/**`), agregando o conteúdo
28927
- * em um único token DOCUMENTARIO. Linhas com `*` inicial (convenção JSDoc)
28928
- * têm o asterisco removido.
28929
- */
29118
+ * Lê um comentário documentário (iniciado com `/**`), agregando o conteúdo
29119
+ * em um único token DOCUMENTARIO. Linhas com `*` inicial (convenção JSDoc)
29120
+ * têm o asterisco removido.
29121
+ */
28930
29122
  comentarioDocumentario() {
28931
29123
  // Cursor está no primeiro '*' de '/**'. Avança para pular o segundo '*'.
28932
29124
  this.avancar();
@@ -28964,10 +29156,23 @@ class Lexador {
28964
29156
  this.adicionarSimbolo(delegua_1.default.COMENTARIO, conteudo.trim());
28965
29157
  }
28966
29158
  proximoSimbolo() {
28967
- return this.codigo[this.linha].charAt(this.atual + 1);
29159
+ const linha = this.codigo[this.linha];
29160
+ const atual = this.simboloAtual();
29161
+ const incremento = atual.length;
29162
+ const codePoint = linha.codePointAt(this.atual + incremento);
29163
+ if (codePoint === undefined) {
29164
+ return '\0';
29165
+ }
29166
+ return String.fromCodePoint(codePoint);
28968
29167
  }
28969
29168
  simboloAnterior() {
28970
- return this.codigo[this.linha].charAt(this.atual - 1);
29169
+ const linha = this.codigo[this.linha];
29170
+ const indiceAnterior = this.atual -
29171
+ (linha.codePointAt(this.atual - 2) > 0xffff ? 2 : 1);
29172
+ const codePoint = linha.codePointAt(indiceAnterior);
29173
+ if (codePoint === undefined) {
29174
+ return '\0';
29175
+ }
28971
29176
  }
28972
29177
  analisarTexto(delimitador = '"') {
28973
29178
  let valor = '';
@@ -29153,6 +29358,19 @@ class Lexador {
29153
29358
  : delegua_1.default.IDENTIFICADOR;
29154
29359
  this.adicionarSimbolo(tipo);
29155
29360
  }
29361
+ eEmoji(caractere) {
29362
+ const emojiRegex = /\p{Extended_Pictographic}(?:\uFE0F|\u200D\p{Extended_Pictographic})*/u;
29363
+ return emojiRegex.test(caractere);
29364
+ }
29365
+ analisarEmoji() {
29366
+ const simboloAtual = this.simboloAtual();
29367
+ this.erros.push({
29368
+ linha: this.linha + 1,
29369
+ caractere: simboloAtual,
29370
+ mensagem: 'Emojis devem estar envoltos por aspas.',
29371
+ });
29372
+ this.avancar();
29373
+ }
29156
29374
  analisarToken() {
29157
29375
  const caractere = this.simboloAtual();
29158
29376
  switch (caractere) {
@@ -29416,6 +29634,8 @@ class Lexador {
29416
29634
  default:
29417
29635
  if (this.eDigito(caractere))
29418
29636
  this.analisarNumero();
29637
+ else if (this.eEmoji(caractere))
29638
+ this.analisarEmoji();
29419
29639
  else if (this.eAlfabeto(caractere))
29420
29640
  this.identificarPalavraChave();
29421
29641
  else {