@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.
- 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 +110 -14
- 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/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 +9 -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 +7 -1
- 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 +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
|
-
|
|
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 =
|
|
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
|
}
|
|
@@ -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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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) =>
|
|
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
|
-
|
|
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
|
|
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';
|