@designliquido/delegua 0.39.0 → 0.39.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +22 -11
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico.d.ts +6 -1
  5. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.js +210 -126
  7. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +1 -2
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -2
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -3
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  17. package/bibliotecas/primitivas-vetor.js +1 -1
  18. package/bibliotecas/primitivas-vetor.js.map +1 -1
  19. package/bin/package.json +1 -1
  20. package/construtos/acesso-propriedade.d.ts +1 -0
  21. package/construtos/acesso-propriedade.d.ts.map +1 -1
  22. package/construtos/acesso-propriedade.js +7 -0
  23. package/construtos/acesso-propriedade.js.map +1 -1
  24. package/construtos/atribuir.d.ts +3 -2
  25. package/construtos/atribuir.d.ts.map +1 -1
  26. package/construtos/atribuir.js +7 -4
  27. package/construtos/atribuir.js.map +1 -1
  28. package/construtos/componente-linguagem.d.ts +15 -0
  29. package/construtos/componente-linguagem.d.ts.map +1 -0
  30. package/construtos/componente-linguagem.js +19 -0
  31. package/construtos/componente-linguagem.js.map +1 -0
  32. package/construtos/dicionario.d.ts +1 -0
  33. package/construtos/dicionario.d.ts.map +1 -1
  34. package/construtos/dicionario.js +1 -0
  35. package/construtos/dicionario.js.map +1 -1
  36. package/construtos/index.d.ts +2 -1
  37. package/construtos/index.d.ts.map +1 -1
  38. package/construtos/index.js +2 -1
  39. package/construtos/index.js.map +1 -1
  40. package/construtos/tipo-de.d.ts +6 -2
  41. package/construtos/tipo-de.d.ts.map +1 -1
  42. package/construtos/tipo-de.js +4 -0
  43. package/construtos/tipo-de.js.map +1 -1
  44. package/formatadores/formatador-delegua.js +1 -1
  45. package/formatadores/formatador-delegua.js.map +1 -1
  46. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  47. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +2 -1
  48. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  49. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +2 -2
  50. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
  51. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +2 -1
  52. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  53. package/interpretador/interpretador-base.d.ts.map +1 -1
  54. package/interpretador/interpretador-base.js +22 -15
  55. package/interpretador/interpretador-base.js.map +1 -1
  56. package/interpretador/interpretador.d.ts +2 -1
  57. package/interpretador/interpretador.d.ts.map +1 -1
  58. package/interpretador/interpretador.js +39 -0
  59. package/interpretador/interpretador.js.map +1 -1
  60. package/lexador/lexador.js +16 -16
  61. package/lexador/lexador.js.map +1 -1
  62. package/package.json +1 -1
  63. package/tradutores/tradutor-assemblyscript.js +1 -1
  64. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  65. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  66. package/tradutores/tradutor-javascript.js +18 -3
  67. package/tradutores/tradutor-javascript.js.map +1 -1
  68. package/tradutores/tradutor-python.d.ts +11 -6
  69. package/tradutores/tradutor-python.d.ts.map +1 -1
  70. package/tradutores/tradutor-python.js +153 -89
  71. package/tradutores/tradutor-python.js.map +1 -1
  72. package/umd/delegua.js +871 -629
@@ -5,8 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AvaliadorSintatico = void 0;
7
7
  const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
8
- const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
9
- const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
10
8
  const construtos_1 = require("../construtos");
11
9
  const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
12
10
  const tuplas_1 = require("../construtos/tuplas");
@@ -16,6 +14,9 @@ const avaliador_sintatico_base_1 = require("./avaliador-sintatico-base");
16
14
  const inferenciador_1 = require("../inferenciador");
17
15
  const pilha_escopos_1 = require("./pilha-escopos");
18
16
  const informacao_escopo_1 = require("./informacao-escopo");
17
+ const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
18
+ const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
19
+ const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
19
20
  const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
20
21
  const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
21
22
  const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
@@ -64,28 +65,72 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
64
65
  }
65
66
  return tipoElementarResolvido;
66
67
  }
68
+ obterChaveDicionario() {
69
+ switch (this.simbolos[this.atual].tipo) {
70
+ case delegua_2.default.NUMERO:
71
+ case delegua_2.default.TEXTO:
72
+ case delegua_2.default.FALSO:
73
+ case delegua_2.default.VERDADEIRO:
74
+ return this.primario();
75
+ case delegua_2.default.IDENTIFICADOR:
76
+ const simboloIdentificador = this.avancarEDevolverAnterior();
77
+ let tipoOperando;
78
+ if (simboloIdentificador.lexema in this.tiposDefinidosEmCodigo) {
79
+ tipoOperando = simboloIdentificador.lexema;
80
+ }
81
+ else {
82
+ tipoOperando = this.pilhaEscopos.obterTipoVariavelPorNome(simboloIdentificador.lexema);
83
+ }
84
+ if (!['numero', 'número', 'texto', 'lógico'].includes(tipoOperando)) {
85
+ throw this.erro(simboloIdentificador, `Tipo ${tipoOperando} de identificador ${simboloIdentificador.lexema} não é válido como chave de dicionário.`);
86
+ }
87
+ return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
88
+ case delegua_2.default.COLCHETE_ESQUERDO:
89
+ this.avancarEDevolverAnterior();
90
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
91
+ return this.construtoTupla();
92
+ }
93
+ throw this.erro(this.simbolos[this.atual], `Esperado parêntese esquerdo após colchete esquerdo para definição de chave de dicionário. Atual: ${this.simbolos[this.atual].tipo}.`);
94
+ default:
95
+ throw this.erro(this.simbolos[this.atual], `Símbolo ${this.simbolos[this.atual].tipo} inesperado ou inválido como chave de dicionário.`);
96
+ }
97
+ }
98
+ construtoDicionario(simboloChaveEsquerda) {
99
+ this.avancarEDevolverAnterior();
100
+ const chaves = [];
101
+ const valores = [];
102
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
103
+ return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), [], []);
104
+ }
105
+ while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
106
+ const chave = this.obterChaveDicionario();
107
+ this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
108
+ const valor = this.atribuir();
109
+ chaves.push(chave);
110
+ valores.push(valor);
111
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
112
+ this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
113
+ }
114
+ }
115
+ return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), chaves, valores);
116
+ }
117
+ construtoTupla() {
118
+ const expressao = this.expressao();
119
+ const argumentos = [expressao];
120
+ while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
121
+ this.avancarEDevolverAnterior();
122
+ argumentos.push(this.expressao());
123
+ }
124
+ this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
125
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
126
+ return new tuplas_1.SeletorTuplas(...argumentos);
127
+ }
67
128
  primario() {
68
129
  const simboloAtual = this.simbolos[this.atual];
69
130
  let valores = [];
70
131
  switch (simboloAtual.tipo) {
71
132
  case delegua_2.default.CHAVE_ESQUERDA:
72
- this.avancarEDevolverAnterior();
73
- const chaves = [];
74
- valores = [];
75
- if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
76
- return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
77
- }
78
- while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
79
- const chave = this.atribuir();
80
- this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
81
- const valor = this.atribuir();
82
- chaves.push(chave);
83
- valores.push(valor);
84
- if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
85
- this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
86
- }
87
- }
88
- return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
133
+ return this.construtoDicionario(simboloAtual);
89
134
  case delegua_2.default.COLCHETE_ESQUERDO:
90
135
  this.avancarEDevolverAnterior();
91
136
  valores = [];
@@ -93,19 +138,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
93
138
  return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), [], 0, 'qualquer');
94
139
  }
95
140
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
96
- let valor = null;
97
141
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
98
- const expressao = this.expressao();
99
- const argumentos = [expressao];
100
- while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
101
- this.avancarEDevolverAnterior();
102
- argumentos.push(this.expressao());
103
- }
104
- this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
105
- this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
106
- return new tuplas_1.SeletorTuplas(...argumentos);
142
+ return this.construtoTupla();
107
143
  }
108
- valor = this.atribuir();
144
+ const valor = this.atribuir();
109
145
  valores.push(valor);
110
146
  if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
111
147
  this.consumir(delegua_2.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
@@ -146,7 +182,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
146
182
  return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
147
183
  case delegua_2.default.NULO:
148
184
  this.avancarEDevolverAnterior();
149
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null);
185
+ return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
150
186
  case delegua_2.default.NUMERO:
151
187
  case delegua_2.default.TEXTO:
152
188
  const simboloNumeroTexto = this.avancarEDevolverAnterior();
@@ -178,14 +214,67 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
178
214
  case delegua_2.default.TIPO:
179
215
  this.avancarEDevolverAnterior();
180
216
  this.consumir(delegua_2.default.DE, "Esperado 'de' após 'tipo'.");
181
- let _expressao;
217
+ let construto;
182
218
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESCREVA, delegua_2.default.LEIA, delegua_2.default.FUNCAO, delegua_2.default.FUNÇÃO, delegua_2.default.SE, delegua_2.default.ENQUANTO, delegua_2.default.PARA, delegua_2.default.RETORNA, delegua_1.default.INTEIRO, delegua_1.default.TEXTO, delegua_1.default.VETOR, delegua_1.default.LOGICO, delegua_1.default.LÓGICO, delegua_1.default.VAZIO)) {
183
- _expressao = this.simboloAnterior();
219
+ construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
184
220
  }
185
221
  else {
186
- _expressao = this.expressao();
222
+ construto = this.expressao();
223
+ }
224
+ if (construto.constructor.name === 'AcessoMetodoOuPropriedade') {
225
+ const construtoTipado = construto;
226
+ switch (construtoTipado.tipo) {
227
+ case delegua_1.default.DICIONARIO:
228
+ case delegua_1.default.DICIONÁRIO:
229
+ if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
230
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
231
+ }
232
+ const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
233
+ construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
234
+ break;
235
+ case delegua_1.default.INTEIRO:
236
+ case delegua_1.default.NUMERO:
237
+ case delegua_1.default.NÚMERO:
238
+ if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
239
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
240
+ }
241
+ const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
242
+ construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
243
+ break;
244
+ case delegua_1.default.TEXTO:
245
+ if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
246
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
247
+ }
248
+ const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
249
+ construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
250
+ break;
251
+ case delegua_1.default.VETOR:
252
+ case delegua_1.default.VETOR_NUMERO:
253
+ case delegua_1.default.VETOR_NÚMERO:
254
+ case delegua_1.default.VETOR_TEXTO:
255
+ if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
256
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
257
+ }
258
+ const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
259
+ construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
260
+ break;
261
+ default:
262
+ if (construtoTipado.tipo in this.tiposDefinidosEmCodigo) {
263
+ const tipoCorrespondente = this.tiposDefinidosEmCodigo[construtoTipado.tipo];
264
+ const possivelMetodo = tipoCorrespondente.metodos.filter(m => m.simbolo.lexema === construtoTipado.simbolo.lexema);
265
+ if (possivelMetodo.length > 0) {
266
+ construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, possivelMetodo[0].tipoRetorno);
267
+ break;
268
+ }
269
+ const possivelPropriedade = tipoCorrespondente.propriedades.filter(p => p.nome.lexema === construtoTipado.simbolo.lexema);
270
+ if (possivelPropriedade.length > 0) {
271
+ construto = new construtos_1.AcessoPropriedade(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, possivelPropriedade[0].tipo);
272
+ break;
273
+ }
274
+ }
275
+ }
187
276
  }
188
- return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, _expressao instanceof construtos_1.Literal ? _expressao.valor : _expressao);
277
+ return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
189
278
  case delegua_2.default.EXPRESSAO_REGULAR:
190
279
  let valor = '';
191
280
  let linhaAtual = this.simbolos[this.atual].linha;
@@ -241,33 +330,41 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
241
330
  // Toda chamada precisa saber de antemão qual o tipo resolvido.
242
331
  let entidadeChamadaResolvida = entidadeChamada;
243
332
  if (entidadeChamadaResolvida.constructor.name === 'AcessoMetodoOuPropriedade') {
244
- const acessoMetodoOuPropriedade = entidadeChamadaResolvida;
333
+ const construtoTipado = entidadeChamadaResolvida;
245
334
  switch (entidadeChamadaResolvida.tipo) {
335
+ case delegua_1.default.DICIONARIO:
336
+ case delegua_1.default.DICIONÁRIO:
337
+ if (!(construtoTipado.simbolo.lexema in primitivas_dicionario_1.default)) {
338
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de dicionário.`);
339
+ }
340
+ const primitivaDicionarioSelecionada = primitivas_dicionario_1.default[construtoTipado.simbolo.lexema];
341
+ entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaDicionarioSelecionada.tipoRetorno);
342
+ break;
246
343
  case delegua_1.default.INTEIRO:
247
344
  case delegua_1.default.NUMERO:
248
345
  case delegua_1.default.NÚMERO:
249
- if (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_numero_1.default)) {
250
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de número.`);
346
+ if (!(construtoTipado.simbolo.lexema in primitivas_numero_1.default)) {
347
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de número.`);
251
348
  }
252
- const primitivaNumeroSelecionada = primitivas_numero_1.default[acessoMetodoOuPropriedade.simbolo.lexema];
253
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
349
+ const primitivaNumeroSelecionada = primitivas_numero_1.default[construtoTipado.simbolo.lexema];
350
+ entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaNumeroSelecionada.tipoRetorno);
254
351
  break;
255
352
  case delegua_1.default.TEXTO:
256
- if (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_texto_1.default)) {
257
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de texto.`);
353
+ if (!(construtoTipado.simbolo.lexema in primitivas_texto_1.default)) {
354
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de texto.`);
258
355
  }
259
- const primitivaTextoSelecionada = primitivas_texto_1.default[acessoMetodoOuPropriedade.simbolo.lexema];
260
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
356
+ const primitivaTextoSelecionada = primitivas_texto_1.default[construtoTipado.simbolo.lexema];
357
+ entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaTextoSelecionada.tipoRetorno);
261
358
  break;
262
359
  case delegua_1.default.VETOR:
263
360
  case delegua_1.default.VETOR_NUMERO:
264
361
  case delegua_1.default.VETOR_NÚMERO:
265
362
  case delegua_1.default.VETOR_TEXTO:
266
- if (!(acessoMetodoOuPropriedade.simbolo.lexema in primitivas_vetor_1.default)) {
267
- throw this.erro(acessoMetodoOuPropriedade.simbolo, `${acessoMetodoOuPropriedade.simbolo.lexema} não é uma primitiva de vetor.`);
363
+ if (!(construtoTipado.simbolo.lexema in primitivas_vetor_1.default)) {
364
+ throw this.erro(construtoTipado.simbolo, `${construtoTipado.simbolo.lexema} não é uma primitiva de vetor.`);
268
365
  }
269
- const primitivaVetorSelecionada = primitivas_vetor_1.default[acessoMetodoOuPropriedade.simbolo.lexema];
270
- entidadeChamadaResolvida = new construtos_1.AcessoMetodo(acessoMetodoOuPropriedade.hashArquivo, acessoMetodoOuPropriedade.objeto, acessoMetodoOuPropriedade.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
366
+ const primitivaVetorSelecionada = primitivas_vetor_1.default[construtoTipado.simbolo.lexema];
367
+ entidadeChamadaResolvida = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
271
368
  break;
272
369
  }
273
370
  }
@@ -389,22 +486,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
389
486
  ].includes(expressao.operador.tipo)) {
390
487
  if (expressao.esquerda instanceof construtos_1.AcessoIndiceVariavel) {
391
488
  const entidade = expressao.esquerda;
392
- const simbolo = entidade.entidadeChamada.simbolo;
393
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao, entidade.indice);
489
+ return new construtos_1.Atribuir(this.hashArquivo, entidade.entidadeChamada, expressao, entidade.indice, expressao.operador);
394
490
  }
395
- const simbolo = expressao.esquerda.simbolo;
396
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, expressao);
491
+ return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda, expressao, undefined, expressao.operador);
397
492
  }
398
493
  else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
399
494
  const igual = this.simbolos[this.atual - 1];
400
495
  const valor = this.expressao();
401
496
  if (expressao instanceof construtos_1.Variavel) {
402
- const simbolo = expressao.simbolo;
403
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
497
+ return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
404
498
  }
405
499
  if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
406
- const get = expressao;
407
- return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, get.objeto, get.simbolo, valor);
500
+ return new construtos_1.DefinirValor(this.hashArquivo, igual.linha, expressao.objeto, expressao.simbolo, valor);
408
501
  }
409
502
  if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
410
503
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
@@ -870,6 +963,47 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
870
963
  this.pilhaDecoradores = [];
871
964
  return retornos;
872
965
  }
966
+ logicaComumInferenciaTiposVariaveisEConstantes(inicializador, tipo) {
967
+ if (tipo !== 'qualquer') {
968
+ return tipo;
969
+ }
970
+ switch (inicializador.constructor.name) {
971
+ case 'AcessoIndiceVariavel':
972
+ const entidadeChamadaAcessoIndiceVariavel = inicializador.entidadeChamada;
973
+ return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
974
+ case 'Chamada':
975
+ const entidadeChamadaChamada = inicializador.entidadeChamada;
976
+ switch (entidadeChamadaChamada.constructor.name) {
977
+ case 'AcessoMetodo':
978
+ const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
979
+ return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
980
+ case 'AcessoPropriedade':
981
+ const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
982
+ return entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
983
+ case 'Variavel':
984
+ const entidadeChamadaVariavel = entidadeChamadaChamada;
985
+ return entidadeChamadaVariavel.tipo;
986
+ }
987
+ break;
988
+ case 'FuncaoConstruto':
989
+ const funcaoConstruto = inicializador;
990
+ return `função<${funcaoConstruto.tipoRetorno}>`;
991
+ case 'Leia':
992
+ return 'texto';
993
+ case 'Dupla':
994
+ case 'Trio':
995
+ case 'Quarteto':
996
+ case 'Quinteto':
997
+ case 'Sexteto':
998
+ case 'Septeto':
999
+ case 'Octeto':
1000
+ case 'Noneto':
1001
+ case 'Deceto':
1002
+ return delegua_1.default.TUPLA;
1003
+ default:
1004
+ return inicializador.tipo;
1005
+ }
1006
+ }
873
1007
  /**
874
1008
  * Caso símbolo atual seja `var`, devolve uma declaração de variável.
875
1009
  * @returns Um Construto do tipo Var.
@@ -907,43 +1041,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
907
1041
  }
908
1042
  for (let [indice, identificador] of identificadores.entries()) {
909
1043
  // Se tipo ainda não foi definido, infere.
910
- if (tipo === 'qualquer') {
911
- switch (inicializadores[indice].constructor.name) {
912
- case 'AcessoIndiceVariavel':
913
- const entidadeChamadaAcessoIndiceVariavel = inicializadores[indice].entidadeChamada;
914
- tipo = entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
915
- break;
916
- case 'Chamada':
917
- const entidadeChamadaChamada = inicializadores[indice].entidadeChamada;
918
- switch (entidadeChamadaChamada.constructor.name) {
919
- case 'AcessoMetodo':
920
- const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
921
- tipo = entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
922
- break;
923
- case 'AcessoPropriedade':
924
- const entidadeChamadaAcessoPropriedade = entidadeChamadaChamada;
925
- tipo = entidadeChamadaAcessoPropriedade.tipoRetornoPropriedade;
926
- break;
927
- }
928
- break;
929
- case 'Dupla':
930
- case 'Trio':
931
- case 'Quarteto':
932
- case 'Quinteto':
933
- case 'Sexteto':
934
- case 'Septeto':
935
- case 'Octeto':
936
- case 'Noneto':
937
- case 'Deceto':
938
- tipo = delegua_1.default.TUPLA;
939
- break;
940
- case 'Literal':
941
- case 'Variavel':
942
- case 'Vetor':
943
- tipo = inicializadores[indice].tipo;
944
- break;
945
- }
946
- }
1044
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
947
1045
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
948
1046
  retorno.push(new declaracoes_1.Var(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
949
1047
  }
@@ -996,30 +1094,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
996
1094
  }
997
1095
  let retorno = [];
998
1096
  for (let [indice, identificador] of identificadores.entries()) {
999
- if (tipo === 'qualquer') {
1000
- switch (inicializadores[indice].constructor.name) {
1001
- case 'AcessoIndiceVariavel':
1002
- const entidadeChamada = inicializadores[indice].entidadeChamada;
1003
- tipo = entidadeChamada.tipo.slice(0, -2);
1004
- break;
1005
- case 'Dupla':
1006
- case 'Trio':
1007
- case 'Quarteto':
1008
- case 'Quinteto':
1009
- case 'Sexteto':
1010
- case 'Septeto':
1011
- case 'Octeto':
1012
- case 'Noneto':
1013
- case 'Deceto':
1014
- tipo = delegua_1.default.TUPLA;
1015
- break;
1016
- case 'Literal':
1017
- case 'Variavel':
1018
- case 'Vetor':
1019
- tipo = inicializadores[indice].tipo;
1020
- break;
1021
- }
1022
- }
1097
+ // Se tipo ainda não foi definido, infere.
1098
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
1023
1099
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1024
1100
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
1025
1101
  }
@@ -1043,8 +1119,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1043
1119
  // para ela. Vai ser atualizado após avaliação do corpo da função.
1044
1120
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1045
1121
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1046
- this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno || 'qualquer');
1047
- return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno || 'qualquer', decoradores);
1122
+ this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno);
1123
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno, decoradores);
1048
1124
  }
1049
1125
  logicaComumParametros() {
1050
1126
  const parametros = [];
@@ -1123,9 +1199,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1123
1199
  }
1124
1200
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
1125
1201
  let tipoRetorno = 'qualquer';
1202
+ let definicaoExplicitaDeTipo = false;
1126
1203
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
1127
1204
  tipoRetorno = this.verificarDefinicaoTipoAtual();
1128
1205
  this.avancarEDevolverAnterior();
1206
+ definicaoExplicitaDeTipo = true;
1129
1207
  }
1130
1208
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1131
1209
  const corpo = this.blocoEscopo();
@@ -1140,19 +1218,25 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1140
1218
  }
1141
1219
  }
1142
1220
  const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
1143
- // if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
1144
1221
  if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
1145
1222
  let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
1146
1223
  tiposEncontrados = tiposEncontrados.slice(0, -2);
1147
1224
  throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
1148
1225
  }
1149
1226
  tiposRetornos.delete('qualquer');
1150
- if (tipoRetorno === 'qualquer' && tiposRetornos.size === 1) {
1151
- // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1152
- // este avaliador sintático pode restringir o tipo baseado nos retornos
1153
- // encontrados nos blocos internos da função.
1154
- const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1155
- tipoRetorno = tipoRetornoDeduzido;
1227
+ if (tipoRetorno === 'qualquer') {
1228
+ if (tiposRetornos.size > 0) {
1229
+ // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1230
+ // este avaliador sintático pode restringir o tipo baseado nos construtos
1231
+ // de retornos encontrados nos blocos internos da função.
1232
+ const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1233
+ tipoRetorno = tipoRetornoDeduzido;
1234
+ }
1235
+ else if (!definicaoExplicitaDeTipo) {
1236
+ // Ou, se esses retornos sequer existem, e o tipo explícito não é
1237
+ // 'qualquer', o tipo inferido é 'vazio'.
1238
+ tipoRetorno = 'vazio';
1239
+ }
1156
1240
  }
1157
1241
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1158
1242
  }