@designliquido/delegua 0.38.2 → 0.38.3

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 (70) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts +1 -2
  2. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico.js +2 -2
  4. package/analisador-semantico/analisador-semantico.js.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico-base.js +3 -2
  7. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.js +110 -14
  11. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +4 -4
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +7 -7
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -2
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  21. package/bin/package.json +1 -1
  22. package/construtos/acesso-metodo-ou-propriedade.d.ts +2 -1
  23. package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
  24. package/construtos/acesso-metodo-ou-propriedade.js +2 -1
  25. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  26. package/construtos/agrupamento.d.ts +1 -0
  27. package/construtos/agrupamento.d.ts.map +1 -1
  28. package/construtos/agrupamento.js +1 -0
  29. package/construtos/agrupamento.js.map +1 -1
  30. package/construtos/binario.d.ts.map +1 -1
  31. package/construtos/binario.js +1 -0
  32. package/construtos/binario.js.map +1 -1
  33. package/declaracoes/const.d.ts +2 -3
  34. package/declaracoes/const.d.ts.map +1 -1
  35. package/declaracoes/const.js +7 -2
  36. package/declaracoes/const.js.map +1 -1
  37. package/declaracoes/funcao.d.ts +5 -2
  38. package/declaracoes/funcao.d.ts.map +1 -1
  39. package/declaracoes/funcao.js +4 -1
  40. package/declaracoes/funcao.js.map +1 -1
  41. package/declaracoes/retorna.d.ts +4 -2
  42. package/declaracoes/retorna.d.ts.map +1 -1
  43. package/declaracoes/retorna.js +7 -1
  44. package/declaracoes/retorna.js.map +1 -1
  45. package/declaracoes/var.d.ts +2 -3
  46. package/declaracoes/var.d.ts.map +1 -1
  47. package/declaracoes/var.js +7 -2
  48. package/declaracoes/var.js.map +1 -1
  49. package/inferenciador.d.ts +1 -1
  50. package/inferenciador.d.ts.map +1 -1
  51. package/inferenciador.js +47 -36
  52. package/inferenciador.js.map +1 -1
  53. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  54. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
  55. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  56. package/interpretador/interpretador-base.d.ts.map +1 -1
  57. package/interpretador/interpretador-base.js +9 -0
  58. package/interpretador/interpretador-base.js.map +1 -1
  59. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  60. package/interpretador/pilha-escopos-execucao.js +7 -1
  61. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  62. package/lexador/lexador.d.ts.map +1 -1
  63. package/lexador/lexador.js +3 -0
  64. package/lexador/lexador.js.map +1 -1
  65. package/package.json +1 -1
  66. package/tipo-dados-elementar.d.ts.map +1 -1
  67. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  68. package/tradutores/tradutor-assemblyscript.js +4 -0
  69. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  70. package/umd/delegua.js +225 -73
package/umd/delegua.js CHANGED
@@ -22,7 +22,8 @@ class AvaliadorSintaticoBase {
22
22
  }
23
23
  erro(simbolo, mensagemDeErro) {
24
24
  const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
25
- this.erros.push(excecao);
25
+ // TODO: Estudar remover.
26
+ // this.erros.push(excecao);
26
27
  return excecao;
27
28
  }
28
29
  simboloAnterior() {
@@ -165,7 +166,7 @@ class AvaliadorSintaticoBase {
165
166
  const parametros = [];
166
167
  do {
167
168
  if (parametros.length >= 255) {
168
- this.erro(this.simbolos[this.atual], 'Função não pode ter mais de 255 parâmetros.');
169
+ throw this.erro(this.simbolos[this.atual], 'Função não pode ter mais de 255 parâmetros.');
169
170
  }
170
171
  const parametro = {};
171
172
  if (this.simbolos[this.atual].tipo === comum_1.default.MULTIPLICACAO) {
@@ -255,6 +256,12 @@ const informacao_escopo_1 = require("./informacao-escopo");
255
256
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
256
257
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
257
258
  * Há dois grupos de estruturas de alto nível: Construtos e Declarações.
259
+ *
260
+ * Construtos não existem por si só: cada construto precisa estar dentro de uma declaração para ser
261
+ * aceito pela próxima etapa, como tradução, interpretação, análise semântica, etc.
262
+ *
263
+ * Diferentemente de outros dialetos, em Delégua um construto normalmente retorna um tipo.
264
+ * Por isso a separação deste avaliador sintático do avaliador sintático base.
258
265
  */
259
266
  class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
260
267
  constructor(performance = false) {
@@ -361,9 +368,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
361
368
  if (this.simbolos[this.atual] &&
362
369
  [delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR].includes(this.simbolos[this.atual].tipo)) {
363
370
  const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
364
- return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando), 'DEPOIS');
371
+ return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer'), 'DEPOIS');
365
372
  }
366
- return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando);
373
+ return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer');
367
374
  case delegua_2.default.IMPORTAR:
368
375
  this.avancarEDevolverAnterior();
369
376
  return this.declaracaoImportar();
@@ -583,7 +590,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
583
590
  if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
584
591
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
585
592
  }
586
- this.erro(igual, 'Tarefa de atribuição inválida');
593
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
587
594
  }
588
595
  return expressao;
589
596
  }
@@ -659,7 +666,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
659
666
  }
660
667
  declaracaoContinua() {
661
668
  if (this.blocos < 1) {
662
- this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
669
+ throw this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
663
670
  }
664
671
  // Ponto-e-vírgula é opcional aqui.
665
672
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -857,7 +864,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
857
864
  }
858
865
  declaracaoSustar() {
859
866
  if (this.blocos < 1) {
860
- this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
867
+ throw this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
861
868
  }
862
869
  // Ponto-e-vírgula é opcional aqui.
863
870
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
@@ -993,7 +1000,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
993
1000
  if (!!simboloAnterior &&
994
1001
  simboloAnterior.tipo === delegua_2.default.IDENTIFICADOR &&
995
1002
  simboloAnterior.linha === simboloAtual.linha) {
996
- this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
1003
+ throw this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
997
1004
  }
998
1005
  }
999
1006
  return this.declaracaoExpressao();
@@ -1036,7 +1043,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1036
1043
  const inicializador = this.expressao();
1037
1044
  const retornos = [];
1038
1045
  for (let identificador of identificadores) {
1039
- // TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
1040
1046
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, 'qualquer');
1041
1047
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
1042
1048
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
@@ -1052,7 +1058,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1052
1058
  declaracaoDeVariaveis() {
1053
1059
  const identificadores = [];
1054
1060
  const retorno = [];
1055
- let tipo = null;
1061
+ let tipo = 'qualquer';
1056
1062
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1057
1063
  return this.declaracaoDesestruturacaoVariavel();
1058
1064
  }
@@ -1082,8 +1088,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1082
1088
  }
1083
1089
  for (let [indice, identificador] of identificadores.entries()) {
1084
1090
  // Se tipo ainda não foi definido, infere.
1085
- if (!tipo) {
1091
+ if (tipo === 'qualquer') {
1086
1092
  switch (inicializadores[indice].constructor.name) {
1093
+ case 'AcessoIndiceVariavel':
1094
+ const entidadeChamada = inicializadores[indice].entidadeChamada;
1095
+ tipo = entidadeChamada.tipo.slice(0, -2);
1096
+ break;
1087
1097
  case 'Dupla':
1088
1098
  case 'Trio':
1089
1099
  case 'Quarteto':
@@ -1096,6 +1106,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1096
1106
  tipo = delegua_1.default.TUPLA;
1097
1107
  break;
1098
1108
  case 'Literal':
1109
+ case 'Variavel':
1099
1110
  case 'Vetor':
1100
1111
  tipo = inicializadores[indice].tipo;
1101
1112
  break;
@@ -1132,7 +1143,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1132
1143
  */
1133
1144
  declaracaoDeConstantes() {
1134
1145
  const identificadores = [];
1135
- let tipo = null;
1146
+ let tipo = 'qualquer';
1136
1147
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
1137
1148
  return this.declaracaoDesestruturacaoConstante();
1138
1149
  }
@@ -1153,8 +1164,29 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1153
1164
  }
1154
1165
  let retorno = [];
1155
1166
  for (let [indice, identificador] of identificadores.entries()) {
1156
- if (!tipo) {
1157
- tipo = (0, inferenciador_1.inferirTipoVariavel)(inicializadores[indice]);
1167
+ if (tipo === 'qualquer') {
1168
+ switch (inicializadores[indice].constructor.name) {
1169
+ case 'AcessoIndiceVariavel':
1170
+ const entidadeChamada = inicializadores[indice].entidadeChamada;
1171
+ tipo = entidadeChamada.tipo.slice(0, -2);
1172
+ break;
1173
+ case 'Dupla':
1174
+ case 'Trio':
1175
+ case 'Quarteto':
1176
+ case 'Quinteto':
1177
+ case 'Sexteto':
1178
+ case 'Septeto':
1179
+ case 'Octeto':
1180
+ case 'Noneto':
1181
+ case 'Deceto':
1182
+ tipo = delegua_1.default.TUPLA;
1183
+ break;
1184
+ case 'Literal':
1185
+ case 'Variavel':
1186
+ case 'Vetor':
1187
+ tipo = inicializadores[indice].tipo;
1188
+ break;
1189
+ }
1158
1190
  }
1159
1191
  this.pilhaEscopos.definirTipoVariavel(identificador.lexema, tipo);
1160
1192
  retorno.push(new declaracoes_1.Const(identificador, inicializadores[indice], tipo, Array.from(this.pilhaDecoradores)));
@@ -1180,7 +1212,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1180
1212
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, 'qualquer');
1181
1213
  const corpoDaFuncao = this.corpoDaFuncao(tipo);
1182
1214
  this.pilhaEscopos.definirTipoVariavel(simbolo.lexema, corpoDaFuncao.tipoRetorno || 'qualquer');
1183
- return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, null, decoradores);
1215
+ return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, corpoDaFuncao.tipoRetorno || 'qualquer', decoradores);
1184
1216
  }
1185
1217
  logicaComumParametros() {
1186
1218
  const parametros = [];
@@ -1210,6 +1242,45 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1210
1242
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
1211
1243
  return parametros;
1212
1244
  }
1245
+ *buscarRetornosEmBloco(construtoBloco) {
1246
+ for (const declaracao of construtoBloco.declaracoes) {
1247
+ if (declaracao.constructor.name === 'Retorna') {
1248
+ yield declaracao;
1249
+ }
1250
+ }
1251
+ }
1252
+ *buscarRetornosEmSe(construtoSe) {
1253
+ const blocoEntao = construtoSe.caminhoEntao;
1254
+ for (const declaracao of this.buscarRetornosEmBloco(blocoEntao)) {
1255
+ if (declaracao.constructor.name === 'Retorna') {
1256
+ yield declaracao;
1257
+ }
1258
+ }
1259
+ const blocoSenao = construtoSe.caminhoSenao;
1260
+ if (!blocoSenao)
1261
+ return;
1262
+ for (const declaracao of blocoSenao.declaracoes) {
1263
+ if (declaracao.constructor.name === 'Retorna') {
1264
+ yield declaracao;
1265
+ }
1266
+ }
1267
+ }
1268
+ buscarRetornos(declaracao) {
1269
+ let retornasEncontrados = [];
1270
+ switch (declaracao.constructor.name) {
1271
+ case 'Retorna':
1272
+ retornasEncontrados.push(declaracao);
1273
+ break;
1274
+ case 'Se':
1275
+ for (const retorna of this.buscarRetornosEmSe(declaracao)) {
1276
+ retornasEncontrados.push(retorna);
1277
+ }
1278
+ break;
1279
+ default:
1280
+ break;
1281
+ }
1282
+ return retornasEncontrados;
1283
+ }
1213
1284
  corpoDaFuncao(tipo) {
1214
1285
  // O parêntese esquerdo é considerado o símbolo inicial para
1215
1286
  // fins de pragma.
@@ -1226,6 +1297,31 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1226
1297
  }
1227
1298
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
1228
1299
  const corpo = this.blocoEscopo();
1300
+ let expressoesRetorna = [];
1301
+ for (const declaracao of corpo) {
1302
+ expressoesRetorna = expressoesRetorna.concat(this.buscarRetornos(declaracao));
1303
+ }
1304
+ if (tipoRetorno === 'vazio' && expressoesRetorna.length > 0) {
1305
+ const retornosNaoVazios = expressoesRetorna.filter(e => e.tipo !== 'vazio');
1306
+ if (retornosNaoVazios.length > 0) {
1307
+ throw this.erro(retornosNaoVazios[0].simboloChave, `Função declara explicitamente 'vazio', mas usa expressão 'retorna' com tipo de retorno diferente de vazio.`);
1308
+ }
1309
+ }
1310
+ const tiposRetornos = new Set(expressoesRetorna.map(e => e.tipo));
1311
+ // if (tiposRetornos.size > 1 && !tiposRetornos.has('qualquer')) {
1312
+ if (tiposRetornos.size > 1 && tipoRetorno !== 'qualquer') {
1313
+ let tiposEncontrados = Array.from(tiposRetornos).reduce((acumulador, valor) => acumulador += valor + ', ', '');
1314
+ tiposEncontrados = tiposEncontrados.slice(0, -2);
1315
+ throw this.erro(parenteseEsquerdo, `Função retorna valores com mais de um tipo. Tipo esperado: ${tipoRetorno}. Tipos encontrados: ${tiposEncontrados}.`);
1316
+ }
1317
+ tiposRetornos.delete('qualquer');
1318
+ if (tipoRetorno === 'qualquer' && tiposRetornos.size === 1) {
1319
+ // Se o tipo de retorno é 'qualquer', seja implícito ou explícito,
1320
+ // este avaliador sintático pode restringir o tipo baseado nos retornos
1321
+ // encontrados nos blocos internos da função.
1322
+ const tipoRetornoDeduzido = tiposRetornos.values().next().value;
1323
+ tipoRetorno = tipoRetornoDeduzido;
1324
+ }
1229
1325
  return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno);
1230
1326
  }
1231
1327
  declaracaoDeClasse() {
@@ -1234,6 +1330,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1234
1330
  let superClasse = null;
1235
1331
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
1236
1332
  const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
1333
+ // TODO: Colocar tipo aqui?
1237
1334
  superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
1238
1335
  }
1239
1336
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
@@ -1367,7 +1464,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1367
1464
  if (Array.isArray(retornoDeclaracao)) {
1368
1465
  declaracoes = declaracoes.concat(retornoDeclaracao);
1369
1466
  }
1370
- else {
1467
+ else if (retornoDeclaracao !== null) {
1371
1468
  declaracoes.push(retornoDeclaracao);
1372
1469
  }
1373
1470
  }
@@ -1703,7 +1800,7 @@ class AvaliadorSintaticoEguaClassico {
1703
1800
  else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
1704
1801
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, 0, expressao.entidadeChamada, expressao.indice, valor);
1705
1802
  }
1706
- this.erro(igual, 'Tarefa de atribuição inválida');
1803
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
1707
1804
  }
1708
1805
  return expressao;
1709
1806
  }
@@ -1800,14 +1897,14 @@ class AvaliadorSintaticoEguaClassico {
1800
1897
  }
1801
1898
  declaracaoSustar() {
1802
1899
  if (this.blocos < 1) {
1803
- this.erro(this.simboloAnterior(), "'pausa' deve estar dentro de um loop.");
1900
+ throw this.erro(this.simboloAnterior(), "'pausa' deve estar dentro de um loop.");
1804
1901
  }
1805
1902
  this.consumir(egua_classico_1.default.PONTO_E_VIRGULA, "Esperado ';' após 'pausa'.");
1806
1903
  return new declaracoes_1.Sustar(this.simboloAtual());
1807
1904
  }
1808
1905
  declaracaoContinua() {
1809
1906
  if (this.blocos < 1) {
1810
- this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
1907
+ throw this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
1811
1908
  }
1812
1909
  this.consumir(egua_classico_1.default.PONTO_E_VIRGULA, "Esperado ';' após 'continua'.");
1813
1910
  return new declaracoes_1.Continua(this.simboloAtual());
@@ -1958,7 +2055,7 @@ class AvaliadorSintaticoEguaClassico {
1958
2055
  if (!this.verificarTipoSimboloAtual(egua_classico_1.default.PARENTESE_DIREITO)) {
1959
2056
  do {
1960
2057
  if (parametros.length >= 255) {
1961
- this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2058
+ throw this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
1962
2059
  }
1963
2060
  const parametro = {};
1964
2061
  if (this.simboloAtual().tipo === egua_classico_1.default.MULTIPLICACAO) {
@@ -2373,13 +2470,13 @@ class AvaliadorSintaticoPitugues {
2373
2470
  const simbolo = expressao.simbolo;
2374
2471
  return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
2375
2472
  }
2376
- else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
2473
+ if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
2377
2474
  return new construtos_1.DefinirValor(this.hashArquivo, 0, expressao.objeto, expressao.simbolo, valor);
2378
2475
  }
2379
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2476
+ if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2380
2477
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, 0, expressao.entidadeChamada, expressao.indice, valor);
2381
2478
  }
2382
- this.erro(igual, 'Tarefa de atribuição inválida');
2479
+ throw this.erro(igual, 'Tarefa de atribuição inválida');
2383
2480
  }
2384
2481
  return expressao;
2385
2482
  }
@@ -2432,7 +2529,7 @@ class AvaliadorSintaticoPitugues {
2432
2529
  let espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
2433
2530
  const espacosIndentacaoLinhaAnterior = this.pragmas[simboloAnterior.linha].espacosIndentacao;
2434
2531
  if (espacosIndentacaoLinhaAtual <= espacosIndentacaoLinhaAnterior) {
2435
- this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
2532
+ throw this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
2436
2533
  `Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
2437
2534
  `Atual: ${espacosIndentacaoLinhaAtual}`);
2438
2535
  }
@@ -2566,13 +2663,13 @@ class AvaliadorSintaticoPitugues {
2566
2663
  }
2567
2664
  declaracaoSustar() {
2568
2665
  if (this.blocos < 1) {
2569
- this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
2666
+ throw this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
2570
2667
  }
2571
2668
  return new declaracoes_1.Sustar(this.simboloAtual());
2572
2669
  }
2573
2670
  declaracaoContinua() {
2574
2671
  if (this.blocos < 1) {
2575
- this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
2672
+ throw this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
2576
2673
  }
2577
2674
  return new declaracoes_1.Continua(this.simboloAtual());
2578
2675
  }
@@ -2701,7 +2798,7 @@ class AvaliadorSintaticoPitugues {
2701
2798
  const parametros = [];
2702
2799
  do {
2703
2800
  if (parametros.length >= 255) {
2704
- this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2801
+ throw this.erro(this.simboloAtual(), 'Função não pode ter mais de 255 parâmetros.');
2705
2802
  }
2706
2803
  const parametro = {};
2707
2804
  if (this.simboloAtual().tipo === pitugues_1.default.MULTIPLICACAO) {
@@ -2847,7 +2944,7 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
2847
2944
  else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
2848
2945
  return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
2849
2946
  }
2850
- this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
2947
+ throw this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
2851
2948
  }
2852
2949
  return expressao;
2853
2950
  }
@@ -2907,7 +3004,7 @@ class AvaliadorSintaticoPortugolIpt extends avaliador_sintatico_base_1.Avaliador
2907
3004
  const literalInicializacao = this.consumir(portugol_ipt_1.default.INTEIRO, 'Esperado literal inteiro após símbolo de igual em declaração de variável.');
2908
3005
  valorInicializacao = Number(literalInicializacao.literal);
2909
3006
  }
2910
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao)));
3007
+ inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao, 'inteiro')));
2911
3008
  } while (this.verificarSeSimboloAtualEIgualA(portugol_ipt_1.default.VIRGULA));
2912
3009
  return inicializacoes;
2913
3010
  }
@@ -4118,11 +4215,12 @@ exports.AcessoMetodoOuPropriedade = void 0;
4118
4215
  * classe.
4119
4216
  */
4120
4217
  class AcessoMetodoOuPropriedade {
4121
- constructor(hashArquivo, objeto, simbolo) {
4218
+ constructor(hashArquivo, objeto, simbolo, tipo = 'qualquer') {
4122
4219
  this.linha = objeto.linha;
4123
4220
  this.hashArquivo = hashArquivo;
4124
4221
  this.objeto = objeto;
4125
4222
  this.simbolo = simbolo;
4223
+ this.tipo = objeto.tipo || tipo;
4126
4224
  }
4127
4225
  async aceitar(visitante) {
4128
4226
  return await visitante.visitarExpressaoAcessoMetodo(this);
@@ -4144,6 +4242,7 @@ class Agrupamento {
4144
4242
  this.linha = linha;
4145
4243
  this.hashArquivo = hashArquivo;
4146
4244
  this.expressao = expressao;
4245
+ this.tipo = expressao.tipo;
4147
4246
  }
4148
4247
  async aceitar(visitante) {
4149
4248
  return await visitante.visitarExpressaoAgrupamento(this);
@@ -4263,6 +4362,7 @@ class Binario {
4263
4362
  if (['numero', 'número'].includes(this.esquerda.tipo) || ['numero', 'número'].includes(this.direita.tipo)) {
4264
4363
  return 'número';
4265
4364
  }
4365
+ return 'qualquer';
4266
4366
  }
4267
4367
  async aceitar(visitante) {
4268
4368
  return await visitante.visitarExpressaoBinaria(this);
@@ -5058,11 +5158,16 @@ const declaracao_1 = require("./declaracao");
5058
5158
  * Uma declaração de constante.
5059
5159
  */
5060
5160
  class Const extends declaracao_1.Declaracao {
5061
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5161
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5062
5162
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5063
5163
  this.simbolo = simbolo;
5064
5164
  this.inicializador = inicializador;
5065
- this.tipo = tipo;
5165
+ if (tipo !== 'qualquer') {
5166
+ this.tipo = tipo;
5167
+ }
5168
+ else {
5169
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5170
+ }
5066
5171
  }
5067
5172
  async aceitar(visitante) {
5068
5173
  return await visitante.visitarDeclaracaoConst(this);
@@ -5230,8 +5335,11 @@ exports.Fazer = Fazer;
5230
5335
  Object.defineProperty(exports, "__esModule", { value: true });
5231
5336
  exports.FuncaoDeclaracao = void 0;
5232
5337
  const declaracao_1 = require("./declaracao");
5338
+ /**
5339
+ * Uma declaração de função.
5340
+ */
5233
5341
  class FuncaoDeclaracao extends declaracao_1.Declaracao {
5234
- constructor(simbolo, funcao, tipoRetorno, decoradores = []) {
5342
+ constructor(simbolo, funcao, tipoRetorno = 'qualquer', decoradores = []) {
5235
5343
  super(Number(simbolo.linha), simbolo.hashArquivo);
5236
5344
  this.simbolo = simbolo;
5237
5345
  this.funcao = funcao;
@@ -5443,7 +5551,13 @@ class Retorna extends declaracao_1.Declaracao {
5443
5551
  constructor(simboloChave, valor) {
5444
5552
  super(Number(simboloChave.linha), simboloChave.hashArquivo);
5445
5553
  this.simboloChave = simboloChave;
5446
- this.valor = valor;
5554
+ if (valor) {
5555
+ this.valor = valor;
5556
+ this.tipo = valor.tipo;
5557
+ }
5558
+ else {
5559
+ this.tipo = 'vazio';
5560
+ }
5447
5561
  }
5448
5562
  async aceitar(visitante) {
5449
5563
  return await visitante.visitarExpressaoRetornar(this);
@@ -5561,11 +5675,16 @@ const declaracao_1 = require("./declaracao");
5561
5675
  * Uma declaração de variável.
5562
5676
  */
5563
5677
  class Var extends declaracao_1.Declaracao {
5564
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5678
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5565
5679
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5566
5680
  this.simbolo = simbolo;
5567
5681
  this.inicializador = inicializador;
5568
- this.tipo = tipo;
5682
+ if (tipo !== 'qualquer') {
5683
+ this.tipo = tipo;
5684
+ }
5685
+ else {
5686
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5687
+ }
5569
5688
  this.referencia = false;
5570
5689
  this.desestruturacao = false;
5571
5690
  }
@@ -6958,7 +7077,7 @@ var TipoNativoSimbolo;
6958
7077
  TipoNativoSimbolo["VAZIO"] = "<palavra reservada vazio ajuda=\"palavra reservada usada para definir fun\u00E7\u00F5es que n\u00E3o retornam valores\">";
6959
7078
  })(TipoNativoSimbolo || (exports.TipoNativoSimbolo = TipoNativoSimbolo = {}));
6960
7079
  function inferirVetor(vetor) {
6961
- const tiposEmVetor = new Set(vetor.map((elemento) => typeof elemento));
7080
+ const tiposEmVetor = new Set(vetor.map((elemento) => elemento.constructor.name));
6962
7081
  if (tiposEmVetor.size > 1) {
6963
7082
  return 'vetor';
6964
7083
  }
@@ -6978,62 +7097,73 @@ function inferirVetor(vetor) {
6978
7097
  return 'vetor';
6979
7098
  }
6980
7099
  return `${tiposObjetosEmVetor.values().next().value}[]`;
7100
+ case 'Literal':
7101
+ // TODO: Não sei se é seguro inferir pelo primeiro valor do vetor.
7102
+ return `${vetor[0].tipo}[]`;
6981
7103
  default:
6982
7104
  return 'vetor';
6983
7105
  }
6984
7106
  }
6985
7107
  function inferirTipoVariavel(variavel) {
6986
- const tipo = typeof variavel;
7108
+ if (variavel === null) {
7109
+ return 'nulo';
7110
+ }
7111
+ const tipo = variavel.constructor.name;
6987
7112
  switch (tipo) {
7113
+ case 'String':
6988
7114
  case 'string':
6989
7115
  return 'texto';
7116
+ case 'Number':
6990
7117
  case 'number':
6991
7118
  return 'número';
6992
7119
  case 'bigint':
6993
7120
  return 'longo';
7121
+ case 'Boolean':
6994
7122
  case 'boolean':
6995
7123
  return 'lógico';
6996
7124
  case 'undefined':
6997
7125
  return 'nulo';
7126
+ case 'Object':
6998
7127
  case 'object':
6999
- if (Array.isArray(variavel)) {
7000
- return inferirVetor(variavel);
7001
- }
7002
7128
  if (variavel === null)
7003
7129
  return 'nulo';
7004
- if (variavel.constructor.name === 'DeleguaFuncao')
7005
- return 'função';
7006
- if (variavel.constructor.name === 'DeleguaModulo')
7007
- return 'módulo';
7008
- if (variavel.constructor.name === 'Classe')
7009
- return 'objeto';
7010
- if (variavel.constructor.name === 'Simbolo') {
7011
- if (typeof variavel === 'object') {
7012
- const simbolo = variavel;
7013
- if (simbolo.tipo === delegua_2.default.ESCREVA)
7014
- return TipoNativoSimbolo.ESCREVA;
7015
- if (simbolo.tipo === delegua_2.default.FUNCAO || simbolo.tipo === delegua_2.default.FUNÇÃO)
7016
- return TipoNativoSimbolo.FUNCAO;
7017
- if (simbolo.tipo === delegua_2.default.LEIA)
7018
- return TipoNativoSimbolo.LEIA;
7019
- if (simbolo.tipo === delegua_2.default.SE)
7020
- return TipoNativoSimbolo.SE;
7021
- if (simbolo.tipo === delegua_2.default.ENQUANTO)
7022
- return TipoNativoSimbolo.ENQUANTO;
7023
- if (simbolo.tipo === delegua_2.default.PARA)
7024
- return TipoNativoSimbolo.PARA;
7025
- if (simbolo.tipo === delegua_2.default.RETORNA)
7026
- return TipoNativoSimbolo.RETORNA;
7027
- if (simbolo.tipo === primitivos_1.default.TEXTO)
7028
- return TipoNativoSimbolo.TEXTO;
7029
- if (simbolo.tipo === primitivos_1.default.BOOLEANO)
7030
- return TipoNativoSimbolo.BOOLEANO;
7031
- if (simbolo.tipo === delegua_1.default.VAZIO)
7032
- return TipoNativoSimbolo.VAZIO;
7033
- }
7034
- }
7035
7130
  return 'dicionário';
7131
+ case 'Array':
7132
+ case 'Vetor':
7133
+ return inferirVetor(variavel);
7134
+ case 'DeleguaFuncao':
7135
+ return 'função';
7136
+ case 'DeleguaModulo':
7137
+ return 'módulo';
7138
+ case 'Classe':
7139
+ return 'objeto';
7140
+ case 'Simbolo': // TODO: Repensar.
7141
+ const simbolo = variavel;
7142
+ switch (simbolo.tipo) {
7143
+ case primitivos_1.default.BOOLEANO:
7144
+ return TipoNativoSimbolo.BOOLEANO;
7145
+ case delegua_2.default.ENQUANTO:
7146
+ return TipoNativoSimbolo.ENQUANTO;
7147
+ case delegua_2.default.ESCREVA:
7148
+ return TipoNativoSimbolo.ESCREVA;
7149
+ case delegua_2.default.FUNCAO:
7150
+ case delegua_2.default.FUNÇÃO:
7151
+ return TipoNativoSimbolo.FUNCAO;
7152
+ case delegua_2.default.LEIA:
7153
+ return TipoNativoSimbolo.LEIA;
7154
+ case delegua_2.default.PARA:
7155
+ return TipoNativoSimbolo.PARA;
7156
+ case delegua_2.default.RETORNA:
7157
+ return TipoNativoSimbolo.RETORNA;
7158
+ case delegua_2.default.SE:
7159
+ return TipoNativoSimbolo.SE;
7160
+ case primitivos_1.default.TEXTO:
7161
+ return TipoNativoSimbolo.TEXTO;
7162
+ case delegua_1.default.VAZIO:
7163
+ return TipoNativoSimbolo.VAZIO;
7164
+ }
7036
7165
  case 'function':
7166
+ case 'FuncaoPadrao':
7037
7167
  return 'função';
7038
7168
  case 'symbol':
7039
7169
  return 'símbolo';
@@ -7643,6 +7773,10 @@ class InterpretadorBase {
7643
7773
  : String(NaN);
7644
7774
  if (this.tiposNumericos.includes(tipoDireita) && this.tiposNumericos.includes(tipoEsquerda))
7645
7775
  return;
7776
+ if (this.tiposNumericos.includes(tipoEsquerda) && tipoDireita === 'qualquer')
7777
+ return;
7778
+ if (this.tiposNumericos.includes(tipoDireita) && tipoEsquerda === 'qualquer')
7779
+ return;
7646
7780
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
7647
7781
  }
7648
7782
  async visitarExpressaoBinaria(expressao) {
@@ -7681,6 +7815,11 @@ class InterpretadorBase {
7681
7815
  if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
7682
7816
  return Number(valorEsquerdo) + Number(valorDireito);
7683
7817
  }
7818
+ // TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
7819
+ // tradicionais do JavaScript?
7820
+ if (tipoEsquerdo === 'qualquer' || tipoDireito === 'qualquer') {
7821
+ return valorEsquerdo + valorDireito;
7822
+ }
7684
7823
  return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
7685
7824
  case delegua_1.default.DIVISAO:
7686
7825
  case delegua_1.default.DIVISAO_IGUAL:
@@ -9343,6 +9482,9 @@ class PilhaEscoposExecucao {
9343
9482
  if (variavel && variavel.hasOwnProperty('tipo')) {
9344
9483
  tipoVariavel = variavel.tipo;
9345
9484
  }
9485
+ else if (valor && valor.constructor.name === 'DeleguaFuncao') {
9486
+ tipoVariavel = 'função';
9487
+ }
9346
9488
  else if (tipo) {
9347
9489
  tipoVariavel = tipo;
9348
9490
  }
@@ -9391,7 +9533,10 @@ class PilhaEscoposExecucao {
9391
9533
  if (variavel.imutavel) {
9392
9534
  throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Constante '${simbolo.lexema}' não pode receber novos valores.`);
9393
9535
  }
9394
- const tipo = (variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : (0, inferenciador_1.inferirTipoVariavel)(valor)).toLowerCase();
9536
+ const tipoInferido = variavel && variavel.hasOwnProperty('tipo') && variavel.tipo ?
9537
+ variavel.tipo :
9538
+ (0, inferenciador_1.inferirTipoVariavel)(valor);
9539
+ const tipo = tipoInferido.toLowerCase();
9395
9540
  const valorResolvido = this.converterValor(tipo, valor);
9396
9541
  if (indice !== undefined && indice !== null) {
9397
9542
  if (variavel.valor instanceof Array) {
@@ -11274,6 +11419,9 @@ class Lexador {
11274
11419
  this.atual = 0;
11275
11420
  this.linha = 0;
11276
11421
  this.codigo = codigo || [''];
11422
+ if (codigo.length === 0) {
11423
+ this.codigo = [''];
11424
+ }
11277
11425
  this.hashArquivo = hashArquivo;
11278
11426
  for (let iterador = 0; iterador < this.codigo.length; iterador++) {
11279
11427
  this.codigo[iterador] += '\0';
@@ -24661,9 +24809,12 @@ class TradutorAssemblyScript {
24661
24809
  case 'texto':
24662
24810
  return ': string';
24663
24811
  case 'inteiro':
24812
+ case 'numero':
24813
+ case 'número':
24664
24814
  case 'real':
24665
24815
  return ': f64';
24666
24816
  case 'logico':
24817
+ case 'lógico':
24667
24818
  return ': bool';
24668
24819
  case 'nulo':
24669
24820
  return ': null';
@@ -24673,6 +24824,7 @@ class TradutorAssemblyScript {
24673
24824
  case 'texto[]':
24674
24825
  return ': string[]';
24675
24826
  case 'logico[]':
24827
+ case 'lógico[]':
24676
24828
  return ': bool[]';
24677
24829
  default:
24678
24830
  return ': any';