@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.
- package/README.md +2 -0
- package/analisador-semantico/analisador-semantico.d.ts +1 -2
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +2 -2
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +3 -2
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +10 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +111 -15
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +4 -4
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +7 -7
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts +5 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +3 -1
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/acesso-metodo-ou-propriedade.d.ts +2 -1
- package/construtos/acesso-metodo-ou-propriedade.d.ts.map +1 -1
- package/construtos/acesso-metodo-ou-propriedade.js +2 -1
- package/construtos/acesso-metodo-ou-propriedade.js.map +1 -1
- package/construtos/agrupamento.d.ts +1 -0
- package/construtos/agrupamento.d.ts.map +1 -1
- package/construtos/agrupamento.js +1 -0
- package/construtos/agrupamento.js.map +1 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +1 -0
- package/construtos/binario.js.map +1 -1
- package/declaracoes/const.d.ts +2 -3
- package/declaracoes/const.d.ts.map +1 -1
- package/declaracoes/const.js +7 -2
- package/declaracoes/const.js.map +1 -1
- package/declaracoes/funcao.d.ts +5 -2
- package/declaracoes/funcao.d.ts.map +1 -1
- package/declaracoes/funcao.js +4 -1
- package/declaracoes/funcao.js.map +1 -1
- package/declaracoes/retorna.d.ts +4 -2
- package/declaracoes/retorna.d.ts.map +1 -1
- package/declaracoes/retorna.js +7 -1
- package/declaracoes/retorna.js.map +1 -1
- package/declaracoes/var.d.ts +2 -3
- package/declaracoes/var.d.ts.map +1 -1
- package/declaracoes/var.js +7 -2
- package/declaracoes/var.js.map +1 -1
- package/inferenciador.d.ts +1 -1
- package/inferenciador.d.ts.map +1 -1
- package/inferenciador.js +47 -36
- package/inferenciador.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +15 -0
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +9 -3
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +3 -0
- package/lexador/lexador.js.map +1 -1
- package/package.json +1 -1
- package/tipo-dados-elementar.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +4 -0
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- 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
|
-
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 (
|
|
1157
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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) =>
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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) =>
|
|
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
|
-
|
|
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
|
|
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';
|