@designliquido/delegua 1.23.3 → 1.23.5
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.map +1 -1
- package/analisador-semantico/analisador-semantico.js +1 -3
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +3 -0
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +16 -5
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +45 -23
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +9 -6
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +98 -27
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +15 -0
- package/construtos/binario.js.map +1 -1
- package/interpretador/depuracao/comum.js +1 -1
- package/interpretador/depuracao/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +2 -2
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +15 -25
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts +1 -1
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +21 -8
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +10 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +92 -31
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +2 -7
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +41 -47
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/lexador.d.ts +15 -13
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +52 -17
- package/lexador/lexador.js.map +1 -1
- package/package.json +1 -1
- package/umd/delegua.js +384 -164
package/umd/delegua.js
CHANGED
|
@@ -712,9 +712,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
|
|
|
712
712
|
}
|
|
713
713
|
async visitarExpressaoDeChamada(expressao) {
|
|
714
714
|
for (const argumento of expressao.argumentos) {
|
|
715
|
-
|
|
716
|
-
this.gerenciadorEscopos.marcarComoUsada(argumento.simbolo.lexema);
|
|
717
|
-
}
|
|
715
|
+
this.marcarVariaveisUsadasEmExpressao(argumento);
|
|
718
716
|
}
|
|
719
717
|
switch (expressao.entidadeChamada.constructor) {
|
|
720
718
|
case construtos_1.AcessoMetodo:
|
|
@@ -2247,15 +2245,26 @@ class AvaliadorSintaticoBase {
|
|
|
2247
2245
|
declaracaoDeVariaveis() {
|
|
2248
2246
|
throw new Error('Método não implementado.');
|
|
2249
2247
|
}
|
|
2250
|
-
|
|
2251
|
-
|
|
2248
|
+
validacaoComparacao(operador, esquerda, direita) { }
|
|
2249
|
+
criarConstrutoComparacao(esquerda, operador, direita) {
|
|
2250
|
+
return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
|
|
2251
|
+
}
|
|
2252
|
+
async logicaComumComparacao(metodoProximoNivel) {
|
|
2253
|
+
let expressao = await metodoProximoNivel();
|
|
2252
2254
|
while (this.verificarSeSimboloAtualEIgualA(comum_1.default.MAIOR, comum_1.default.MAIOR_IGUAL, comum_1.default.MENOR, comum_1.default.MENOR_IGUAL)) {
|
|
2253
|
-
const operador = this.
|
|
2254
|
-
|
|
2255
|
-
|
|
2255
|
+
const operador = this.simboloAnterior
|
|
2256
|
+
? this.simboloAnterior()
|
|
2257
|
+
: this.simbolos[this.atual - 1];
|
|
2258
|
+
const esquerda = expressao;
|
|
2259
|
+
const direita = await metodoProximoNivel();
|
|
2260
|
+
this.validacaoComparacao(operador, esquerda, direita);
|
|
2261
|
+
expressao = this.criarConstrutoComparacao(esquerda, operador, direita);
|
|
2256
2262
|
}
|
|
2257
2263
|
return expressao;
|
|
2258
2264
|
}
|
|
2265
|
+
async comparar() {
|
|
2266
|
+
return await this.logicaComumComparacao(() => this.adicaoOuSubtracao());
|
|
2267
|
+
}
|
|
2259
2268
|
async comparacaoIgualdade() {
|
|
2260
2269
|
let expressao = await this.comparar();
|
|
2261
2270
|
while (this.verificarSeSimboloAtualEIgualA(comum_1.default.DIFERENTE, comum_1.default.IGUAL, comum_1.default.IGUAL_IGUAL)) {
|
|
@@ -2775,7 +2784,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2775
2784
|
this.avancarEDevolverAnterior();
|
|
2776
2785
|
valores = [];
|
|
2777
2786
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.COLCHETE_DIREITO)) {
|
|
2778
|
-
return new construtos_1.Vetor(this.hashArquivo,
|
|
2787
|
+
return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 'qualquer[]');
|
|
2779
2788
|
}
|
|
2780
2789
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
2781
2790
|
return this.construtoTupla();
|
|
@@ -2810,21 +2819,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2810
2819
|
const valoresSemComentarios = valores.filter((v) => v.constructor !== construtos_1.ComentarioComoConstruto);
|
|
2811
2820
|
let elementoSeparador = false; // O primeiro elemento não pode ser separador.
|
|
2812
2821
|
for (const elemento of valoresSemComentarios) {
|
|
2822
|
+
const simboloErro = elemento.simbolo || simboloAtual;
|
|
2813
2823
|
if (elementoSeparador) {
|
|
2814
2824
|
if (elemento.constructor !== construtos_1.Separador) {
|
|
2815
|
-
throw this.erro(
|
|
2825
|
+
throw this.erro(simboloErro, 'Os itens dos vetores devem ser separados através de uma vírgula.');
|
|
2816
2826
|
}
|
|
2817
2827
|
elementoSeparador = false;
|
|
2818
2828
|
}
|
|
2819
2829
|
else {
|
|
2820
2830
|
if (elemento.constructor === construtos_1.Separador) {
|
|
2821
|
-
throw this.erro(
|
|
2831
|
+
throw this.erro(simboloErro, 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
|
|
2822
2832
|
}
|
|
2823
2833
|
elementoSeparador = true;
|
|
2824
2834
|
}
|
|
2825
2835
|
}
|
|
2826
2836
|
const valoresSemSeparadores = valoresSemComentarios.filter((v) => v.constructor !== construtos_1.Separador);
|
|
2827
|
-
|
|
2837
|
+
let tipoVetor;
|
|
2838
|
+
if (valoresSemSeparadores.length === 0) {
|
|
2839
|
+
tipoVetor = 'qualquer[]';
|
|
2840
|
+
}
|
|
2841
|
+
else {
|
|
2842
|
+
const primeiroElemento = valoresSemSeparadores[0];
|
|
2843
|
+
if (primeiroElemento instanceof construtos_1.Vetor) {
|
|
2844
|
+
tipoVetor = primeiroElemento.tipo + '[]';
|
|
2845
|
+
}
|
|
2846
|
+
else {
|
|
2847
|
+
tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresSemSeparadores);
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2828
2850
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, tipoVetor);
|
|
2829
2851
|
case delegua_2.default.ENQUANTO:
|
|
2830
2852
|
this.avancarEDevolverAnterior();
|
|
@@ -3509,16 +3531,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
3509
3531
|
}
|
|
3510
3532
|
return expressao;
|
|
3511
3533
|
}
|
|
3534
|
+
validacaoComparacao(operador, esquerda, direita) {
|
|
3535
|
+
this.verificarOperandosComparacao(operador, esquerda, direita);
|
|
3536
|
+
}
|
|
3537
|
+
criarConstrutoComparacao(esquerda, operador, direita) {
|
|
3538
|
+
return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
|
|
3539
|
+
}
|
|
3512
3540
|
async comparar() {
|
|
3513
|
-
|
|
3514
|
-
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
|
|
3515
|
-
const operador = this.simbolos[this.atual - 1];
|
|
3516
|
-
const esquerda = expressao;
|
|
3517
|
-
const direito = await this.bitOu();
|
|
3518
|
-
this.verificarOperandosComparacao(operador, esquerda, direito);
|
|
3519
|
-
expressao = new construtos_1.Binario(this.hashArquivo, esquerda, operador, direito);
|
|
3520
|
-
}
|
|
3521
|
-
return expressao;
|
|
3541
|
+
return await this.logicaComumComparacao(() => this.bitOu());
|
|
3522
3542
|
}
|
|
3523
3543
|
async comparacaoIgualdade() {
|
|
3524
3544
|
let expressao = await this.comparar();
|
|
@@ -4241,17 +4261,28 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
4241
4261
|
}
|
|
4242
4262
|
switch (inicializador.constructor) {
|
|
4243
4263
|
case construtos_1.AcessoIndiceVariavel:
|
|
4244
|
-
const
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4264
|
+
const acessoAtual = inicializador;
|
|
4265
|
+
let entidade = acessoAtual.entidadeChamada;
|
|
4266
|
+
let numeroIndices = 1;
|
|
4267
|
+
// Percorre a cadeia de acessos aninhados para contar quantos índices existem
|
|
4268
|
+
// Cada índice consome um nível de vetor, então removemos um '[]' por acesso.
|
|
4269
|
+
while (entidade.constructor === construtos_1.AcessoIndiceVariavel) {
|
|
4270
|
+
numeroIndices++;
|
|
4271
|
+
entidade = entidade
|
|
4272
|
+
.entidadeChamada;
|
|
4273
|
+
}
|
|
4274
|
+
const tipoBase = entidade.tipo;
|
|
4275
|
+
if (tipoBase.endsWith('[]')) {
|
|
4276
|
+
let tipoResultante = tipoBase;
|
|
4277
|
+
for (let i = 0; i < numeroIndices; i++) {
|
|
4278
|
+
if (tipoResultante.endsWith('[]')) {
|
|
4279
|
+
tipoResultante = tipoResultante.slice(0, -2);
|
|
4280
|
+
}
|
|
4281
|
+
else
|
|
4282
|
+
break;
|
|
4283
|
+
}
|
|
4284
|
+
return tipoResultante;
|
|
4253
4285
|
}
|
|
4254
|
-
// Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
|
|
4255
4286
|
return 'qualquer';
|
|
4256
4287
|
case construtos_1.Chamada:
|
|
4257
4288
|
const entidadeChamadaChamada = inicializador.entidadeChamada;
|
|
@@ -6312,6 +6343,7 @@ const primitivas_numero_1 = __importDefault(require("../../bibliotecas/primitiva
|
|
|
6312
6343
|
const primitivas_texto_1 = __importDefault(require("../../bibliotecas/primitivas-texto"));
|
|
6313
6344
|
const primitivas_vetor_1 = __importDefault(require("../../bibliotecas/primitivas-vetor"));
|
|
6314
6345
|
const primitivas_tupla_1 = __importDefault(require("../../bibliotecas/dialetos/pitugues/primitivas-tupla"));
|
|
6346
|
+
const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
|
|
6315
6347
|
/**
|
|
6316
6348
|
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
6317
6349
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
@@ -6320,8 +6352,9 @@ const primitivas_tupla_1 = __importDefault(require("../../bibliotecas/dialetos/p
|
|
|
6320
6352
|
* A grande diferença entre este avaliador e os demais é a forma como são entendidos os blocos de escopo.
|
|
6321
6353
|
* Este avaliador espera uma estrutura de pragmas, que explica quantos espaços há na frente de cada linha.
|
|
6322
6354
|
*/
|
|
6323
|
-
class AvaliadorSintaticoPitugues {
|
|
6355
|
+
class AvaliadorSintaticoPitugues extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
6324
6356
|
constructor(performance = false) {
|
|
6357
|
+
super();
|
|
6325
6358
|
this.atual = 0;
|
|
6326
6359
|
this.blocos = 0;
|
|
6327
6360
|
this.performance = performance;
|
|
@@ -6374,14 +6407,27 @@ class AvaliadorSintaticoPitugues {
|
|
|
6374
6407
|
return tipoPrevio;
|
|
6375
6408
|
switch (inicializador.constructor) {
|
|
6376
6409
|
case construtos_1.AcessoIndiceVariavel:
|
|
6377
|
-
const
|
|
6378
|
-
|
|
6379
|
-
|
|
6380
|
-
|
|
6381
|
-
|
|
6382
|
-
|
|
6383
|
-
|
|
6384
|
-
|
|
6410
|
+
const acessoAtual = inicializador;
|
|
6411
|
+
let entidade = acessoAtual.entidadeChamada;
|
|
6412
|
+
let numeroIndices = 1;
|
|
6413
|
+
// Percorre acessos aninhados como `vetor[1][2]` contando quantos índices foram aplicados.
|
|
6414
|
+
// Cada índice consome um nível de vetor, então removemos um '[]' por acesso.
|
|
6415
|
+
while (entidade.constructor === construtos_1.AcessoIndiceVariavel) {
|
|
6416
|
+
numeroIndices++;
|
|
6417
|
+
entidade = entidade
|
|
6418
|
+
.entidadeChamada;
|
|
6419
|
+
}
|
|
6420
|
+
const tipoBase = entidade.tipo;
|
|
6421
|
+
if (tipoBase.endsWith('[]')) {
|
|
6422
|
+
let tipoResultante = tipoBase;
|
|
6423
|
+
for (let i = 0; i < numeroIndices; i++) {
|
|
6424
|
+
if (tipoResultante.endsWith('[]')) {
|
|
6425
|
+
tipoResultante = tipoResultante.slice(0, -2);
|
|
6426
|
+
}
|
|
6427
|
+
else
|
|
6428
|
+
break;
|
|
6429
|
+
}
|
|
6430
|
+
return tipoResultante;
|
|
6385
6431
|
}
|
|
6386
6432
|
// Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
|
|
6387
6433
|
return 'qualquer';
|
|
@@ -6807,6 +6853,9 @@ class AvaliadorSintaticoPitugues {
|
|
|
6807
6853
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
|
|
6808
6854
|
return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, [], 'qualquer[]');
|
|
6809
6855
|
}
|
|
6856
|
+
if (this.verificarTipoSimboloAtual(pitugues_2.default.VIRGULA)) {
|
|
6857
|
+
throw this.erro(this.simboloAtual(), 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
|
|
6858
|
+
}
|
|
6810
6859
|
// Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
|
|
6811
6860
|
// de lista serão tratados como 'qualquer', para evitar erros de tipo.
|
|
6812
6861
|
this.intuirTipoQualquerParaIdentificadores = true;
|
|
@@ -6817,13 +6866,35 @@ class AvaliadorSintaticoPitugues {
|
|
|
6817
6866
|
}
|
|
6818
6867
|
// Aqui já sabemos que não é uma compreensão de lista.
|
|
6819
6868
|
const valoresVetor = [retornoExpressaoOuPrimeiroValor];
|
|
6869
|
+
this.ignorarComentarios();
|
|
6820
6870
|
while (!this.verificarSeSimboloAtualEIgualA(pitugues_2.default.COLCHETE_DIREITO)) {
|
|
6821
|
-
this.
|
|
6822
|
-
|
|
6823
|
-
|
|
6824
|
-
|
|
6871
|
+
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.VIRGULA)) {
|
|
6872
|
+
this.ignorarComentarios();
|
|
6873
|
+
if (this.verificarTipoSimboloAtual(pitugues_2.default.VIRGULA)) {
|
|
6874
|
+
throw this.erro(this.simboloAtual(), 'Não podem haver duas vírgulas seguidas em uma definição de vetor, ou definição de vetor começando em vírgula.');
|
|
6875
|
+
}
|
|
6876
|
+
}
|
|
6877
|
+
else {
|
|
6878
|
+
throw this.erro(this.simboloAtual() || simboloAtual, 'Os itens dos vetores devem ser separados através de uma vírgula.');
|
|
6879
|
+
}
|
|
6880
|
+
if (!this.verificarTipoSimboloAtual(pitugues_2.default.COLCHETE_DIREITO)) {
|
|
6881
|
+
valoresVetor.push(await this.atribuir());
|
|
6882
|
+
this.ignorarComentarios();
|
|
6883
|
+
}
|
|
6884
|
+
}
|
|
6885
|
+
let tipoVetor;
|
|
6886
|
+
if (valoresVetor.length === 0) {
|
|
6887
|
+
tipoVetor = 'qualquer[]';
|
|
6888
|
+
}
|
|
6889
|
+
else {
|
|
6890
|
+
const primeiroElemento = valoresVetor[0];
|
|
6891
|
+
if (primeiroElemento instanceof construtos_1.Vetor) {
|
|
6892
|
+
tipoVetor = primeiroElemento.tipo + '[]';
|
|
6893
|
+
}
|
|
6894
|
+
else {
|
|
6895
|
+
tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresVetor);
|
|
6896
|
+
}
|
|
6825
6897
|
}
|
|
6826
|
-
const tipoVetor = (0, inferenciador_1.inferirTipoVariavel)(valoresVetor);
|
|
6827
6898
|
return new construtos_1.Vetor(this.hashArquivo, simboloAtual.linha, valoresVetor, tipoVetor);
|
|
6828
6899
|
case pitugues_2.default.COMENTARIO:
|
|
6829
6900
|
const simboloComentario = this.avancarEDevolverAnterior();
|
|
@@ -7048,14 +7119,42 @@ class AvaliadorSintaticoPitugues {
|
|
|
7048
7119
|
}
|
|
7049
7120
|
return expressao;
|
|
7050
7121
|
}
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
|
|
7054
|
-
|
|
7055
|
-
|
|
7056
|
-
|
|
7122
|
+
eOperadorDeComparacao(tipo) {
|
|
7123
|
+
return [
|
|
7124
|
+
pitugues_2.default.MAIOR,
|
|
7125
|
+
pitugues_2.default.MAIOR_IGUAL,
|
|
7126
|
+
pitugues_2.default.MENOR,
|
|
7127
|
+
pitugues_2.default.MENOR_IGUAL
|
|
7128
|
+
].includes(tipo);
|
|
7129
|
+
}
|
|
7130
|
+
criarConstrutoComparacao(esquerda, operador, direita) {
|
|
7131
|
+
let operandoCentral = null;
|
|
7132
|
+
// Lógica de desugaring para comparações encadeadas (ex: 1 < x < 10)
|
|
7133
|
+
if (esquerda instanceof construtos_1.Binario &&
|
|
7134
|
+
this.eOperadorDeComparacao(esquerda.operador.tipo)) {
|
|
7135
|
+
operandoCentral = esquerda.direita;
|
|
7136
|
+
}
|
|
7137
|
+
else if (esquerda instanceof construtos_1.Logico &&
|
|
7138
|
+
esquerda.direita instanceof construtos_1.Binario &&
|
|
7139
|
+
this.eOperadorDeComparacao(esquerda.direita.operador.tipo)) {
|
|
7140
|
+
operandoCentral = esquerda.direita.direita;
|
|
7141
|
+
}
|
|
7142
|
+
if (operandoCentral !== null) {
|
|
7143
|
+
const operadorE = {
|
|
7144
|
+
tipo: pitugues_2.default.E,
|
|
7145
|
+
lexema: 'e',
|
|
7146
|
+
literal: null,
|
|
7147
|
+
linha: operador.linha,
|
|
7148
|
+
hashArquivo: this.hashArquivo
|
|
7149
|
+
};
|
|
7150
|
+
const novaComparacaoDireita = new construtos_1.Binario(this.hashArquivo, operandoCentral, operador, direita);
|
|
7151
|
+
return new construtos_1.Logico(this.hashArquivo, esquerda, operadorE, novaComparacaoDireita);
|
|
7057
7152
|
}
|
|
7058
|
-
|
|
7153
|
+
// Se não for encadeada, cria o Binário normal
|
|
7154
|
+
return new construtos_1.Binario(this.hashArquivo, esquerda, operador, direita);
|
|
7155
|
+
}
|
|
7156
|
+
async comparar() {
|
|
7157
|
+
return await this.logicaComumComparacao(() => this.bitOu());
|
|
7059
7158
|
}
|
|
7060
7159
|
async comparacaoIgualdade() {
|
|
7061
7160
|
let expressao = await this.comparar();
|
|
@@ -7198,7 +7297,10 @@ class AvaliadorSintaticoPitugues {
|
|
|
7198
7297
|
}
|
|
7199
7298
|
return expressao;
|
|
7200
7299
|
}
|
|
7201
|
-
async declaracaoEscreva(
|
|
7300
|
+
async declaracaoEscreva() {
|
|
7301
|
+
const simboloEscreva = this.simboloAnterior
|
|
7302
|
+
? this.simboloAnterior()
|
|
7303
|
+
: this.simbolos[this.atual - 1];
|
|
7202
7304
|
this.consumir(pitugues_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
7203
7305
|
const argumentos = [];
|
|
7204
7306
|
do {
|
|
@@ -7780,10 +7882,10 @@ class AvaliadorSintaticoPitugues {
|
|
|
7780
7882
|
this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
|
|
7781
7883
|
return definicaoClasse;
|
|
7782
7884
|
}
|
|
7783
|
-
declaracaoFalhar() {
|
|
7885
|
+
async declaracaoFalhar() {
|
|
7784
7886
|
const simboloFalha = this.simbolos[this.atual - 1];
|
|
7785
|
-
const
|
|
7786
|
-
return new declaracoes_1.Falhar(simboloFalha,
|
|
7887
|
+
const explicacao = await this.atribuir();
|
|
7888
|
+
return new declaracoes_1.Falhar(simboloFalha, explicacao);
|
|
7787
7889
|
}
|
|
7788
7890
|
/**
|
|
7789
7891
|
* Verifica se há pontos e vírgula no final de sentenças.
|
|
@@ -7889,11 +7991,11 @@ class AvaliadorSintaticoPitugues {
|
|
|
7889
7991
|
return this.declaracaoEscolha();
|
|
7890
7992
|
case pitugues_2.default.IMPRIMA:
|
|
7891
7993
|
case pitugues_2.default.ESCREVA:
|
|
7892
|
-
|
|
7893
|
-
return this.declaracaoEscreva(
|
|
7994
|
+
this.avancarEDevolverAnterior();
|
|
7995
|
+
return this.declaracaoEscreva();
|
|
7894
7996
|
case pitugues_2.default.FALHAR:
|
|
7895
7997
|
this.avancarEDevolverAnterior();
|
|
7896
|
-
return this.declaracaoFalhar();
|
|
7998
|
+
return await this.declaracaoFalhar();
|
|
7897
7999
|
case pitugues_2.default.FAZER:
|
|
7898
8000
|
this.avancarEDevolverAnterior();
|
|
7899
8001
|
return this.declaracaoFazer();
|
|
@@ -8108,7 +8210,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
8108
8210
|
}
|
|
8109
8211
|
exports.AvaliadorSintaticoPitugues = AvaliadorSintaticoPitugues;
|
|
8110
8212
|
|
|
8111
|
-
},{"../../bibliotecas/dialetos/pitugues/primitivas-tupla":30,"../../bibliotecas/primitivas-dicionario":31,"../../bibliotecas/primitivas-numero":32,"../../bibliotecas/primitivas-texto":33,"../../bibliotecas/primitivas-vetor":34,"../../construtos":67,"../../declaracoes":116,"../../inferenciador":146,"../../informacao-elemento-sintatico":147,"../../lexador":238,"../../lexador/micro-lexador-pitugues":243,"../../tipos-de-dados/dialetos/pitugues":249,"../../tipos-de-simbolos/pitugues":257,"../comum":12,"../erro-avaliador-sintatico":21,"../informacao-escopo":23,"../pilha-escopos":27,"./micro-avaliador-sintatico-pitugues":19,"browser-process-hrtime":446}],15:[function(require,module,exports){
|
|
8213
|
+
},{"../../bibliotecas/dialetos/pitugues/primitivas-tupla":30,"../../bibliotecas/primitivas-dicionario":31,"../../bibliotecas/primitivas-numero":32,"../../bibliotecas/primitivas-texto":33,"../../bibliotecas/primitivas-vetor":34,"../../construtos":67,"../../declaracoes":116,"../../inferenciador":146,"../../informacao-elemento-sintatico":147,"../../lexador":238,"../../lexador/micro-lexador-pitugues":243,"../../tipos-de-dados/dialetos/pitugues":249,"../../tipos-de-simbolos/pitugues":257,"../avaliador-sintatico-base":10,"../comum":12,"../erro-avaliador-sintatico":21,"../informacao-escopo":23,"../pilha-escopos":27,"./micro-avaliador-sintatico-pitugues":19,"browser-process-hrtime":446}],15:[function(require,module,exports){
|
|
8112
8214
|
"use strict";
|
|
8113
8215
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8114
8216
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -14341,8 +14443,12 @@ exports.Atribuir = Atribuir;
|
|
|
14341
14443
|
|
|
14342
14444
|
},{"./variavel":95}],50:[function(require,module,exports){
|
|
14343
14445
|
"use strict";
|
|
14446
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14447
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14448
|
+
};
|
|
14344
14449
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14345
14450
|
exports.Binario = void 0;
|
|
14451
|
+
const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
14346
14452
|
/**
|
|
14347
14453
|
* Binário é uma estrutura com um operador e dois operandos: esquerda e direita.
|
|
14348
14454
|
* Implementa as seguintes operações para Delégua e todos os dialetos:
|
|
@@ -14380,6 +14486,17 @@ class Binario {
|
|
|
14380
14486
|
* @returns O tipo deduzido.
|
|
14381
14487
|
*/
|
|
14382
14488
|
deduzirTipo() {
|
|
14489
|
+
if ([
|
|
14490
|
+
delegua_1.default.MAIOR,
|
|
14491
|
+
delegua_1.default.MAIOR_IGUAL,
|
|
14492
|
+
delegua_1.default.MENOR,
|
|
14493
|
+
delegua_1.default.MENOR_IGUAL,
|
|
14494
|
+
delegua_1.default.IGUAL,
|
|
14495
|
+
delegua_1.default.IGUAL_IGUAL,
|
|
14496
|
+
delegua_1.default.DIFERENTE,
|
|
14497
|
+
].includes(this.operador.tipo)) {
|
|
14498
|
+
return 'lógico';
|
|
14499
|
+
}
|
|
14383
14500
|
if (['logico', 'lógico'].includes(this.esquerda.tipo) ||
|
|
14384
14501
|
['logico', 'lógico'].includes(this.direita.tipo)) {
|
|
14385
14502
|
return 'lógico';
|
|
@@ -14411,7 +14528,7 @@ class Binario {
|
|
|
14411
14528
|
}
|
|
14412
14529
|
exports.Binario = Binario;
|
|
14413
14530
|
|
|
14414
|
-
},{}],51:[function(require,module,exports){
|
|
14531
|
+
},{"../tipos-de-simbolos/delegua":253}],51:[function(require,module,exports){
|
|
14415
14532
|
"use strict";
|
|
14416
14533
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14417
14534
|
exports.Bote = void 0;
|
|
@@ -20509,7 +20626,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
20509
20626
|
}
|
|
20510
20627
|
return argumentosResolvidos;
|
|
20511
20628
|
}
|
|
20512
|
-
resolverAmbiente(argumentos) {
|
|
20629
|
+
async resolverAmbiente(visitante, argumentos) {
|
|
20513
20630
|
const ambiente = new espaco_memoria_1.EspacoMemoria();
|
|
20514
20631
|
const parametros = this.declaracao.parametros || [];
|
|
20515
20632
|
for (let i = 0; i < parametros.length; i++) {
|
|
@@ -20525,15 +20642,28 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
20525
20642
|
};
|
|
20526
20643
|
}
|
|
20527
20644
|
else {
|
|
20528
|
-
let
|
|
20529
|
-
|
|
20530
|
-
|
|
20645
|
+
let valorFinal;
|
|
20646
|
+
const argumento = argumentos[i];
|
|
20647
|
+
const valorExtraido = (argumento && argumento.hasOwnProperty('valor'))
|
|
20648
|
+
? argumento.valor
|
|
20649
|
+
: argumento;
|
|
20650
|
+
if (i < argumentos.length &&
|
|
20651
|
+
valorExtraido !== undefined &&
|
|
20652
|
+
valorExtraido !== null) {
|
|
20653
|
+
valorFinal = valorExtraido;
|
|
20654
|
+
}
|
|
20655
|
+
else if (parametro.valorPadrao) {
|
|
20656
|
+
valorFinal = await visitante.avaliar(parametro.valorPadrao);
|
|
20657
|
+
}
|
|
20658
|
+
else {
|
|
20659
|
+
valorFinal = null;
|
|
20531
20660
|
}
|
|
20532
|
-
ambiente.valores[nome] =
|
|
20533
|
-
argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
|
|
20661
|
+
ambiente.valores[nome] = valorFinal;
|
|
20534
20662
|
// Se o argumento é `DeleguaFuncao`, para habilitar o recurso de _currying_,
|
|
20535
20663
|
// copiamos seu valor para o escopo atual. Nem sempre podemos contar com a tipagem explícita aqui.
|
|
20536
|
-
if (
|
|
20664
|
+
if (valorFinal &&
|
|
20665
|
+
typeof valorFinal === 'object' &&
|
|
20666
|
+
['funcao', 'função'].includes(valorFinal.tipo)) {
|
|
20537
20667
|
parametro.referencia = true;
|
|
20538
20668
|
}
|
|
20539
20669
|
}
|
|
@@ -20541,7 +20671,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
|
|
|
20541
20671
|
return ambiente;
|
|
20542
20672
|
}
|
|
20543
20673
|
async chamar(visitante, argumentos) {
|
|
20544
|
-
const ambiente = this.resolverAmbiente(argumentos);
|
|
20674
|
+
const ambiente = await this.resolverAmbiente(visitante, argumentos);
|
|
20545
20675
|
if (this.instancia !== undefined) {
|
|
20546
20676
|
ambiente.valores['isto'] = {
|
|
20547
20677
|
valor: this.instancia,
|
|
@@ -21924,7 +22054,28 @@ class InterpretadorBase {
|
|
|
21924
22054
|
throw new Error('Método não implementado.');
|
|
21925
22055
|
}
|
|
21926
22056
|
async visitarExpressaoFalhar(expressao) {
|
|
21927
|
-
|
|
22057
|
+
let valorAvaliado = expressao.explicacao;
|
|
22058
|
+
// Se for um construto (ex.: Variavel), avalia para obter seu valor real
|
|
22059
|
+
if (expressao.explicacao &&
|
|
22060
|
+
typeof expressao.explicacao.aceitar === 'function') {
|
|
22061
|
+
valorAvaliado = await this.avaliar(expressao.explicacao);
|
|
22062
|
+
}
|
|
22063
|
+
let textoFalha;
|
|
22064
|
+
if (valorAvaliado === null || valorAvaliado === undefined) {
|
|
22065
|
+
textoFalha = 'nulo';
|
|
22066
|
+
}
|
|
22067
|
+
else if (typeof valorAvaliado === 'string') {
|
|
22068
|
+
textoFalha = valorAvaliado;
|
|
22069
|
+
}
|
|
22070
|
+
else if (typeof valorAvaliado === 'object' &&
|
|
22071
|
+
'valor' in valorAvaliado) {
|
|
22072
|
+
// Objetos tipados como { valor: 'mensagem', tipo: 'texto' }
|
|
22073
|
+
textoFalha = String(valorAvaliado.valor);
|
|
22074
|
+
}
|
|
22075
|
+
else {
|
|
22076
|
+
// Caso incomum: usa a representação textual padrão
|
|
22077
|
+
textoFalha = this.paraTexto(valorAvaliado);
|
|
22078
|
+
}
|
|
21928
22079
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
|
|
21929
22080
|
}
|
|
21930
22081
|
async visitarExpressaoFimPara(_) {
|
|
@@ -22181,7 +22332,7 @@ class InterpretadorBase {
|
|
|
22181
22332
|
* @param esquerda O operando esquerdo.
|
|
22182
22333
|
* @returns Se ambos os operandos são números ou não.
|
|
22183
22334
|
*/
|
|
22184
|
-
verificarOperandosNumeros(operador,
|
|
22335
|
+
verificarOperandosNumeros(operador, esquerda, direita) {
|
|
22185
22336
|
const tipoDireita = direita.tipo
|
|
22186
22337
|
? direita.tipo
|
|
22187
22338
|
: typeof direita === primitivos_1.default.NUMERO
|
|
@@ -22259,23 +22410,33 @@ class InterpretadorBase {
|
|
|
22259
22410
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
22260
22411
|
return resultadoExponenciacao;
|
|
22261
22412
|
case delegua_1.default.MAIOR:
|
|
22262
|
-
if (
|
|
22263
|
-
|
|
22413
|
+
if (typeof valorEsquerdo === 'string' &&
|
|
22414
|
+
typeof valorDireito === 'string') {
|
|
22264
22415
|
return valorEsquerdo > valorDireito;
|
|
22265
22416
|
}
|
|
22266
|
-
|
|
22417
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
22418
|
+
return Number(valorEsquerdo) > Number(valorDireito);
|
|
22267
22419
|
case delegua_1.default.MAIOR_IGUAL:
|
|
22420
|
+
if (typeof valorEsquerdo === 'string' &&
|
|
22421
|
+
typeof valorDireito === 'string') {
|
|
22422
|
+
return valorEsquerdo >= valorDireito;
|
|
22423
|
+
}
|
|
22268
22424
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
22269
|
-
return valorEsquerdo >= valorDireito;
|
|
22425
|
+
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
22270
22426
|
case delegua_1.default.MENOR:
|
|
22271
|
-
if (
|
|
22272
|
-
|
|
22427
|
+
if (typeof valorEsquerdo === 'string' &&
|
|
22428
|
+
typeof valorDireito === 'string') {
|
|
22273
22429
|
return valorEsquerdo < valorDireito;
|
|
22274
22430
|
}
|
|
22275
|
-
|
|
22431
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
22432
|
+
return Number(valorEsquerdo) < Number(valorDireito);
|
|
22276
22433
|
case delegua_1.default.MENOR_IGUAL:
|
|
22434
|
+
if (typeof valorEsquerdo === 'string' &&
|
|
22435
|
+
typeof valorDireito === 'string') {
|
|
22436
|
+
return valorEsquerdo <= valorDireito;
|
|
22437
|
+
}
|
|
22277
22438
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
22278
|
-
return valorEsquerdo <= valorDireito;
|
|
22439
|
+
return Number(valorEsquerdo) <= Number(valorDireito);
|
|
22279
22440
|
case delegua_1.default.SUBTRACAO:
|
|
22280
22441
|
case delegua_1.default.MENOS_IGUAL:
|
|
22281
22442
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
@@ -22605,13 +22766,29 @@ class InterpretadorBase {
|
|
|
22605
22766
|
});
|
|
22606
22767
|
}
|
|
22607
22768
|
}
|
|
22769
|
+
/** Gancho para linguagens definirem lógica de escopo (Pituguês LEGB) ou de memória (Delégua) */
|
|
22770
|
+
atribuirVariavel(alvoVariavel, valorResolvido, indice) {
|
|
22771
|
+
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
22772
|
+
}
|
|
22773
|
+
/** Gancho para linguagens definirem como acessar propriedades de objetos */
|
|
22774
|
+
async definirPropriedadeObjeto(objeto, simbolo, valor) {
|
|
22775
|
+
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse) {
|
|
22776
|
+
await objeto.definir(simbolo, valor, this);
|
|
22777
|
+
}
|
|
22778
|
+
else if (objeto !== null && objeto !== undefined) {
|
|
22779
|
+
objeto[simbolo.lexema] = valor;
|
|
22780
|
+
}
|
|
22781
|
+
}
|
|
22608
22782
|
/**
|
|
22609
22783
|
* Execução de uma expressão de atribuição.
|
|
22610
22784
|
* @param expressao A expressão.
|
|
22611
22785
|
* @returns O valor atribuído.
|
|
22612
22786
|
*/
|
|
22613
22787
|
async visitarExpressaoDeAtribuicao(expressao) {
|
|
22614
|
-
|
|
22788
|
+
let valor = await this.avaliar(expressao.valor);
|
|
22789
|
+
if (valor && valor.hasOwnProperty('valorRetornado')) {
|
|
22790
|
+
valor = valor.valorRetornado;
|
|
22791
|
+
}
|
|
22615
22792
|
const valorResolvido = this.resolverValor(valor);
|
|
22616
22793
|
let indice = null;
|
|
22617
22794
|
if (expressao.indice) {
|
|
@@ -22619,22 +22796,18 @@ class InterpretadorBase {
|
|
|
22619
22796
|
}
|
|
22620
22797
|
switch (expressao.alvo.constructor) {
|
|
22621
22798
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
22622
|
-
// Nunca será método aqui: apenas propriedade.
|
|
22623
22799
|
const alvoPropriedade = expressao.alvo;
|
|
22624
22800
|
const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
|
|
22625
22801
|
const objeto = this.resolverValor(variavelObjeto);
|
|
22626
|
-
const
|
|
22627
|
-
|
|
22628
|
-
const objetoDeleguaClasse = objeto;
|
|
22629
|
-
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
22630
|
-
}
|
|
22802
|
+
const valorProp = await this.avaliar(expressao.valor);
|
|
22803
|
+
await this.definirPropriedadeObjeto(objeto, alvoPropriedade.simbolo, valorProp);
|
|
22631
22804
|
break;
|
|
22632
22805
|
case construtos_1.Variavel:
|
|
22633
22806
|
const alvoVariavel = expressao.alvo;
|
|
22634
|
-
this.
|
|
22807
|
+
this.atribuirVariavel(alvoVariavel, valorResolvido, indice);
|
|
22635
22808
|
break;
|
|
22636
22809
|
default:
|
|
22637
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador,
|
|
22810
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, "Alvo da atribuição inválido. O lado esquerdo de uma atribuição deve ser uma variável, propriedade ou índice.");
|
|
22638
22811
|
}
|
|
22639
22812
|
return valorResolvido;
|
|
22640
22813
|
}
|
|
@@ -22929,36 +23102,47 @@ class InterpretadorBase {
|
|
|
22929
23102
|
} while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
|
|
22930
23103
|
this.eVerdadeiro(await this.avaliar(declaracao.condicaoEnquanto)));
|
|
22931
23104
|
}
|
|
23105
|
+
/**
|
|
23106
|
+
* Unifica a execução do bloco 'pegue', tratando tanto o caso de
|
|
23107
|
+
* declarações simples quanto o caso de função com parâmetro de erro.
|
|
23108
|
+
*/
|
|
23109
|
+
async executarBlocoPegue(pegue, erro) {
|
|
23110
|
+
if (Array.isArray(pegue)) {
|
|
23111
|
+
return await this.executarBloco(pegue);
|
|
23112
|
+
}
|
|
23113
|
+
// Caso seja FuncaoConstruto (pegue com parâmetro de erro)
|
|
23114
|
+
const literalErro = new construtos_1.Literal(pegue.hashArquivo, pegue.linha, erro.mensagem || erro.message || erro);
|
|
23115
|
+
const chamadaPegue = new construtos_1.Chamada(pegue.hashArquivo, pegue, [literalErro]);
|
|
23116
|
+
return await chamadaPegue.aceitar(this);
|
|
23117
|
+
}
|
|
22932
23118
|
/**
|
|
22933
23119
|
* Interpretação de uma declaração `tente`.
|
|
22934
23120
|
* @param declaracao O objeto da declaração.
|
|
22935
23121
|
*/
|
|
22936
23122
|
async visitarDeclaracaoTente(declaracao) {
|
|
22937
23123
|
let valorRetorno;
|
|
23124
|
+
let sucessoNoTente = false;
|
|
22938
23125
|
try {
|
|
22939
23126
|
this.emDeclaracaoTente = true;
|
|
22940
23127
|
try {
|
|
22941
23128
|
valorRetorno = await this.executarBloco(declaracao.caminhoTente);
|
|
23129
|
+
sucessoNoTente = true;
|
|
22942
23130
|
}
|
|
22943
23131
|
catch (erro) {
|
|
22944
23132
|
if (declaracao.caminhoPegue !== null) {
|
|
22945
|
-
|
|
22946
|
-
// ou um vetor de `Declaracao` (`pegue` sem parâmetros).
|
|
22947
|
-
// As execuções, portanto, são diferentes.
|
|
22948
|
-
if (Array.isArray(declaracao.caminhoPegue)) {
|
|
22949
|
-
valorRetorno = await this.executarBloco(declaracao.caminhoPegue);
|
|
22950
|
-
}
|
|
22951
|
-
else {
|
|
22952
|
-
const literalErro = new construtos_1.Literal(declaracao.hashArquivo, Number(declaracao.linha), erro.mensagem);
|
|
22953
|
-
const chamadaPegue = new construtos_1.Chamada(declaracao.caminhoPegue.hashArquivo, declaracao.caminhoPegue, [literalErro]);
|
|
22954
|
-
valorRetorno = await chamadaPegue.aceitar(this);
|
|
22955
|
-
}
|
|
23133
|
+
valorRetorno = await this.executarBlocoPegue(declaracao.caminhoPegue, erro);
|
|
22956
23134
|
}
|
|
23135
|
+
else
|
|
23136
|
+
throw erro;
|
|
23137
|
+
}
|
|
23138
|
+
if (sucessoNoTente && declaracao.caminhoSenao) {
|
|
23139
|
+
valorRetorno = await this.executarBloco(declaracao.caminhoSenao);
|
|
22957
23140
|
}
|
|
22958
23141
|
}
|
|
22959
23142
|
finally {
|
|
22960
|
-
if (declaracao.caminhoFinalmente)
|
|
23143
|
+
if (declaracao.caminhoFinalmente) {
|
|
22961
23144
|
valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
|
|
23145
|
+
}
|
|
22962
23146
|
this.emDeclaracaoTente = false;
|
|
22963
23147
|
}
|
|
22964
23148
|
return valorRetorno;
|
|
@@ -23417,6 +23601,13 @@ class InterpretadorBase {
|
|
|
23417
23601
|
if (tipoObjeto === null || tipoObjeto === undefined) {
|
|
23418
23602
|
tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(variavelObjeto);
|
|
23419
23603
|
}
|
|
23604
|
+
// Trata qualquer tipo terminado em '[]' como vetor
|
|
23605
|
+
if (tipoObjeto && tipoObjeto.endsWith('[]')) {
|
|
23606
|
+
if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
|
|
23607
|
+
const metodo = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
|
|
23608
|
+
return new metodo_primitiva_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.simbolo.lexema, tipoObjeto);
|
|
23609
|
+
}
|
|
23610
|
+
}
|
|
23420
23611
|
// Caso 3: Vetor simples do JavaScript.
|
|
23421
23612
|
if (Array.isArray(objeto)) {
|
|
23422
23613
|
if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
|
|
@@ -23910,6 +24101,17 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
23910
24101
|
pontoInicializacaoBibliotecasGlobais() {
|
|
23911
24102
|
(0, comum_1.carregarBibliotecasGlobais)(this.pilhaEscoposExecucao);
|
|
23912
24103
|
}
|
|
24104
|
+
atribuirVariavel(alvoVariavel, valorResolvido, indice) {
|
|
24105
|
+
const variavelResolvida = this.pilhaEscoposExecucao.obterValorVariavel(alvoVariavel.simbolo);
|
|
24106
|
+
if (variavelResolvida.valor instanceof estruturas_1.ReferenciaMontao) {
|
|
24107
|
+
const referenciaMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, variavelResolvida.valor.endereco);
|
|
24108
|
+
referenciaMontao[indice] = valorResolvido;
|
|
24109
|
+
}
|
|
24110
|
+
else {
|
|
24111
|
+
// Se não for montão, usa o comportamento padrão da Pilha
|
|
24112
|
+
super.atribuirVariavel(alvoVariavel, valorResolvido, indice);
|
|
24113
|
+
}
|
|
24114
|
+
}
|
|
23913
24115
|
async avaliarArgumentosEscreva(argumentos) {
|
|
23914
24116
|
if (this.constructor !== Interpretador) {
|
|
23915
24117
|
return await super.avaliarArgumentosEscreva(argumentos);
|
|
@@ -24684,6 +24886,23 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
24684
24886
|
if (tipoObjeto === null || tipoObjeto === undefined) {
|
|
24685
24887
|
tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(objeto);
|
|
24686
24888
|
}
|
|
24889
|
+
// Trata qualquer tipo terminado em '[]' como vetor
|
|
24890
|
+
if (tipoObjeto && tipoObjeto.endsWith('[]')) {
|
|
24891
|
+
if (expressao.nomeMetodo in primitivas_vetor_1.default) {
|
|
24892
|
+
const metodo = primitivas_vetor_1.default[expressao.nomeMetodo].implementacao;
|
|
24893
|
+
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.nomeMetodo, tipoObjeto);
|
|
24894
|
+
}
|
|
24895
|
+
else {
|
|
24896
|
+
const funcaoExt = this.encontrarMetodoExtensao(['vetor', 'objeto'], expressao.nomeMetodo, this.hashArquivoDeclaracaoAtual);
|
|
24897
|
+
if (funcaoExt)
|
|
24898
|
+
return funcaoExt.funcaoPorExtensao(objeto);
|
|
24899
|
+
throw new excecoes_1.ErroEmTempoDeExecucao({
|
|
24900
|
+
hashArquivo: this.hashArquivoDeclaracaoAtual,
|
|
24901
|
+
linha: this.linhaDeclaracaoAtual,
|
|
24902
|
+
lexema: expressao.nomeMetodo
|
|
24903
|
+
}, `Método de primitiva '${expressao.nomeMetodo}' não existe para o tipo ${tipoObjeto}.`, expressao.linha);
|
|
24904
|
+
}
|
|
24905
|
+
}
|
|
24687
24906
|
// Como internamente um dicionário de Delégua é simplesmente um objeto de
|
|
24688
24907
|
// JavaScript, as primitivas de dicionário, especificamente, são tratadas
|
|
24689
24908
|
// mais acima.
|
|
@@ -24859,6 +25078,19 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
24859
25078
|
if (tipoObjeto === null || tipoObjeto === undefined) {
|
|
24860
25079
|
tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(objeto);
|
|
24861
25080
|
}
|
|
25081
|
+
// Trata qualquer tipo terminado em '[]' como vetor
|
|
25082
|
+
if (tipoObjeto && tipoObjeto.endsWith('[]')) {
|
|
25083
|
+
if (expressao.simbolo.lexema in primitivas_vetor_1.default) {
|
|
25084
|
+
const metodo = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
|
|
25085
|
+
return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodo, expressao.simbolo.lexema, tipoObjeto);
|
|
25086
|
+
}
|
|
25087
|
+
else {
|
|
25088
|
+
const funcaoExt = this.encontrarMetodoExtensao(['vetor', 'objeto'], expressao.simbolo.lexema, this.hashArquivoDeclaracaoAtual);
|
|
25089
|
+
if (funcaoExt)
|
|
25090
|
+
return funcaoExt.funcaoPorExtensao(objeto);
|
|
25091
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`, expressao.linha);
|
|
25092
|
+
}
|
|
25093
|
+
}
|
|
24862
25094
|
// Como internamente um dicionário de Delégua é simplesmente um objeto de
|
|
24863
25095
|
// JavaScript, as primitivas de dicionário, especificamente, são tratadas
|
|
24864
25096
|
// mais acima.
|
|
@@ -25058,53 +25290,6 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
|
|
|
25058
25290
|
async visitarExpressaoComentario(expressao) {
|
|
25059
25291
|
return Promise.resolve();
|
|
25060
25292
|
}
|
|
25061
|
-
/**
|
|
25062
|
-
* Execução de uma expressão de atribuição.
|
|
25063
|
-
* @param expressao A expressão.
|
|
25064
|
-
* @returns O valor atribuído.
|
|
25065
|
-
*/
|
|
25066
|
-
async visitarExpressaoDeAtribuicao(expressao) {
|
|
25067
|
-
let valor = await this.avaliar(expressao.valor);
|
|
25068
|
-
if (valor && valor.hasOwnProperty('valorRetornado')) {
|
|
25069
|
-
valor = valor.valorRetornado;
|
|
25070
|
-
}
|
|
25071
|
-
const valorResolvido = this.resolverValor(valor);
|
|
25072
|
-
let indice = null;
|
|
25073
|
-
if (expressao.indice) {
|
|
25074
|
-
indice = this.resolverValor(await this.avaliar(expressao.indice));
|
|
25075
|
-
}
|
|
25076
|
-
switch (expressao.alvo.constructor) {
|
|
25077
|
-
case construtos_1.Variavel:
|
|
25078
|
-
const alvoVariavel = expressao.alvo;
|
|
25079
|
-
const variavelResolvida = this.pilhaEscoposExecucao.obterValorVariavel(alvoVariavel.simbolo);
|
|
25080
|
-
if (variavelResolvida.valor instanceof estruturas_1.ReferenciaMontao) {
|
|
25081
|
-
const referenciaMontao = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, variavelResolvida.valor.endereco);
|
|
25082
|
-
referenciaMontao[indice] = valorResolvido;
|
|
25083
|
-
}
|
|
25084
|
-
else {
|
|
25085
|
-
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
25086
|
-
}
|
|
25087
|
-
break;
|
|
25088
|
-
case construtos_1.AcessoMetodoOuPropriedade:
|
|
25089
|
-
// Nunca será método aqui: apenas propriedade.
|
|
25090
|
-
const alvoPropriedade = expressao.alvo;
|
|
25091
|
-
const variavelObjeto = await this.avaliar(alvoPropriedade.objeto);
|
|
25092
|
-
const objeto = this.resolverValor(variavelObjeto);
|
|
25093
|
-
const valor = await this.avaliar(expressao.valor);
|
|
25094
|
-
if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
|
|
25095
|
-
const objetoDeleguaClasse = objeto;
|
|
25096
|
-
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
25097
|
-
}
|
|
25098
|
-
else {
|
|
25099
|
-
// Se cair aqui, provavelmente `objeto.constructor.name` é 'Object'.
|
|
25100
|
-
objeto[alvoPropriedade.simbolo.lexema] = valor;
|
|
25101
|
-
}
|
|
25102
|
-
break;
|
|
25103
|
-
default:
|
|
25104
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(undefined, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
|
|
25105
|
-
}
|
|
25106
|
-
return valorResolvido;
|
|
25107
|
-
}
|
|
25108
25293
|
async visitarExpressaoDefinirValor(expressao) {
|
|
25109
25294
|
const variavelObjeto = await this.avaliar(expressao.objeto);
|
|
25110
25295
|
const objeto = this.resolverValor(variavelObjeto);
|
|
@@ -28798,11 +28983,11 @@ const simbolo_1 = require("./simbolo");
|
|
|
28798
28983
|
const palavras_reservadas_1 = require("./palavras-reservadas");
|
|
28799
28984
|
const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
28800
28985
|
/**
|
|
28801
|
-
|
|
28802
|
-
|
|
28803
|
-
|
|
28804
|
-
|
|
28805
|
-
|
|
28986
|
+
* O Lexador é responsável por transformar o código em uma coleção de tokens de linguagem.
|
|
28987
|
+
* Cada token de linguagem é representado por um tipo, um lexema e informações da linha de código em que foi expresso.
|
|
28988
|
+
* Também é responsável por mapear as palavras reservadas da linguagem, que não podem ser usadas por outras
|
|
28989
|
+
* estruturas, tais como nomes de variáveis, funções, literais, classes e assim por diante.
|
|
28990
|
+
*/
|
|
28806
28991
|
class Lexador {
|
|
28807
28992
|
constructor(performance = false) {
|
|
28808
28993
|
this.codigo = [];
|
|
@@ -28870,10 +29055,10 @@ class Lexador {
|
|
|
28870
29055
|
return this.atual >= this.codigo[this.linha].length;
|
|
28871
29056
|
}
|
|
28872
29057
|
/**
|
|
28873
|
-
|
|
28874
|
-
|
|
28875
|
-
|
|
28876
|
-
|
|
29058
|
+
* Indica se o código está na última linha.
|
|
29059
|
+
* @returns Verdadeiro se contador de linhas está na última linha.
|
|
29060
|
+
* Falso caso contrário.
|
|
29061
|
+
*/
|
|
28877
29062
|
eUltimaLinha() {
|
|
28878
29063
|
return this.linha >= this.codigo.length - 1;
|
|
28879
29064
|
}
|
|
@@ -28881,7 +29066,9 @@ class Lexador {
|
|
|
28881
29066
|
return this.eUltimaLinha() && this.codigo[this.codigo.length - 1].length <= this.atual;
|
|
28882
29067
|
}
|
|
28883
29068
|
avancar() {
|
|
28884
|
-
this.
|
|
29069
|
+
const linha = this.codigo[this.linha];
|
|
29070
|
+
const codePoint = linha.codePointAt(this.atual);
|
|
29071
|
+
this.atual += codePoint && codePoint > 0xffff ? 2 : 1;
|
|
28885
29072
|
if (this.eFinalDaLinha() && !this.eUltimaLinha()) {
|
|
28886
29073
|
this.linha++;
|
|
28887
29074
|
this.atual = 0;
|
|
@@ -28899,7 +29086,12 @@ class Lexador {
|
|
|
28899
29086
|
simboloAtual() {
|
|
28900
29087
|
if (this.eFinalDaLinha())
|
|
28901
29088
|
return '\0';
|
|
28902
|
-
|
|
29089
|
+
const linha = this.codigo[this.linha];
|
|
29090
|
+
const codePoint = linha.codePointAt(this.atual);
|
|
29091
|
+
if (codePoint === undefined) {
|
|
29092
|
+
return '\0';
|
|
29093
|
+
}
|
|
29094
|
+
return String.fromCodePoint(codePoint);
|
|
28903
29095
|
}
|
|
28904
29096
|
comentarioMultilinha() {
|
|
28905
29097
|
let conteudo = '';
|
|
@@ -28923,10 +29115,10 @@ class Lexador {
|
|
|
28923
29115
|
}
|
|
28924
29116
|
}
|
|
28925
29117
|
/**
|
|
28926
|
-
|
|
28927
|
-
|
|
28928
|
-
|
|
28929
|
-
|
|
29118
|
+
* Lê um comentário documentário (iniciado com `/**`), agregando o conteúdo
|
|
29119
|
+
* em um único token DOCUMENTARIO. Linhas com `*` inicial (convenção JSDoc)
|
|
29120
|
+
* têm o asterisco removido.
|
|
29121
|
+
*/
|
|
28930
29122
|
comentarioDocumentario() {
|
|
28931
29123
|
// Cursor está no primeiro '*' de '/**'. Avança para pular o segundo '*'.
|
|
28932
29124
|
this.avancar();
|
|
@@ -28964,10 +29156,23 @@ class Lexador {
|
|
|
28964
29156
|
this.adicionarSimbolo(delegua_1.default.COMENTARIO, conteudo.trim());
|
|
28965
29157
|
}
|
|
28966
29158
|
proximoSimbolo() {
|
|
28967
|
-
|
|
29159
|
+
const linha = this.codigo[this.linha];
|
|
29160
|
+
const atual = this.simboloAtual();
|
|
29161
|
+
const incremento = atual.length;
|
|
29162
|
+
const codePoint = linha.codePointAt(this.atual + incremento);
|
|
29163
|
+
if (codePoint === undefined) {
|
|
29164
|
+
return '\0';
|
|
29165
|
+
}
|
|
29166
|
+
return String.fromCodePoint(codePoint);
|
|
28968
29167
|
}
|
|
28969
29168
|
simboloAnterior() {
|
|
28970
|
-
|
|
29169
|
+
const linha = this.codigo[this.linha];
|
|
29170
|
+
const indiceAnterior = this.atual -
|
|
29171
|
+
(linha.codePointAt(this.atual - 2) > 0xffff ? 2 : 1);
|
|
29172
|
+
const codePoint = linha.codePointAt(indiceAnterior);
|
|
29173
|
+
if (codePoint === undefined) {
|
|
29174
|
+
return '\0';
|
|
29175
|
+
}
|
|
28971
29176
|
}
|
|
28972
29177
|
analisarTexto(delimitador = '"') {
|
|
28973
29178
|
let valor = '';
|
|
@@ -29153,6 +29358,19 @@ class Lexador {
|
|
|
29153
29358
|
: delegua_1.default.IDENTIFICADOR;
|
|
29154
29359
|
this.adicionarSimbolo(tipo);
|
|
29155
29360
|
}
|
|
29361
|
+
eEmoji(caractere) {
|
|
29362
|
+
const emojiRegex = /\p{Extended_Pictographic}(?:\uFE0F|\u200D\p{Extended_Pictographic})*/u;
|
|
29363
|
+
return emojiRegex.test(caractere);
|
|
29364
|
+
}
|
|
29365
|
+
analisarEmoji() {
|
|
29366
|
+
const simboloAtual = this.simboloAtual();
|
|
29367
|
+
this.erros.push({
|
|
29368
|
+
linha: this.linha + 1,
|
|
29369
|
+
caractere: simboloAtual,
|
|
29370
|
+
mensagem: 'Emojis devem estar envoltos por aspas.',
|
|
29371
|
+
});
|
|
29372
|
+
this.avancar();
|
|
29373
|
+
}
|
|
29156
29374
|
analisarToken() {
|
|
29157
29375
|
const caractere = this.simboloAtual();
|
|
29158
29376
|
switch (caractere) {
|
|
@@ -29416,6 +29634,8 @@ class Lexador {
|
|
|
29416
29634
|
default:
|
|
29417
29635
|
if (this.eDigito(caractere))
|
|
29418
29636
|
this.analisarNumero();
|
|
29637
|
+
else if (this.eEmoji(caractere))
|
|
29638
|
+
this.analisarEmoji();
|
|
29419
29639
|
else if (this.eAlfabeto(caractere))
|
|
29420
29640
|
this.identificarPalavraChave();
|
|
29421
29641
|
else {
|