@designliquido/delegua 0.38.2 → 0.38.4

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 (75) hide show
  1. package/README.md +2 -0
  2. package/analisador-semantico/analisador-semantico.d.ts +1 -2
  3. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  4. package/analisador-semantico/analisador-semantico.js +2 -2
  5. package/analisador-semantico/analisador-semantico.js.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  7. package/avaliador-sintatico/avaliador-sintatico-base.js +3 -2
  8. package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
  10. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  11. package/avaliador-sintatico/avaliador-sintatico.js +111 -15
  12. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +4 -4
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
  16. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  17. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +7 -7
  18. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  19. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  20. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -2
  21. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  22. package/bibliotecas/primitivas-vetor.d.ts +5 -1
  23. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  24. package/bibliotecas/primitivas-vetor.js +3 -1
  25. package/bibliotecas/primitivas-vetor.js.map +1 -1
  26. package/bin/package.json +1 -1
  27. package/construtos/acesso-metodo-ou-propriedade.d.ts +2 -1
  28. package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
  29. package/construtos/acesso-metodo-ou-propriedade.js +2 -1
  30. package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
  31. package/construtos/agrupamento.d.ts +1 -0
  32. package/construtos/agrupamento.d.ts.map +1 -1
  33. package/construtos/agrupamento.js +1 -0
  34. package/construtos/agrupamento.js.map +1 -1
  35. package/construtos/binario.d.ts.map +1 -1
  36. package/construtos/binario.js +1 -0
  37. package/construtos/binario.js.map +1 -1
  38. package/declaracoes/const.d.ts +2 -3
  39. package/declaracoes/const.d.ts.map +1 -1
  40. package/declaracoes/const.js +7 -2
  41. package/declaracoes/const.js.map +1 -1
  42. package/declaracoes/funcao.d.ts +5 -2
  43. package/declaracoes/funcao.d.ts.map +1 -1
  44. package/declaracoes/funcao.js +4 -1
  45. package/declaracoes/funcao.js.map +1 -1
  46. package/declaracoes/retorna.d.ts +4 -2
  47. package/declaracoes/retorna.d.ts.map +1 -1
  48. package/declaracoes/retorna.js +7 -1
  49. package/declaracoes/retorna.js.map +1 -1
  50. package/declaracoes/var.d.ts +2 -3
  51. package/declaracoes/var.d.ts.map +1 -1
  52. package/declaracoes/var.js +7 -2
  53. package/declaracoes/var.js.map +1 -1
  54. package/inferenciador.d.ts +1 -1
  55. package/inferenciador.d.ts.map +1 -1
  56. package/inferenciador.js +47 -36
  57. package/inferenciador.js.map +1 -1
  58. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  59. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
  60. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  61. package/interpretador/interpretador-base.d.ts.map +1 -1
  62. package/interpretador/interpretador-base.js +15 -0
  63. package/interpretador/interpretador-base.js.map +1 -1
  64. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  65. package/interpretador/pilha-escopos-execucao.js +9 -3
  66. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  67. package/lexador/lexador.d.ts.map +1 -1
  68. package/lexador/lexador.js +3 -0
  69. package/lexador/lexador.js.map +1 -1
  70. package/package.json +1 -1
  71. package/tipo-dados-elementar.d.ts.map +1 -1
  72. package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
  73. package/tradutores/tradutor-assemblyscript.js +4 -0
  74. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  75. package/umd/delegua.js +237 -77
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
  }
@@ -650,7 +657,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
650
657
  do {
651
658
  simboloComentario = this.avancarEDevolverAnterior();
652
659
  conteudos.push(simboloComentario.literal);
653
- } while (simboloComentario.tipo === delegua_2.default.LINHA_COMENTARIO);
660
+ } while (this.verificarTipoSimboloAtual(delegua_2.default.LINHA_COMENTARIO));
654
661
  return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, conteudos, true);
655
662
  }
656
663
  declaracaoComentarioUmaLinha() {
@@ -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
  }
@@ -4064,7 +4161,9 @@ exports.default = {
4064
4161
  let elemento = vetor.pop();
4065
4162
  return Promise.resolve(elemento);
4066
4163
  },
4067
- somar: (interpretador, vetor) => Promise.resolve(vetor.reduce((a, b) => a + b)),
4164
+ somar: (interpretador, vetor) => {
4165
+ return Promise.resolve(vetor.reduce((acc, item) => acc + (typeof item === 'number' ? item : item.valor), 0));
4166
+ },
4068
4167
  tamanho: (interpretador, vetor) => Promise.resolve(vetor.length),
4069
4168
  };
4070
4169
 
@@ -4118,11 +4217,12 @@ exports.AcessoMetodoOuPropriedade = void 0;
4118
4217
  * classe.
4119
4218
  */
4120
4219
  class AcessoMetodoOuPropriedade {
4121
- constructor(hashArquivo, objeto, simbolo) {
4220
+ constructor(hashArquivo, objeto, simbolo, tipo = 'qualquer') {
4122
4221
  this.linha = objeto.linha;
4123
4222
  this.hashArquivo = hashArquivo;
4124
4223
  this.objeto = objeto;
4125
4224
  this.simbolo = simbolo;
4225
+ this.tipo = objeto.tipo || tipo;
4126
4226
  }
4127
4227
  async aceitar(visitante) {
4128
4228
  return await visitante.visitarExpressaoAcessoMetodo(this);
@@ -4144,6 +4244,7 @@ class Agrupamento {
4144
4244
  this.linha = linha;
4145
4245
  this.hashArquivo = hashArquivo;
4146
4246
  this.expressao = expressao;
4247
+ this.tipo = expressao.tipo;
4147
4248
  }
4148
4249
  async aceitar(visitante) {
4149
4250
  return await visitante.visitarExpressaoAgrupamento(this);
@@ -4263,6 +4364,7 @@ class Binario {
4263
4364
  if (['numero', 'número'].includes(this.esquerda.tipo) || ['numero', 'número'].includes(this.direita.tipo)) {
4264
4365
  return 'número';
4265
4366
  }
4367
+ return 'qualquer';
4266
4368
  }
4267
4369
  async aceitar(visitante) {
4268
4370
  return await visitante.visitarExpressaoBinaria(this);
@@ -5058,11 +5160,16 @@ const declaracao_1 = require("./declaracao");
5058
5160
  * Uma declaração de constante.
5059
5161
  */
5060
5162
  class Const extends declaracao_1.Declaracao {
5061
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5163
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5062
5164
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5063
5165
  this.simbolo = simbolo;
5064
5166
  this.inicializador = inicializador;
5065
- this.tipo = tipo;
5167
+ if (tipo !== 'qualquer') {
5168
+ this.tipo = tipo;
5169
+ }
5170
+ else {
5171
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5172
+ }
5066
5173
  }
5067
5174
  async aceitar(visitante) {
5068
5175
  return await visitante.visitarDeclaracaoConst(this);
@@ -5230,8 +5337,11 @@ exports.Fazer = Fazer;
5230
5337
  Object.defineProperty(exports, "__esModule", { value: true });
5231
5338
  exports.FuncaoDeclaracao = void 0;
5232
5339
  const declaracao_1 = require("./declaracao");
5340
+ /**
5341
+ * Uma declaração de função.
5342
+ */
5233
5343
  class FuncaoDeclaracao extends declaracao_1.Declaracao {
5234
- constructor(simbolo, funcao, tipoRetorno, decoradores = []) {
5344
+ constructor(simbolo, funcao, tipoRetorno = 'qualquer', decoradores = []) {
5235
5345
  super(Number(simbolo.linha), simbolo.hashArquivo);
5236
5346
  this.simbolo = simbolo;
5237
5347
  this.funcao = funcao;
@@ -5443,7 +5553,13 @@ class Retorna extends declaracao_1.Declaracao {
5443
5553
  constructor(simboloChave, valor) {
5444
5554
  super(Number(simboloChave.linha), simboloChave.hashArquivo);
5445
5555
  this.simboloChave = simboloChave;
5446
- this.valor = valor;
5556
+ if (valor) {
5557
+ this.valor = valor;
5558
+ this.tipo = valor.tipo;
5559
+ }
5560
+ else {
5561
+ this.tipo = 'vazio';
5562
+ }
5447
5563
  }
5448
5564
  async aceitar(visitante) {
5449
5565
  return await visitante.visitarExpressaoRetornar(this);
@@ -5561,11 +5677,16 @@ const declaracao_1 = require("./declaracao");
5561
5677
  * Uma declaração de variável.
5562
5678
  */
5563
5679
  class Var extends declaracao_1.Declaracao {
5564
- constructor(simbolo, inicializador, tipo = undefined, decoradores = []) {
5680
+ constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
5565
5681
  super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
5566
5682
  this.simbolo = simbolo;
5567
5683
  this.inicializador = inicializador;
5568
- this.tipo = tipo;
5684
+ if (tipo !== 'qualquer') {
5685
+ this.tipo = tipo;
5686
+ }
5687
+ else {
5688
+ this.tipo = (inicializador === null || inicializador === void 0 ? void 0 : inicializador.tipo) || tipo;
5689
+ }
5569
5690
  this.referencia = false;
5570
5691
  this.desestruturacao = false;
5571
5692
  }
@@ -6958,7 +7079,7 @@ var TipoNativoSimbolo;
6958
7079
  TipoNativoSimbolo["VAZIO"] = "<palavra reservada vazio ajuda=\"palavra reservada usada para definir fun\u00E7\u00F5es que n\u00E3o retornam valores\">";
6959
7080
  })(TipoNativoSimbolo || (exports.TipoNativoSimbolo = TipoNativoSimbolo = {}));
6960
7081
  function inferirVetor(vetor) {
6961
- const tiposEmVetor = new Set(vetor.map((elemento) => typeof elemento));
7082
+ const tiposEmVetor = new Set(vetor.map((elemento) => elemento.constructor.name));
6962
7083
  if (tiposEmVetor.size > 1) {
6963
7084
  return 'vetor';
6964
7085
  }
@@ -6978,62 +7099,73 @@ function inferirVetor(vetor) {
6978
7099
  return 'vetor';
6979
7100
  }
6980
7101
  return `${tiposObjetosEmVetor.values().next().value}[]`;
7102
+ case 'Literal':
7103
+ // TODO: Não sei se é seguro inferir pelo primeiro valor do vetor.
7104
+ return `${vetor[0].tipo}[]`;
6981
7105
  default:
6982
7106
  return 'vetor';
6983
7107
  }
6984
7108
  }
6985
7109
  function inferirTipoVariavel(variavel) {
6986
- const tipo = typeof variavel;
7110
+ if (variavel === null) {
7111
+ return 'nulo';
7112
+ }
7113
+ const tipo = variavel.constructor.name;
6987
7114
  switch (tipo) {
7115
+ case 'String':
6988
7116
  case 'string':
6989
7117
  return 'texto';
7118
+ case 'Number':
6990
7119
  case 'number':
6991
7120
  return 'número';
6992
7121
  case 'bigint':
6993
7122
  return 'longo';
7123
+ case 'Boolean':
6994
7124
  case 'boolean':
6995
7125
  return 'lógico';
6996
7126
  case 'undefined':
6997
7127
  return 'nulo';
7128
+ case 'Object':
6998
7129
  case 'object':
6999
- if (Array.isArray(variavel)) {
7000
- return inferirVetor(variavel);
7001
- }
7002
7130
  if (variavel === null)
7003
7131
  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
7132
  return 'dicionário';
7133
+ case 'Array':
7134
+ case 'Vetor':
7135
+ return inferirVetor(variavel);
7136
+ case 'DeleguaFuncao':
7137
+ return 'função';
7138
+ case 'DeleguaModulo':
7139
+ return 'módulo';
7140
+ case 'Classe':
7141
+ return 'objeto';
7142
+ case 'Simbolo': // TODO: Repensar.
7143
+ const simbolo = variavel;
7144
+ switch (simbolo.tipo) {
7145
+ case primitivos_1.default.BOOLEANO:
7146
+ return TipoNativoSimbolo.BOOLEANO;
7147
+ case delegua_2.default.ENQUANTO:
7148
+ return TipoNativoSimbolo.ENQUANTO;
7149
+ case delegua_2.default.ESCREVA:
7150
+ return TipoNativoSimbolo.ESCREVA;
7151
+ case delegua_2.default.FUNCAO:
7152
+ case delegua_2.default.FUNÇÃO:
7153
+ return TipoNativoSimbolo.FUNCAO;
7154
+ case delegua_2.default.LEIA:
7155
+ return TipoNativoSimbolo.LEIA;
7156
+ case delegua_2.default.PARA:
7157
+ return TipoNativoSimbolo.PARA;
7158
+ case delegua_2.default.RETORNA:
7159
+ return TipoNativoSimbolo.RETORNA;
7160
+ case delegua_2.default.SE:
7161
+ return TipoNativoSimbolo.SE;
7162
+ case primitivos_1.default.TEXTO:
7163
+ return TipoNativoSimbolo.TEXTO;
7164
+ case delegua_1.default.VAZIO:
7165
+ return TipoNativoSimbolo.VAZIO;
7166
+ }
7036
7167
  case 'function':
7168
+ case 'FuncaoPadrao':
7037
7169
  return 'função';
7038
7170
  case 'symbol':
7039
7171
  return 'símbolo';
@@ -7643,6 +7775,10 @@ class InterpretadorBase {
7643
7775
  : String(NaN);
7644
7776
  if (this.tiposNumericos.includes(tipoDireita) && this.tiposNumericos.includes(tipoEsquerda))
7645
7777
  return;
7778
+ if (this.tiposNumericos.includes(tipoEsquerda) && tipoDireita === 'qualquer')
7779
+ return;
7780
+ if (this.tiposNumericos.includes(tipoDireita) && tipoEsquerda === 'qualquer')
7781
+ return;
7646
7782
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
7647
7783
  }
7648
7784
  async visitarExpressaoBinaria(expressao) {
@@ -7681,6 +7817,11 @@ class InterpretadorBase {
7681
7817
  if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
7682
7818
  return Number(valorEsquerdo) + Number(valorDireito);
7683
7819
  }
7820
+ // TODO: Se tipo for 'qualquer', seria uma boa confiar nos operadores
7821
+ // tradicionais do JavaScript?
7822
+ if (tipoEsquerdo === 'qualquer' || tipoDireito === 'qualquer') {
7823
+ return valorEsquerdo + valorDireito;
7824
+ }
7684
7825
  return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
7685
7826
  case delegua_1.default.DIVISAO:
7686
7827
  case delegua_1.default.DIVISAO_IGUAL:
@@ -8310,6 +8451,8 @@ class InterpretadorBase {
8310
8451
  objeto instanceof estruturas_1.DeleguaFuncao ||
8311
8452
  objeto instanceof estruturas_1.DescritorTipoClasse ||
8312
8453
  objeto instanceof estruturas_1.DeleguaModulo) {
8454
+ if (objeto[valorIndice] === 0)
8455
+ return 0;
8313
8456
  return objeto[valorIndice] || null;
8314
8457
  }
8315
8458
  if (typeof objeto === primitivos_1.default.TEXTO) {
@@ -8537,6 +8680,10 @@ class InterpretadorBase {
8537
8680
  if (Array.isArray(objeto)) {
8538
8681
  let retornoVetor = '[';
8539
8682
  for (let elemento of objeto) {
8683
+ if (typeof elemento === 'object') {
8684
+ retornoVetor += `${JSON.stringify(elemento)}, `;
8685
+ continue;
8686
+ }
8540
8687
  retornoVetor += typeof elemento === 'string' ? `'${elemento}', ` : `${this.paraTexto(elemento)}, `;
8541
8688
  }
8542
8689
  if (retornoVetor.length > 1) {
@@ -9343,6 +9490,9 @@ class PilhaEscoposExecucao {
9343
9490
  if (variavel && variavel.hasOwnProperty('tipo')) {
9344
9491
  tipoVariavel = variavel.tipo;
9345
9492
  }
9493
+ else if (valor && valor.constructor.name === 'DeleguaFuncao') {
9494
+ tipoVariavel = 'função';
9495
+ }
9346
9496
  else if (tipo) {
9347
9497
  tipoVariavel = tipo;
9348
9498
  }
@@ -9391,14 +9541,17 @@ class PilhaEscoposExecucao {
9391
9541
  if (variavel.imutavel) {
9392
9542
  throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Constante '${simbolo.lexema}' não pode receber novos valores.`);
9393
9543
  }
9394
- const tipo = (variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : (0, inferenciador_1.inferirTipoVariavel)(valor)).toLowerCase();
9544
+ const tipoInferido = variavel && variavel.hasOwnProperty('tipo') && variavel.tipo ?
9545
+ variavel.tipo :
9546
+ (0, inferenciador_1.inferirTipoVariavel)(valor);
9547
+ const tipo = tipoInferido.toLowerCase();
9395
9548
  const valorResolvido = this.converterValor(tipo, valor);
9396
9549
  if (indice !== undefined && indice !== null) {
9397
- if (variavel.valor instanceof Array) {
9550
+ if (variavel.valor instanceof Array || variavel.valor instanceof Object) {
9398
9551
  variavel.valor[indice] = valorResolvido;
9399
9552
  }
9400
9553
  else {
9401
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor.');
9554
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, 'Variável não é um vetor ou dicionário.');
9402
9555
  }
9403
9556
  }
9404
9557
  else {
@@ -11274,6 +11427,9 @@ class Lexador {
11274
11427
  this.atual = 0;
11275
11428
  this.linha = 0;
11276
11429
  this.codigo = codigo || [''];
11430
+ if (codigo.length === 0) {
11431
+ this.codigo = [''];
11432
+ }
11277
11433
  this.hashArquivo = hashArquivo;
11278
11434
  for (let iterador = 0; iterador < this.codigo.length; iterador++) {
11279
11435
  this.codigo[iterador] += '\0';
@@ -24661,9 +24817,12 @@ class TradutorAssemblyScript {
24661
24817
  case 'texto':
24662
24818
  return ': string';
24663
24819
  case 'inteiro':
24820
+ case 'numero':
24821
+ case 'número':
24664
24822
  case 'real':
24665
24823
  return ': f64';
24666
24824
  case 'logico':
24825
+ case 'lógico':
24667
24826
  return ': bool';
24668
24827
  case 'nulo':
24669
24828
  return ': null';
@@ -24673,6 +24832,7 @@ class TradutorAssemblyScript {
24673
24832
  case 'texto[]':
24674
24833
  return ': string[]';
24675
24834
  case 'logico[]':
24835
+ case 'lógico[]':
24676
24836
  return ': bool[]';
24677
24837
  default:
24678
24838
  return ': any';