@designliquido/delegua 0.38.1 → 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 +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/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 +3 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +17 -0
- package/construtos/binario.js.map +1 -1
- package/construtos/construto.d.ts +1 -0
- package/construtos/construto.d.ts.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 +242 -74
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();
|
|
@@ -514,7 +521,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
514
521
|
let expressao = this.bitOu();
|
|
515
522
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
|
|
516
523
|
const operador = this.simbolos[this.atual - 1];
|
|
517
|
-
const direito = this.bitOu();
|
|
524
|
+
const direito = this.bitOu();
|
|
518
525
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
519
526
|
}
|
|
520
527
|
return expressao;
|
|
@@ -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);
|
|
@@ -4242,11 +4341,28 @@ exports.Binario = void 0;
|
|
|
4242
4341
|
*/
|
|
4243
4342
|
class Binario {
|
|
4244
4343
|
constructor(hashArquivo, esquerda, operador, direita) {
|
|
4344
|
+
this.tipo = 'qualquer';
|
|
4245
4345
|
this.linha = esquerda.linha;
|
|
4246
4346
|
this.hashArquivo = hashArquivo;
|
|
4247
4347
|
this.esquerda = esquerda;
|
|
4248
4348
|
this.operador = operador;
|
|
4249
4349
|
this.direita = direita;
|
|
4350
|
+
this.tipo = this.deduzirTipo();
|
|
4351
|
+
}
|
|
4352
|
+
deduzirTipo() {
|
|
4353
|
+
if (['logico', 'lógico'].includes(this.esquerda.tipo) || ['logico', 'lógico'].includes(this.direita.tipo)) {
|
|
4354
|
+
return 'lógico';
|
|
4355
|
+
}
|
|
4356
|
+
if (this.esquerda.tipo === 'texto' || this.direita.tipo === 'texto') {
|
|
4357
|
+
return 'texto';
|
|
4358
|
+
}
|
|
4359
|
+
if (this.esquerda.tipo === 'inteiro' && this.direita.tipo === 'inteiro') {
|
|
4360
|
+
return 'inteiro';
|
|
4361
|
+
}
|
|
4362
|
+
if (['numero', 'número'].includes(this.esquerda.tipo) || ['numero', 'número'].includes(this.direita.tipo)) {
|
|
4363
|
+
return 'número';
|
|
4364
|
+
}
|
|
4365
|
+
return 'qualquer';
|
|
4250
4366
|
}
|
|
4251
4367
|
async aceitar(visitante) {
|
|
4252
4368
|
return await visitante.visitarExpressaoBinaria(this);
|
|
@@ -5042,11 +5158,16 @@ const declaracao_1 = require("./declaracao");
|
|
|
5042
5158
|
* Uma declaração de constante.
|
|
5043
5159
|
*/
|
|
5044
5160
|
class Const extends declaracao_1.Declaracao {
|
|
5045
|
-
constructor(simbolo, inicializador, tipo =
|
|
5161
|
+
constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
|
|
5046
5162
|
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5047
5163
|
this.simbolo = simbolo;
|
|
5048
5164
|
this.inicializador = inicializador;
|
|
5049
|
-
|
|
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
|
+
}
|
|
5050
5171
|
}
|
|
5051
5172
|
async aceitar(visitante) {
|
|
5052
5173
|
return await visitante.visitarDeclaracaoConst(this);
|
|
@@ -5214,8 +5335,11 @@ exports.Fazer = Fazer;
|
|
|
5214
5335
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5215
5336
|
exports.FuncaoDeclaracao = void 0;
|
|
5216
5337
|
const declaracao_1 = require("./declaracao");
|
|
5338
|
+
/**
|
|
5339
|
+
* Uma declaração de função.
|
|
5340
|
+
*/
|
|
5217
5341
|
class FuncaoDeclaracao extends declaracao_1.Declaracao {
|
|
5218
|
-
constructor(simbolo, funcao, tipoRetorno, decoradores = []) {
|
|
5342
|
+
constructor(simbolo, funcao, tipoRetorno = 'qualquer', decoradores = []) {
|
|
5219
5343
|
super(Number(simbolo.linha), simbolo.hashArquivo);
|
|
5220
5344
|
this.simbolo = simbolo;
|
|
5221
5345
|
this.funcao = funcao;
|
|
@@ -5427,7 +5551,13 @@ class Retorna extends declaracao_1.Declaracao {
|
|
|
5427
5551
|
constructor(simboloChave, valor) {
|
|
5428
5552
|
super(Number(simboloChave.linha), simboloChave.hashArquivo);
|
|
5429
5553
|
this.simboloChave = simboloChave;
|
|
5430
|
-
|
|
5554
|
+
if (valor) {
|
|
5555
|
+
this.valor = valor;
|
|
5556
|
+
this.tipo = valor.tipo;
|
|
5557
|
+
}
|
|
5558
|
+
else {
|
|
5559
|
+
this.tipo = 'vazio';
|
|
5560
|
+
}
|
|
5431
5561
|
}
|
|
5432
5562
|
async aceitar(visitante) {
|
|
5433
5563
|
return await visitante.visitarExpressaoRetornar(this);
|
|
@@ -5545,11 +5675,16 @@ const declaracao_1 = require("./declaracao");
|
|
|
5545
5675
|
* Uma declaração de variável.
|
|
5546
5676
|
*/
|
|
5547
5677
|
class Var extends declaracao_1.Declaracao {
|
|
5548
|
-
constructor(simbolo, inicializador, tipo =
|
|
5678
|
+
constructor(simbolo, inicializador, tipo = 'qualquer', decoradores = []) {
|
|
5549
5679
|
super(Number(simbolo.linha), simbolo.hashArquivo, decoradores);
|
|
5550
5680
|
this.simbolo = simbolo;
|
|
5551
5681
|
this.inicializador = inicializador;
|
|
5552
|
-
|
|
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
|
+
}
|
|
5553
5688
|
this.referencia = false;
|
|
5554
5689
|
this.desestruturacao = false;
|
|
5555
5690
|
}
|
|
@@ -6942,7 +7077,7 @@ var TipoNativoSimbolo;
|
|
|
6942
7077
|
TipoNativoSimbolo["VAZIO"] = "<palavra reservada vazio ajuda=\"palavra reservada usada para definir fun\u00E7\u00F5es que n\u00E3o retornam valores\">";
|
|
6943
7078
|
})(TipoNativoSimbolo || (exports.TipoNativoSimbolo = TipoNativoSimbolo = {}));
|
|
6944
7079
|
function inferirVetor(vetor) {
|
|
6945
|
-
const tiposEmVetor = new Set(vetor.map((elemento) =>
|
|
7080
|
+
const tiposEmVetor = new Set(vetor.map((elemento) => elemento.constructor.name));
|
|
6946
7081
|
if (tiposEmVetor.size > 1) {
|
|
6947
7082
|
return 'vetor';
|
|
6948
7083
|
}
|
|
@@ -6962,62 +7097,73 @@ function inferirVetor(vetor) {
|
|
|
6962
7097
|
return 'vetor';
|
|
6963
7098
|
}
|
|
6964
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}[]`;
|
|
6965
7103
|
default:
|
|
6966
7104
|
return 'vetor';
|
|
6967
7105
|
}
|
|
6968
7106
|
}
|
|
6969
7107
|
function inferirTipoVariavel(variavel) {
|
|
6970
|
-
|
|
7108
|
+
if (variavel === null) {
|
|
7109
|
+
return 'nulo';
|
|
7110
|
+
}
|
|
7111
|
+
const tipo = variavel.constructor.name;
|
|
6971
7112
|
switch (tipo) {
|
|
7113
|
+
case 'String':
|
|
6972
7114
|
case 'string':
|
|
6973
7115
|
return 'texto';
|
|
7116
|
+
case 'Number':
|
|
6974
7117
|
case 'number':
|
|
6975
7118
|
return 'número';
|
|
6976
7119
|
case 'bigint':
|
|
6977
7120
|
return 'longo';
|
|
7121
|
+
case 'Boolean':
|
|
6978
7122
|
case 'boolean':
|
|
6979
7123
|
return 'lógico';
|
|
6980
7124
|
case 'undefined':
|
|
6981
7125
|
return 'nulo';
|
|
7126
|
+
case 'Object':
|
|
6982
7127
|
case 'object':
|
|
6983
|
-
if (Array.isArray(variavel)) {
|
|
6984
|
-
return inferirVetor(variavel);
|
|
6985
|
-
}
|
|
6986
7128
|
if (variavel === null)
|
|
6987
7129
|
return 'nulo';
|
|
6988
|
-
if (variavel.constructor.name === 'DeleguaFuncao')
|
|
6989
|
-
return 'função';
|
|
6990
|
-
if (variavel.constructor.name === 'DeleguaModulo')
|
|
6991
|
-
return 'módulo';
|
|
6992
|
-
if (variavel.constructor.name === 'Classe')
|
|
6993
|
-
return 'objeto';
|
|
6994
|
-
if (variavel.constructor.name === 'Simbolo') {
|
|
6995
|
-
if (typeof variavel === 'object') {
|
|
6996
|
-
const simbolo = variavel;
|
|
6997
|
-
if (simbolo.tipo === delegua_2.default.ESCREVA)
|
|
6998
|
-
return TipoNativoSimbolo.ESCREVA;
|
|
6999
|
-
if (simbolo.tipo === delegua_2.default.FUNCAO || simbolo.tipo === delegua_2.default.FUNÇÃO)
|
|
7000
|
-
return TipoNativoSimbolo.FUNCAO;
|
|
7001
|
-
if (simbolo.tipo === delegua_2.default.LEIA)
|
|
7002
|
-
return TipoNativoSimbolo.LEIA;
|
|
7003
|
-
if (simbolo.tipo === delegua_2.default.SE)
|
|
7004
|
-
return TipoNativoSimbolo.SE;
|
|
7005
|
-
if (simbolo.tipo === delegua_2.default.ENQUANTO)
|
|
7006
|
-
return TipoNativoSimbolo.ENQUANTO;
|
|
7007
|
-
if (simbolo.tipo === delegua_2.default.PARA)
|
|
7008
|
-
return TipoNativoSimbolo.PARA;
|
|
7009
|
-
if (simbolo.tipo === delegua_2.default.RETORNA)
|
|
7010
|
-
return TipoNativoSimbolo.RETORNA;
|
|
7011
|
-
if (simbolo.tipo === primitivos_1.default.TEXTO)
|
|
7012
|
-
return TipoNativoSimbolo.TEXTO;
|
|
7013
|
-
if (simbolo.tipo === primitivos_1.default.BOOLEANO)
|
|
7014
|
-
return TipoNativoSimbolo.BOOLEANO;
|
|
7015
|
-
if (simbolo.tipo === delegua_1.default.VAZIO)
|
|
7016
|
-
return TipoNativoSimbolo.VAZIO;
|
|
7017
|
-
}
|
|
7018
|
-
}
|
|
7019
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
|
+
}
|
|
7020
7165
|
case 'function':
|
|
7166
|
+
case 'FuncaoPadrao':
|
|
7021
7167
|
return 'função';
|
|
7022
7168
|
case 'symbol':
|
|
7023
7169
|
return 'símbolo';
|
|
@@ -7627,6 +7773,10 @@ class InterpretadorBase {
|
|
|
7627
7773
|
: String(NaN);
|
|
7628
7774
|
if (this.tiposNumericos.includes(tipoDireita) && this.tiposNumericos.includes(tipoEsquerda))
|
|
7629
7775
|
return;
|
|
7776
|
+
if (this.tiposNumericos.includes(tipoEsquerda) && tipoDireita === 'qualquer')
|
|
7777
|
+
return;
|
|
7778
|
+
if (this.tiposNumericos.includes(tipoDireita) && tipoEsquerda === 'qualquer')
|
|
7779
|
+
return;
|
|
7630
7780
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
7631
7781
|
}
|
|
7632
7782
|
async visitarExpressaoBinaria(expressao) {
|
|
@@ -7665,6 +7815,11 @@ class InterpretadorBase {
|
|
|
7665
7815
|
if (this.tiposNumericos.includes(tipoEsquerdo) && this.tiposNumericos.includes(tipoDireito)) {
|
|
7666
7816
|
return Number(valorEsquerdo) + Number(valorDireito);
|
|
7667
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
|
+
}
|
|
7668
7823
|
return this.paraTexto(valorEsquerdo) + this.paraTexto(valorDireito);
|
|
7669
7824
|
case delegua_1.default.DIVISAO:
|
|
7670
7825
|
case delegua_1.default.DIVISAO_IGUAL:
|
|
@@ -9327,6 +9482,9 @@ class PilhaEscoposExecucao {
|
|
|
9327
9482
|
if (variavel && variavel.hasOwnProperty('tipo')) {
|
|
9328
9483
|
tipoVariavel = variavel.tipo;
|
|
9329
9484
|
}
|
|
9485
|
+
else if (valor && valor.constructor.name === 'DeleguaFuncao') {
|
|
9486
|
+
tipoVariavel = 'função';
|
|
9487
|
+
}
|
|
9330
9488
|
else if (tipo) {
|
|
9331
9489
|
tipoVariavel = tipo;
|
|
9332
9490
|
}
|
|
@@ -9375,7 +9533,10 @@ class PilhaEscoposExecucao {
|
|
|
9375
9533
|
if (variavel.imutavel) {
|
|
9376
9534
|
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Constante '${simbolo.lexema}' não pode receber novos valores.`);
|
|
9377
9535
|
}
|
|
9378
|
-
const
|
|
9536
|
+
const tipoInferido = variavel && variavel.hasOwnProperty('tipo') && variavel.tipo ?
|
|
9537
|
+
variavel.tipo :
|
|
9538
|
+
(0, inferenciador_1.inferirTipoVariavel)(valor);
|
|
9539
|
+
const tipo = tipoInferido.toLowerCase();
|
|
9379
9540
|
const valorResolvido = this.converterValor(tipo, valor);
|
|
9380
9541
|
if (indice !== undefined && indice !== null) {
|
|
9381
9542
|
if (variavel.valor instanceof Array) {
|
|
@@ -11258,6 +11419,9 @@ class Lexador {
|
|
|
11258
11419
|
this.atual = 0;
|
|
11259
11420
|
this.linha = 0;
|
|
11260
11421
|
this.codigo = codigo || [''];
|
|
11422
|
+
if (codigo.length === 0) {
|
|
11423
|
+
this.codigo = [''];
|
|
11424
|
+
}
|
|
11261
11425
|
this.hashArquivo = hashArquivo;
|
|
11262
11426
|
for (let iterador = 0; iterador < this.codigo.length; iterador++) {
|
|
11263
11427
|
this.codigo[iterador] += '\0';
|
|
@@ -24645,9 +24809,12 @@ class TradutorAssemblyScript {
|
|
|
24645
24809
|
case 'texto':
|
|
24646
24810
|
return ': string';
|
|
24647
24811
|
case 'inteiro':
|
|
24812
|
+
case 'numero':
|
|
24813
|
+
case 'número':
|
|
24648
24814
|
case 'real':
|
|
24649
24815
|
return ': f64';
|
|
24650
24816
|
case 'logico':
|
|
24817
|
+
case 'lógico':
|
|
24651
24818
|
return ': bool';
|
|
24652
24819
|
case 'nulo':
|
|
24653
24820
|
return ': null';
|
|
@@ -24657,6 +24824,7 @@ class TradutorAssemblyScript {
|
|
|
24657
24824
|
case 'texto[]':
|
|
24658
24825
|
return ': string[]';
|
|
24659
24826
|
case 'logico[]':
|
|
24827
|
+
case 'lógico[]':
|
|
24660
24828
|
return ': bool[]';
|
|
24661
24829
|
default:
|
|
24662
24830
|
return ': any';
|