@designliquido/delegua 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/delegua +1 -1
- package/bin/delegua.cmd +1 -1
- package/bin/package.json +3 -3
- package/coverage/lcov-report/sorter.js +4 -4
- package/coverage/lcov-report/sorter.js.map +1 -1
- package/execucao.d.ts +1 -0
- package/execucao.js +29 -0
- package/execucao.js.map +1 -0
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.d.ts +1 -1
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.js +108 -105
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/fontes/avaliador-sintatico/avaliador-sintatico.d.ts +1 -1
- package/fontes/avaliador-sintatico/avaliador-sintatico.js +244 -256
- package/fontes/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.d.ts +20 -0
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js +68 -0
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js.map +1 -0
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +227 -236
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.d.ts +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js +247 -257
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.d.ts +3 -0
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js +192 -131
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js.map +1 -1
- package/fontes/avaliador-sintatico/erro-avaliador-sintatico.js +6 -24
- package/fontes/avaliador-sintatico/erro-avaliador-sintatico.js.map +1 -1
- package/fontes/bibliotecas/biblioteca-global.js +206 -367
- package/fontes/bibliotecas/biblioteca-global.js.map +1 -1
- package/fontes/bibliotecas/importar-biblioteca.js +28 -29
- package/fontes/bibliotecas/importar-biblioteca.js.map +1 -1
- package/fontes/bibliotecas/primitivas-texto.js +9 -22
- package/fontes/bibliotecas/primitivas-texto.js.map +1 -1
- package/fontes/bibliotecas/primitivas-vetor.js +12 -14
- package/fontes/bibliotecas/primitivas-vetor.js.map +1 -1
- package/fontes/construtos/acesso-indice-variavel.js +6 -50
- package/fontes/construtos/acesso-indice-variavel.js.map +1 -1
- package/fontes/construtos/acesso-metodo.js +6 -50
- package/fontes/construtos/acesso-metodo.js.map +1 -1
- package/fontes/construtos/agrupamento.js +6 -50
- package/fontes/construtos/agrupamento.js.map +1 -1
- package/fontes/construtos/atribuicao-sobrescrita.js +6 -50
- package/fontes/construtos/atribuicao-sobrescrita.js.map +1 -1
- package/fontes/construtos/atribuir.js +6 -50
- package/fontes/construtos/atribuir.js.map +1 -1
- package/fontes/construtos/binario.js +6 -50
- package/fontes/construtos/binario.js.map +1 -1
- package/fontes/construtos/chamada.js +6 -50
- package/fontes/construtos/chamada.js.map +1 -1
- package/fontes/construtos/definir-valor.js +6 -50
- package/fontes/construtos/definir-valor.js.map +1 -1
- package/fontes/construtos/dicionario.js +6 -50
- package/fontes/construtos/dicionario.js.map +1 -1
- package/fontes/construtos/funcao.d.ts +2 -2
- package/fontes/construtos/funcao.js +6 -47
- package/fontes/construtos/funcao.js.map +1 -1
- package/fontes/construtos/isto.js +6 -47
- package/fontes/construtos/isto.js.map +1 -1
- package/fontes/construtos/literal.js +6 -47
- package/fontes/construtos/literal.js.map +1 -1
- package/fontes/construtos/logico.js +6 -50
- package/fontes/construtos/logico.js.map +1 -1
- package/fontes/construtos/super.js +6 -47
- package/fontes/construtos/super.js.map +1 -1
- package/fontes/construtos/unario.js +6 -50
- package/fontes/construtos/unario.js.map +1 -1
- package/fontes/construtos/variavel.js +6 -47
- package/fontes/construtos/variavel.js.map +1 -1
- package/fontes/construtos/vetor.js +6 -50
- package/fontes/construtos/vetor.js.map +1 -1
- package/fontes/declaracoes/bloco.js +9 -70
- package/fontes/declaracoes/bloco.js.map +1 -1
- package/fontes/declaracoes/classe.js +11 -72
- package/fontes/declaracoes/classe.js.map +1 -1
- package/fontes/declaracoes/continua.js +8 -65
- package/fontes/declaracoes/continua.js.map +1 -1
- package/fontes/declaracoes/declaracao.js +6 -47
- package/fontes/declaracoes/declaracao.js.map +1 -1
- package/fontes/declaracoes/enquanto.js +10 -71
- package/fontes/declaracoes/enquanto.js.map +1 -1
- package/fontes/declaracoes/escolha.js +11 -72
- package/fontes/declaracoes/escolha.js.map +1 -1
- package/fontes/declaracoes/escreva.js +9 -70
- package/fontes/declaracoes/escreva.js.map +1 -1
- package/fontes/declaracoes/expressao.js +9 -70
- package/fontes/declaracoes/expressao.js.map +1 -1
- package/fontes/declaracoes/fazer.js +10 -71
- package/fontes/declaracoes/fazer.js.map +1 -1
- package/fontes/declaracoes/funcao.js +10 -68
- package/fontes/declaracoes/funcao.js.map +1 -1
- package/fontes/declaracoes/importar.js +10 -71
- package/fontes/declaracoes/importar.js.map +1 -1
- package/fontes/declaracoes/leia.js +9 -70
- package/fontes/declaracoes/leia.js.map +1 -1
- package/fontes/declaracoes/para.js +12 -73
- package/fontes/declaracoes/para.js.map +1 -1
- package/fontes/declaracoes/retorna.js +10 -71
- package/fontes/declaracoes/retorna.js.map +1 -1
- package/fontes/declaracoes/se.js +12 -73
- package/fontes/declaracoes/se.js.map +1 -1
- package/fontes/declaracoes/sustar.js +8 -65
- package/fontes/declaracoes/sustar.js.map +1 -1
- package/fontes/declaracoes/tente.js +12 -73
- package/fontes/declaracoes/tente.js.map +1 -1
- package/fontes/declaracoes/var.js +10 -71
- package/fontes/declaracoes/var.js.map +1 -1
- package/fontes/delegua.js +125 -206
- package/fontes/delegua.js.map +1 -1
- package/fontes/depuracao/cyrb53.js +3 -4
- package/fontes/depuracao/cyrb53.js.map +1 -1
- package/fontes/depuracao/servidor-depuracao.js +125 -209
- package/fontes/depuracao/servidor-depuracao.js.map +1 -1
- package/fontes/espaco-variaveis.js +3 -4
- package/fontes/espaco-variaveis.js.map +1 -1
- package/fontes/estruturas/chamavel.js +6 -9
- package/fontes/estruturas/chamavel.js.map +1 -1
- package/fontes/estruturas/classe-padrao.js +17 -35
- package/fontes/estruturas/classe-padrao.js.map +1 -1
- package/fontes/estruturas/delegua-classe.d.ts +2 -2
- package/fontes/estruturas/delegua-classe.js +21 -39
- package/fontes/estruturas/delegua-classe.js.map +1 -1
- package/fontes/estruturas/delegua-funcao.js +48 -114
- package/fontes/estruturas/delegua-funcao.js.map +1 -1
- package/fontes/estruturas/funcao-padrao.js +13 -75
- package/fontes/estruturas/funcao-padrao.js.map +1 -1
- package/fontes/estruturas/metodo-primitiva.js +11 -39
- package/fontes/estruturas/metodo-primitiva.js.map +1 -1
- package/fontes/estruturas/modulo.js +6 -7
- package/fontes/estruturas/modulo.js.map +1 -1
- package/fontes/estruturas/objeto-delegua-classe.d.ts +3 -3
- package/fontes/estruturas/objeto-delegua-classe.js +12 -13
- package/fontes/estruturas/objeto-delegua-classe.js.map +1 -1
- package/fontes/estruturas/objeto-padrao.js +9 -11
- package/fontes/estruturas/objeto-padrao.js.map +1 -1
- package/fontes/excecoes/erro-em-tempo-de-execucao.js +8 -26
- package/fontes/excecoes/erro-em-tempo-de-execucao.js.map +1 -1
- package/fontes/importador/importador.js +21 -22
- package/fontes/importador/importador.js.map +1 -1
- package/fontes/interfaces/avaliador-sintatico-interface.d.ts +1 -1
- package/fontes/interfaces/parametro-interface.d.ts +1 -1
- package/fontes/interpretador/dialetos/egua-classico.js +592 -1019
- package/fontes/interpretador/dialetos/egua-classico.js.map +1 -1
- package/fontes/interpretador/inferenciador.js +1 -1
- package/fontes/interpretador/inferenciador.js.map +1 -1
- package/fontes/interpretador/interpretador-com-depuracao.js +186 -336
- package/fontes/interpretador/interpretador-com-depuracao.js.map +1 -1
- package/fontes/interpretador/interpretador.js +706 -1175
- package/fontes/interpretador/interpretador.js.map +1 -1
- package/fontes/interpretador/pilha-escopos-execucao.js +52 -57
- package/fontes/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/fontes/lexador/dialetos/lexador-birl.d.ts +6 -19
- package/fontes/lexador/dialetos/lexador-birl.js +157 -49
- package/fontes/lexador/dialetos/lexador-birl.js.map +1 -1
- package/fontes/lexador/dialetos/lexador-egua-classico.js +43 -46
- package/fontes/lexador/dialetos/lexador-egua-classico.js.map +1 -1
- package/fontes/lexador/dialetos/lexador-eguap.js +59 -63
- package/fontes/lexador/dialetos/lexador-eguap.js.map +1 -1
- package/fontes/lexador/dialetos/lexador-visualg.js +45 -54
- package/fontes/lexador/dialetos/lexador-visualg.js.map +1 -1
- package/fontes/lexador/dialetos/palavras-reservadas/birl.d.ts +14 -1
- package/fontes/lexador/dialetos/palavras-reservadas/birl.js +18 -1
- package/fontes/lexador/dialetos/palavras-reservadas/birl.js.map +1 -1
- package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.js +1 -1
- package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.js.map +1 -1
- package/fontes/lexador/dialetos/palavras-reservadas/visualg.d.ts +24 -0
- package/fontes/lexador/dialetos/palavras-reservadas/visualg.js +25 -1
- package/fontes/lexador/dialetos/palavras-reservadas/visualg.js.map +1 -1
- package/fontes/lexador/lexador-base-linha-unica.d.ts +1 -1
- package/fontes/lexador/lexador-base-linha-unica.js +28 -29
- package/fontes/lexador/lexador-base-linha-unica.js.map +1 -1
- package/fontes/lexador/lexador.js +53 -57
- package/fontes/lexador/lexador.js.map +1 -1
- package/fontes/lexador/palavras-reservadas.js +1 -1
- package/fontes/lexador/palavras-reservadas.js.map +1 -1
- package/fontes/lexador/simbolo.js +5 -6
- package/fontes/lexador/simbolo.js.map +1 -1
- package/fontes/quebras/index.js +11 -42
- package/fontes/quebras/index.js.map +1 -1
- package/fontes/resolvedor/dialetos/egua-classico.js +143 -144
- package/fontes/resolvedor/dialetos/egua-classico.js.map +1 -1
- package/fontes/resolvedor/erro-resolvedor.js +6 -24
- package/fontes/resolvedor/erro-resolvedor.js.map +1 -1
- package/fontes/resolvedor/pilha-escopos.js +11 -12
- package/fontes/resolvedor/pilha-escopos.js.map +1 -1
- package/fontes/tipos-de-simbolos/birl.d.ts +7 -0
- package/fontes/tipos-de-simbolos/birl.js +20 -12
- package/fontes/tipos-de-simbolos/birl.js.map +1 -1
- package/fontes/tipos-de-simbolos/comum.d.ts +2 -0
- package/fontes/tipos-de-simbolos/comum.js +2 -0
- package/fontes/tipos-de-simbolos/comum.js.map +1 -1
- package/fontes/tipos-de-simbolos/visualg.d.ts +9 -0
- package/fontes/tipos-de-simbolos/visualg.js +9 -0
- package/fontes/tipos-de-simbolos/visualg.js.map +1 -1
- package/index.d.ts +5 -1
- package/index.js +18 -25
- package/index.js.map +1 -1
- package/jest.config.js +9 -47
- package/jest.config.js.map +1 -1
- package/package.json +3 -3
- package/testes/__mocks__/estatistica.js +1 -1
- package/testes/__mocks__/estatistica.js.map +1 -1
- package/testes/__mocks__/fisica.js +1 -1
- package/testes/__mocks__/fisica.js.map +1 -1
- package/testes/__mocks__/matematica.js +1 -1
- package/testes/__mocks__/matematica.js.map +1 -1
- package/testes/avaliador-sintatico.test.js +27 -27
- package/testes/avaliador-sintatico.test.js.map +1 -1
- package/testes/biblioteca-global.test.js +197 -440
- package/testes/biblioteca-global.test.js.map +1 -1
- package/testes/birl/avaliador-sintatico.test.d.ts +1 -0
- package/testes/birl/avaliador-sintatico.test.js +18 -0
- package/testes/birl/avaliador-sintatico.test.js.map +1 -0
- package/testes/birl/lexador.test.d.ts +1 -0
- package/testes/birl/lexador.test.js +31 -0
- package/testes/birl/lexador.test.js.map +1 -0
- package/testes/delegua.test.js +7 -7
- package/testes/delegua.test.js.map +1 -1
- package/testes/egua-classico/avaliador-sintatico.test.js +14 -14
- package/testes/egua-classico/avaliador-sintatico.test.js.map +1 -1
- package/testes/egua-classico/delegua.test.js +5 -5
- package/testes/egua-classico/delegua.test.js.map +1 -1
- package/testes/egua-classico/interpretador.test.js +180 -396
- package/testes/egua-classico/interpretador.test.js.map +1 -1
- package/testes/egua-classico/lexador.test.js +23 -23
- package/testes/egua-classico/lexador.test.js.map +1 -1
- package/testes/egua-classico/resolvedor.test.js +12 -12
- package/testes/egua-classico/resolvedor.test.js.map +1 -1
- package/testes/eguap/avaliador-sintatico.test.js +11 -11
- package/testes/eguap/avaliador-sintatico.test.js.map +1 -1
- package/testes/eguap/interpretador.test.js +189 -405
- package/testes/eguap/interpretador.test.js.map +1 -1
- package/testes/eguap/lexador.test.js +18 -18
- package/testes/eguap/lexador.test.js.map +1 -1
- package/testes/interpretador.test.js +431 -908
- package/testes/interpretador.test.js.map +1 -1
- package/testes/lexador.test.js +42 -42
- package/testes/lexador.test.js.map +1 -1
- package/testes/visualg/avaliador-sintatico.test.js +23 -23
- package/testes/visualg/avaliador-sintatico.test.js.map +1 -1
- package/testes/visualg/interpretador.test.js +16 -61
- package/testes/visualg/interpretador.test.js.map +1 -1
- package/testes/visualg/lexador.test.js +15 -15
- package/testes/visualg/lexador.test.js.map +1 -1
|
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AvaliadorSintaticoEguaP = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
|
|
8
|
+
const construtos_1 = require("../../construtos");
|
|
9
|
+
const declaracoes_1 = require("../../declaracoes");
|
|
10
|
+
const eguap_1 = __importDefault(require("../../tipos-de-simbolos/eguap"));
|
|
11
|
+
const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
|
|
12
12
|
/**
|
|
13
13
|
* O avaliador sintático (Parser) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
|
|
14
14
|
* Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
|
|
@@ -17,15 +17,14 @@ var erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
|
|
|
17
17
|
* A grande diferença entre este avaliador e os demais é a forma como são entendidos os blocos de escopo.
|
|
18
18
|
* Este avaliador espera uma estrutura de pragmas, que explica quantos espaços há na frente de cada linha.
|
|
19
19
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (performance === void 0) { performance = false; }
|
|
20
|
+
class AvaliadorSintaticoEguaP {
|
|
21
|
+
constructor(performance = false) {
|
|
23
22
|
this.atual = 0;
|
|
24
|
-
this.
|
|
23
|
+
this.blocos = 0;
|
|
25
24
|
this.performance = performance;
|
|
26
25
|
this.escopos = [];
|
|
27
26
|
}
|
|
28
|
-
|
|
27
|
+
sincronizar() {
|
|
29
28
|
this.avancarEDevolverAnterior();
|
|
30
29
|
while (!this.estaNoFinal()) {
|
|
31
30
|
switch (this.simboloAtual().tipo) {
|
|
@@ -42,90 +41,85 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
42
41
|
}
|
|
43
42
|
this.avancarEDevolverAnterior();
|
|
44
43
|
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
}
|
|
45
|
+
erro(simbolo, mensagemDeErro) {
|
|
46
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
|
|
48
47
|
this.erros.push(excecao);
|
|
49
48
|
return excecao;
|
|
50
|
-
}
|
|
51
|
-
|
|
49
|
+
}
|
|
50
|
+
consumir(tipo, mensagemDeErro) {
|
|
52
51
|
if (this.verificarTipoSimboloAtual(tipo))
|
|
53
52
|
return this.avancarEDevolverAnterior();
|
|
54
53
|
throw this.erro(this.simboloAtual(), mensagemDeErro);
|
|
55
|
-
}
|
|
56
|
-
|
|
54
|
+
}
|
|
55
|
+
verificarTipoSimboloAtual(tipo) {
|
|
57
56
|
if (this.estaNoFinal())
|
|
58
57
|
return false;
|
|
59
58
|
return this.simboloAtual().tipo === tipo;
|
|
60
|
-
}
|
|
61
|
-
|
|
59
|
+
}
|
|
60
|
+
verificarTipoProximoSimbolo(tipo) {
|
|
62
61
|
if (this.estaNoFinal())
|
|
63
62
|
return false;
|
|
64
63
|
return this.simbolos[this.atual + 1].tipo === tipo;
|
|
65
|
-
}
|
|
66
|
-
|
|
64
|
+
}
|
|
65
|
+
simboloAtual() {
|
|
67
66
|
return this.simbolos[this.atual];
|
|
68
|
-
}
|
|
69
|
-
|
|
67
|
+
}
|
|
68
|
+
simboloAnterior() {
|
|
70
69
|
return this.simbolos[this.atual - 1];
|
|
71
|
-
}
|
|
72
|
-
|
|
70
|
+
}
|
|
71
|
+
simboloNaPosicao(posicao) {
|
|
73
72
|
return this.simbolos[this.atual + posicao];
|
|
74
|
-
}
|
|
75
|
-
|
|
73
|
+
}
|
|
74
|
+
estaNoFinal() {
|
|
76
75
|
return this.atual >= this.simbolos.length;
|
|
77
|
-
}
|
|
78
|
-
|
|
76
|
+
}
|
|
77
|
+
avancarEDevolverAnterior() {
|
|
79
78
|
if (!this.estaNoFinal())
|
|
80
79
|
this.atual += 1;
|
|
81
80
|
return this.simboloAnterior();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
argumentos[_i] = arguments[_i];
|
|
87
|
-
}
|
|
88
|
-
for (var i = 0; i < argumentos.length; i++) {
|
|
89
|
-
var tipoAtual = argumentos[i];
|
|
81
|
+
}
|
|
82
|
+
verificarSeSimboloAtualEIgualA(...argumentos) {
|
|
83
|
+
for (let i = 0; i < argumentos.length; i++) {
|
|
84
|
+
const tipoAtual = argumentos[i];
|
|
90
85
|
if (this.verificarTipoSimboloAtual(tipoAtual)) {
|
|
91
86
|
this.avancarEDevolverAnterior();
|
|
92
87
|
return true;
|
|
93
88
|
}
|
|
94
89
|
}
|
|
95
90
|
return false;
|
|
96
|
-
}
|
|
97
|
-
|
|
91
|
+
}
|
|
92
|
+
primario() {
|
|
98
93
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SUPER)) {
|
|
99
|
-
|
|
94
|
+
const simboloChave = this.simboloAnterior();
|
|
100
95
|
this.consumir(eguap_1.default.PONTO, "Esperado '.' após 'super'.");
|
|
101
|
-
|
|
96
|
+
const metodo = this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome do método da SuperClasse.');
|
|
102
97
|
return new construtos_1.Super(this.hashArquivo, simboloChave, metodo);
|
|
103
98
|
}
|
|
104
99
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.COLCHETE_ESQUERDO)) {
|
|
105
|
-
|
|
100
|
+
const valores = [];
|
|
106
101
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.COLCHETE_DIREITO)) {
|
|
107
102
|
return new construtos_1.Vetor(this.hashArquivo, 0, []);
|
|
108
103
|
}
|
|
109
104
|
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.COLCHETE_DIREITO)) {
|
|
110
|
-
|
|
105
|
+
const valor = this.atribuir();
|
|
111
106
|
valores.push(valor);
|
|
112
|
-
if (this.simboloAtual().tipo !==
|
|
113
|
-
eguap_1.default.COLCHETE_DIREITO) {
|
|
107
|
+
if (this.simboloAtual().tipo !== eguap_1.default.COLCHETE_DIREITO) {
|
|
114
108
|
this.consumir(eguap_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
115
109
|
}
|
|
116
110
|
}
|
|
117
111
|
return new construtos_1.Vetor(this.hashArquivo, 0, valores);
|
|
118
112
|
}
|
|
119
113
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_ESQUERDA)) {
|
|
120
|
-
|
|
121
|
-
|
|
114
|
+
const chaves = [];
|
|
115
|
+
const valores = [];
|
|
122
116
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA)) {
|
|
123
117
|
return new construtos_1.Dicionario(this.hashArquivo, 0, [], []);
|
|
124
118
|
}
|
|
125
119
|
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA)) {
|
|
126
|
-
|
|
120
|
+
const chave = this.atribuir();
|
|
127
121
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
128
|
-
|
|
122
|
+
const valor = this.atribuir();
|
|
129
123
|
chaves.push(chave);
|
|
130
124
|
valores.push(valor);
|
|
131
125
|
if (this.simboloAtual().tipo !== eguap_1.default.CHAVE_DIREITA) {
|
|
@@ -143,23 +137,23 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
143
137
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.ISTO))
|
|
144
138
|
return new construtos_1.Isto(this.hashArquivo, 0, this.simboloAnterior());
|
|
145
139
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.NUMERO, eguap_1.default.TEXTO)) {
|
|
146
|
-
|
|
140
|
+
const simboloAnterior = this.simboloAnterior();
|
|
147
141
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
148
142
|
}
|
|
149
143
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IDENTIFICADOR)) {
|
|
150
144
|
return new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
|
|
151
145
|
}
|
|
152
146
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PARENTESE_ESQUERDO)) {
|
|
153
|
-
|
|
147
|
+
const expressao = this.expressao();
|
|
154
148
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
155
149
|
return new construtos_1.Agrupamento(this.hashArquivo, 0, expressao);
|
|
156
150
|
}
|
|
157
151
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IMPORTAR))
|
|
158
152
|
return this.declaracaoImportar();
|
|
159
153
|
throw this.erro(this.simboloAtual(), 'Esperado expressão.');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
}
|
|
155
|
+
finalizarChamada(entidadeChamada) {
|
|
156
|
+
const argumentos = [];
|
|
163
157
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
164
158
|
do {
|
|
165
159
|
if (argumentos.length >= 255) {
|
|
@@ -168,22 +162,22 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
168
162
|
argumentos.push(this.expressao());
|
|
169
163
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
170
164
|
}
|
|
171
|
-
|
|
165
|
+
const parenteseDireito = this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
172
166
|
return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
167
|
+
}
|
|
168
|
+
chamar() {
|
|
169
|
+
let expressao = this.primario();
|
|
176
170
|
while (true) {
|
|
177
171
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PARENTESE_ESQUERDO)) {
|
|
178
172
|
expressao = this.finalizarChamada(expressao);
|
|
179
173
|
}
|
|
180
174
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PONTO)) {
|
|
181
|
-
|
|
175
|
+
const nome = this.consumir(eguap_1.default.IDENTIFICADOR, "Esperado nome do método após '.'.");
|
|
182
176
|
expressao = new construtos_1.AcessoMetodo(this.hashArquivo, expressao, nome);
|
|
183
177
|
}
|
|
184
178
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.COLCHETE_ESQUERDO)) {
|
|
185
|
-
|
|
186
|
-
|
|
179
|
+
const indice = this.expressao();
|
|
180
|
+
const simboloFechamento = this.consumir(eguap_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
187
181
|
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
188
182
|
}
|
|
189
183
|
else {
|
|
@@ -191,122 +185,122 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
191
185
|
}
|
|
192
186
|
}
|
|
193
187
|
return expressao;
|
|
194
|
-
}
|
|
195
|
-
|
|
188
|
+
}
|
|
189
|
+
unario() {
|
|
196
190
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.NEGACAO, eguap_1.default.SUBTRACAO, eguap_1.default.BIT_NOT)) {
|
|
197
|
-
|
|
198
|
-
|
|
191
|
+
const operador = this.simboloAnterior();
|
|
192
|
+
const direito = this.unario();
|
|
199
193
|
return new construtos_1.Unario(this.hashArquivo, operador, direito);
|
|
200
194
|
}
|
|
201
195
|
return this.chamar();
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
196
|
+
}
|
|
197
|
+
exponenciacao() {
|
|
198
|
+
let expressao = this.unario();
|
|
205
199
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.EXPONENCIACAO)) {
|
|
206
|
-
|
|
207
|
-
|
|
200
|
+
const operador = this.simboloAnterior();
|
|
201
|
+
const direito = this.unario();
|
|
208
202
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
209
203
|
}
|
|
210
204
|
return expressao;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
|
|
205
|
+
}
|
|
206
|
+
multiplicar() {
|
|
207
|
+
let expressao = this.exponenciacao();
|
|
214
208
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DIVISAO, eguap_1.default.MULTIPLICACAO, eguap_1.default.MODULO)) {
|
|
215
|
-
|
|
216
|
-
|
|
209
|
+
const operador = this.simboloAnterior();
|
|
210
|
+
const direito = this.exponenciacao();
|
|
217
211
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
218
212
|
}
|
|
219
213
|
return expressao;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
214
|
+
}
|
|
215
|
+
adicaoOuSubtracao() {
|
|
216
|
+
let expressao = this.multiplicar();
|
|
223
217
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SUBTRACAO, eguap_1.default.ADICAO)) {
|
|
224
|
-
|
|
225
|
-
|
|
218
|
+
const operador = this.simboloAnterior();
|
|
219
|
+
const direito = this.multiplicar();
|
|
226
220
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
227
221
|
}
|
|
228
222
|
return expressao;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
223
|
+
}
|
|
224
|
+
bitFill() {
|
|
225
|
+
let expressao = this.adicaoOuSubtracao();
|
|
232
226
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.MENOR_MENOR, eguap_1.default.MAIOR_MAIOR)) {
|
|
233
|
-
|
|
234
|
-
|
|
227
|
+
const operador = this.simboloAnterior();
|
|
228
|
+
const direito = this.adicaoOuSubtracao();
|
|
235
229
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
236
230
|
}
|
|
237
231
|
return expressao;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
232
|
+
}
|
|
233
|
+
bitE() {
|
|
234
|
+
let expressao = this.bitFill();
|
|
241
235
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.BIT_AND)) {
|
|
242
|
-
|
|
243
|
-
|
|
236
|
+
const operador = this.simboloAnterior();
|
|
237
|
+
const direito = this.bitFill();
|
|
244
238
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
245
239
|
}
|
|
246
240
|
return expressao;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
241
|
+
}
|
|
242
|
+
bitOu() {
|
|
243
|
+
let expressao = this.bitE();
|
|
250
244
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.BIT_OR, eguap_1.default.BIT_XOR)) {
|
|
251
|
-
|
|
252
|
-
|
|
245
|
+
const operador = this.simboloAnterior();
|
|
246
|
+
const direito = this.bitE();
|
|
253
247
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
254
248
|
}
|
|
255
249
|
return expressao;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
|
|
250
|
+
}
|
|
251
|
+
comparar() {
|
|
252
|
+
let expressao = this.bitOu();
|
|
259
253
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIOR, eguap_1.default.MAIOR_IGUAL, eguap_1.default.MENOR, eguap_1.default.MENOR_IGUAL)) {
|
|
260
|
-
|
|
261
|
-
|
|
254
|
+
const operador = this.simboloAnterior();
|
|
255
|
+
const direito = this.bitOu();
|
|
262
256
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
263
257
|
}
|
|
264
258
|
return expressao;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
259
|
+
}
|
|
260
|
+
comparacaoIgualdade() {
|
|
261
|
+
let expressao = this.comparar();
|
|
268
262
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DIFERENTE, eguap_1.default.IGUAL_IGUAL)) {
|
|
269
|
-
|
|
270
|
-
|
|
263
|
+
const operador = this.simboloAnterior();
|
|
264
|
+
const direito = this.comparar();
|
|
271
265
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
272
266
|
}
|
|
273
267
|
return expressao;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
268
|
+
}
|
|
269
|
+
em() {
|
|
270
|
+
let expressao = this.comparacaoIgualdade();
|
|
277
271
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.EM)) {
|
|
278
|
-
|
|
279
|
-
|
|
272
|
+
const operador = this.simboloAnterior();
|
|
273
|
+
const direito = this.comparacaoIgualdade();
|
|
280
274
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
281
275
|
}
|
|
282
276
|
return expressao;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
|
|
277
|
+
}
|
|
278
|
+
e() {
|
|
279
|
+
let expressao = this.em();
|
|
286
280
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.E)) {
|
|
287
|
-
|
|
288
|
-
|
|
281
|
+
const operador = this.simboloAnterior();
|
|
282
|
+
const direito = this.em();
|
|
289
283
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
290
284
|
}
|
|
291
285
|
return expressao;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
286
|
+
}
|
|
287
|
+
ou() {
|
|
288
|
+
let expressao = this.e();
|
|
295
289
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.OU)) {
|
|
296
|
-
|
|
297
|
-
|
|
290
|
+
const operador = this.simboloAnterior();
|
|
291
|
+
const direito = this.e();
|
|
298
292
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
299
293
|
}
|
|
300
294
|
return expressao;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
|
|
295
|
+
}
|
|
296
|
+
atribuir() {
|
|
297
|
+
const expressao = this.ou();
|
|
304
298
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IGUAL) ||
|
|
305
299
|
this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIS_IGUAL)) {
|
|
306
|
-
|
|
307
|
-
|
|
300
|
+
const igual = this.simboloAnterior();
|
|
301
|
+
const valor = this.atribuir();
|
|
308
302
|
if (expressao instanceof construtos_1.Variavel) {
|
|
309
|
-
|
|
303
|
+
const simbolo = expressao.simbolo;
|
|
310
304
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
311
305
|
}
|
|
312
306
|
else if (expressao instanceof construtos_1.AcessoMetodo) {
|
|
@@ -318,40 +312,40 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
318
312
|
this.erro(igual, 'Tarefa de atribuição inválida');
|
|
319
313
|
}
|
|
320
314
|
return expressao;
|
|
321
|
-
}
|
|
322
|
-
|
|
315
|
+
}
|
|
316
|
+
expressao() {
|
|
323
317
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.LEIA))
|
|
324
318
|
return this.declaracaoLeia();
|
|
325
319
|
return this.atribuir();
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
|
|
320
|
+
}
|
|
321
|
+
declaracaoEscreva() {
|
|
322
|
+
const simboloAtual = this.simboloAtual();
|
|
329
323
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
330
|
-
|
|
324
|
+
const argumentos = [];
|
|
331
325
|
do {
|
|
332
326
|
argumentos.push(this.expressao());
|
|
333
327
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
334
328
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
335
329
|
return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
|
|
330
|
+
}
|
|
331
|
+
declaracaoExpressao() {
|
|
332
|
+
const expressao = this.expressao();
|
|
339
333
|
return new declaracoes_1.Expressao(expressao);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
|
|
334
|
+
}
|
|
335
|
+
declaracaoLeia() {
|
|
336
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
343
337
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em leia.");
|
|
344
|
-
|
|
338
|
+
const argumentos = [];
|
|
345
339
|
do {
|
|
346
340
|
argumentos.push(this.expressao());
|
|
347
341
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
348
342
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em leia.");
|
|
349
343
|
return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
344
|
+
}
|
|
345
|
+
blocoEscopo() {
|
|
346
|
+
const declaracoes = [];
|
|
347
|
+
let simboloAtual = this.simboloAtual();
|
|
348
|
+
const simboloAnterior = this.simboloAnterior();
|
|
355
349
|
// Situação 1: não tem bloco de escopo.
|
|
356
350
|
//
|
|
357
351
|
// Exemplo: `se verdadeiro: escreva('Alguma coisa')`.
|
|
@@ -365,12 +359,12 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
365
359
|
// Verifica-se o número de espaços à esquerda da linha através dos pragmas.
|
|
366
360
|
// Se número de espaços da linha do símbolo atual é menor ou igual ao número de espaços
|
|
367
361
|
// da linha anterior, e bloco ainda não começou, é uma situação de erro.
|
|
368
|
-
|
|
369
|
-
|
|
362
|
+
let espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
363
|
+
const espacosIndentacaoLinhaAnterior = this.pragmas[simboloAnterior.linha].espacosIndentacao;
|
|
370
364
|
if (espacosIndentacaoLinhaAtual <= espacosIndentacaoLinhaAnterior) {
|
|
371
|
-
this.erro(simboloAtual,
|
|
372
|
-
|
|
373
|
-
|
|
365
|
+
this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
|
|
366
|
+
`Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
|
|
367
|
+
`Atual: ${espacosIndentacaoLinhaAtual}`);
|
|
374
368
|
}
|
|
375
369
|
else {
|
|
376
370
|
// Indentação ok, é um bloco de escopo.
|
|
@@ -378,30 +372,29 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
378
372
|
// de indentação do bloco.
|
|
379
373
|
// Se `simboloAtual` for definido em algum momento como indefinido,
|
|
380
374
|
// Significa que o código acabou, então o bloco também acabou.
|
|
381
|
-
|
|
375
|
+
const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
|
|
382
376
|
while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
|
|
383
377
|
declaracoes.push(this.declaracao());
|
|
384
378
|
simboloAtual = this.simboloAtual();
|
|
385
379
|
if (!simboloAtual)
|
|
386
380
|
break;
|
|
387
|
-
espacosIndentacaoLinhaAtual =
|
|
388
|
-
this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
381
|
+
espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
389
382
|
}
|
|
390
383
|
}
|
|
391
384
|
}
|
|
392
385
|
return declaracoes;
|
|
393
|
-
}
|
|
394
|
-
|
|
386
|
+
}
|
|
387
|
+
declaracaoSe() {
|
|
395
388
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'se'.");
|
|
396
|
-
|
|
389
|
+
const condicao = this.expressao();
|
|
397
390
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após condição do se.");
|
|
398
|
-
|
|
399
|
-
|
|
391
|
+
const caminhoEntao = this.resolverDeclaracao();
|
|
392
|
+
const caminhosSeSenao = [];
|
|
400
393
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAOSE, eguap_1.default.SENÃOSE)) {
|
|
401
394
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'senaose' ou 'senãose'.");
|
|
402
|
-
|
|
395
|
+
const condicaoSeSenao = this.expressao();
|
|
403
396
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após codição do 'senaose' ou 'senãose'.");
|
|
404
|
-
|
|
397
|
+
const caminho = this.resolverDeclaracao();
|
|
405
398
|
caminhosSeSenao.push({
|
|
406
399
|
condicao: condicaoSeSenao,
|
|
407
400
|
caminho: caminho,
|
|
@@ -412,31 +405,31 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
412
405
|
/* if (this.escopos.length > 0) {
|
|
413
406
|
this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ESPACO_INDENTACAO);
|
|
414
407
|
} */
|
|
415
|
-
|
|
408
|
+
let caminhoSenao = null;
|
|
416
409
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAO, eguap_1.default.SENÃO)) {
|
|
417
410
|
caminhoSenao = this.resolverDeclaracao();
|
|
418
411
|
}
|
|
419
412
|
return new declaracoes_1.Se(condicao, caminhoEntao, caminhosSeSenao, caminhoSenao);
|
|
420
|
-
}
|
|
421
|
-
|
|
413
|
+
}
|
|
414
|
+
declaracaoEnquanto() {
|
|
422
415
|
try {
|
|
423
|
-
this.
|
|
416
|
+
this.blocos += 1;
|
|
424
417
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'enquanto'.");
|
|
425
|
-
|
|
418
|
+
const condicao = this.expressao();
|
|
426
419
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após condicional.");
|
|
427
|
-
|
|
420
|
+
const corpo = this.resolverDeclaracao();
|
|
428
421
|
return new declaracoes_1.Enquanto(condicao, corpo);
|
|
429
422
|
}
|
|
430
423
|
finally {
|
|
431
|
-
this.
|
|
424
|
+
this.blocos -= 1;
|
|
432
425
|
}
|
|
433
|
-
}
|
|
434
|
-
|
|
426
|
+
}
|
|
427
|
+
declaracaoPara() {
|
|
435
428
|
try {
|
|
436
|
-
|
|
437
|
-
this.
|
|
429
|
+
const simboloPara = this.simboloAnterior();
|
|
430
|
+
this.blocos += 1;
|
|
438
431
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'para'.");
|
|
439
|
-
|
|
432
|
+
let inicializador;
|
|
440
433
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
441
434
|
inicializador = null;
|
|
442
435
|
}
|
|
@@ -446,63 +439,62 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
446
439
|
else {
|
|
447
440
|
inicializador = this.declaracaoExpressao();
|
|
448
441
|
}
|
|
449
|
-
|
|
442
|
+
let condicao = null;
|
|
450
443
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
451
444
|
condicao = this.expressao();
|
|
452
445
|
}
|
|
453
|
-
|
|
446
|
+
let incrementar = null;
|
|
454
447
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
455
448
|
incrementar = this.expressao();
|
|
456
449
|
}
|
|
457
450
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas");
|
|
458
|
-
|
|
451
|
+
const corpo = this.resolverDeclaracao();
|
|
459
452
|
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
460
453
|
}
|
|
461
454
|
catch (erro) {
|
|
462
455
|
throw erro;
|
|
463
456
|
}
|
|
464
457
|
finally {
|
|
465
|
-
this.
|
|
458
|
+
this.blocos -= 1;
|
|
466
459
|
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
if (this.
|
|
460
|
+
}
|
|
461
|
+
declaracaoSustar() {
|
|
462
|
+
if (this.blocos < 1) {
|
|
470
463
|
this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
|
|
471
464
|
}
|
|
472
465
|
return new declaracoes_1.Sustar(this.simboloAtual());
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
if (this.
|
|
466
|
+
}
|
|
467
|
+
declaracaoContinua() {
|
|
468
|
+
if (this.blocos < 1) {
|
|
476
469
|
this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
|
|
477
470
|
}
|
|
478
471
|
return new declaracoes_1.Continua(this.simboloAtual());
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
472
|
+
}
|
|
473
|
+
declaracaoRetorna() {
|
|
474
|
+
const palavraChave = this.simboloAnterior();
|
|
475
|
+
let valor = null;
|
|
483
476
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
484
477
|
valor = this.expressao();
|
|
485
478
|
}
|
|
486
479
|
return new declaracoes_1.Retorna(palavraChave, valor);
|
|
487
|
-
}
|
|
488
|
-
|
|
480
|
+
}
|
|
481
|
+
declaracaoEscolha() {
|
|
489
482
|
try {
|
|
490
|
-
this.
|
|
483
|
+
this.blocos += 1;
|
|
491
484
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após 'escolha'.");
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA) &&
|
|
496
|
-
!this.estaNoFinal()) {
|
|
485
|
+
const condicao = this.expressao();
|
|
486
|
+
const caminhos = [];
|
|
487
|
+
let caminhoPadrao = null;
|
|
488
|
+
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
497
489
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CASO)) {
|
|
498
|
-
|
|
490
|
+
const caminhoCondicoes = [this.expressao()];
|
|
499
491
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
500
492
|
while (this.verificarTipoSimboloAtual(eguap_1.default.CASO)) {
|
|
501
493
|
this.consumir(eguap_1.default.CASO, null);
|
|
502
494
|
caminhoCondicoes.push(this.expressao());
|
|
503
495
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
|
|
504
496
|
}
|
|
505
|
-
|
|
497
|
+
const declaracoes = [];
|
|
506
498
|
do {
|
|
507
499
|
declaracoes.push(this.resolverDeclaracao());
|
|
508
500
|
} while (!this.verificarTipoSimboloAtual(eguap_1.default.CASO) &&
|
|
@@ -510,76 +502,76 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
510
502
|
!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA));
|
|
511
503
|
caminhos.push({
|
|
512
504
|
condicoes: caminhoCondicoes,
|
|
513
|
-
declaracoes
|
|
505
|
+
declaracoes,
|
|
514
506
|
});
|
|
515
507
|
}
|
|
516
508
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PADRAO)) {
|
|
517
509
|
if (caminhoPadrao !== null) {
|
|
518
|
-
|
|
510
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simboloAtual(), "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
|
|
519
511
|
this.erros.push(excecao);
|
|
520
512
|
throw excecao;
|
|
521
513
|
}
|
|
522
514
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
|
|
523
|
-
|
|
515
|
+
const declaracoes = [];
|
|
524
516
|
do {
|
|
525
517
|
declaracoes.push(this.resolverDeclaracao());
|
|
526
518
|
} while (!this.verificarTipoSimboloAtual(eguap_1.default.CASO) &&
|
|
527
519
|
!this.verificarTipoSimboloAtual(eguap_1.default.PADRAO) &&
|
|
528
520
|
!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA));
|
|
529
521
|
caminhoPadrao = {
|
|
530
|
-
declaracoes
|
|
522
|
+
declaracoes,
|
|
531
523
|
};
|
|
532
524
|
}
|
|
533
525
|
}
|
|
534
526
|
return new declaracoes_1.Escolha(condicao, caminhos, caminhoPadrao);
|
|
535
527
|
}
|
|
536
528
|
finally {
|
|
537
|
-
this.
|
|
529
|
+
this.blocos -= 1;
|
|
538
530
|
}
|
|
539
|
-
}
|
|
540
|
-
|
|
531
|
+
}
|
|
532
|
+
declaracaoImportar() {
|
|
541
533
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
|
|
542
|
-
|
|
543
|
-
|
|
534
|
+
const caminho = this.expressao();
|
|
535
|
+
const simboloFechamento = this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
|
|
544
536
|
return new declaracoes_1.Importar(caminho, simboloFechamento);
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
|
|
537
|
+
}
|
|
538
|
+
declaracaoTente() {
|
|
539
|
+
const simboloTente = this.simboloAnterior();
|
|
548
540
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'tente'.");
|
|
549
|
-
|
|
550
|
-
|
|
541
|
+
const blocoTente = this.blocoEscopo();
|
|
542
|
+
let blocoPegue = null;
|
|
551
543
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PEGUE)) {
|
|
552
544
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
553
545
|
blocoPegue = this.blocoEscopo();
|
|
554
546
|
}
|
|
555
|
-
|
|
547
|
+
let blocoSenao = null;
|
|
556
548
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAO, eguap_1.default.SENÃO)) {
|
|
557
549
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
558
550
|
blocoSenao = this.blocoEscopo();
|
|
559
551
|
}
|
|
560
|
-
|
|
552
|
+
let blocoFinalmente = null;
|
|
561
553
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.FINALMENTE)) {
|
|
562
554
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
563
555
|
blocoFinalmente = this.blocoEscopo();
|
|
564
556
|
}
|
|
565
557
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
|
|
558
|
+
}
|
|
559
|
+
declaracaoFazer() {
|
|
560
|
+
const simboloFazer = this.simboloAnterior();
|
|
569
561
|
try {
|
|
570
|
-
this.
|
|
571
|
-
|
|
562
|
+
this.blocos += 1;
|
|
563
|
+
const caminhoFazer = this.resolverDeclaracao();
|
|
572
564
|
this.consumir(eguap_1.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
|
|
573
565
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração 'enquanto'.");
|
|
574
|
-
|
|
566
|
+
const condicaoEnquanto = this.expressao();
|
|
575
567
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração do 'enquanto'.");
|
|
576
568
|
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
|
|
577
569
|
}
|
|
578
570
|
finally {
|
|
579
|
-
this.
|
|
571
|
+
this.blocos -= 1;
|
|
580
572
|
}
|
|
581
|
-
}
|
|
582
|
-
|
|
573
|
+
}
|
|
574
|
+
resolverDeclaracao() {
|
|
583
575
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.FAZER))
|
|
584
576
|
return this.declaracaoFazer();
|
|
585
577
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.TENTE))
|
|
@@ -602,31 +594,31 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
602
594
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.ESCREVA))
|
|
603
595
|
return this.declaracaoEscreva();
|
|
604
596
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DOIS_PONTOS)) {
|
|
605
|
-
|
|
597
|
+
const simboloInicioBloco = this.simboloAnterior();
|
|
606
598
|
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
|
|
607
599
|
}
|
|
608
600
|
return this.declaracaoExpressao();
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
601
|
+
}
|
|
602
|
+
declaracaoDeVariavel() {
|
|
603
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome de variável.');
|
|
604
|
+
let inicializador = null;
|
|
613
605
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IGUAL) ||
|
|
614
606
|
this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIS_IGUAL)) {
|
|
615
607
|
inicializador = this.expressao();
|
|
616
608
|
}
|
|
617
609
|
return new declaracoes_1.Var(simbolo, inicializador);
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
|
|
610
|
+
}
|
|
611
|
+
funcao(tipo) {
|
|
612
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, `Esperado nome ${tipo}.`);
|
|
621
613
|
return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo));
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
|
|
614
|
+
}
|
|
615
|
+
logicaComumParametros() {
|
|
616
|
+
const parametros = [];
|
|
625
617
|
do {
|
|
626
618
|
if (parametros.length >= 255) {
|
|
627
619
|
this.erro(this.simboloAtual(), 'Não pode haver mais de 255 parâmetros');
|
|
628
620
|
}
|
|
629
|
-
|
|
621
|
+
const parametro = {};
|
|
630
622
|
if (this.simboloAtual().tipo === eguap_1.default.MULTIPLICACAO) {
|
|
631
623
|
this.consumir(eguap_1.default.MULTIPLICACAO, null);
|
|
632
624
|
parametro['tipo'] = 'estrela';
|
|
@@ -643,39 +635,38 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
643
635
|
break;
|
|
644
636
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
645
637
|
return parametros;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
this.consumir(eguap_1.default.PARENTESE_ESQUERDO,
|
|
649
|
-
|
|
638
|
+
}
|
|
639
|
+
corpoDaFuncao(tipo) {
|
|
640
|
+
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
|
|
641
|
+
let parametros = [];
|
|
650
642
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
651
643
|
parametros = this.logicaComumParametros();
|
|
652
644
|
}
|
|
653
645
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
654
|
-
this.consumir(eguap_1.default.DOIS_PONTOS,
|
|
655
|
-
|
|
646
|
+
this.consumir(eguap_1.default.DOIS_PONTOS, `Esperado ':' antes do escopo do ${tipo}.`);
|
|
647
|
+
const corpo = this.blocoEscopo();
|
|
656
648
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, 0, parametros, corpo);
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
649
|
+
}
|
|
650
|
+
declaracaoDeClasse() {
|
|
651
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
652
|
+
let superClasse = null;
|
|
661
653
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.HERDA)) {
|
|
662
654
|
this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome da SuperClasse.');
|
|
663
655
|
superClasse = new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
|
|
664
656
|
}
|
|
665
657
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' antes do escopo da classe.");
|
|
666
|
-
|
|
667
|
-
while (!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA) &&
|
|
668
|
-
!this.estaNoFinal()) {
|
|
658
|
+
const metodos = [];
|
|
659
|
+
while (!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
669
660
|
metodos.push(this.funcao('método'));
|
|
670
661
|
}
|
|
671
662
|
return new declaracoes_1.Classe(simbolo, superClasse, metodos);
|
|
672
|
-
}
|
|
663
|
+
}
|
|
673
664
|
/**
|
|
674
665
|
* Consome o símbolo atual, verificando se é uma declaração de função, variável, classe
|
|
675
666
|
* ou uma expressão.
|
|
676
667
|
* @returns Objeto do tipo `Declaracao`.
|
|
677
668
|
*/
|
|
678
|
-
|
|
669
|
+
declaracao() {
|
|
679
670
|
try {
|
|
680
671
|
if ((this.verificarTipoSimboloAtual(eguap_1.default.FUNCAO) ||
|
|
681
672
|
this.verificarTipoSimboloAtual(eguap_1.default.FUNÇÃO)) &&
|
|
@@ -693,30 +684,29 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
693
684
|
this.sincronizar();
|
|
694
685
|
return null;
|
|
695
686
|
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
|
|
687
|
+
}
|
|
688
|
+
analisar(retornoLexador, hashArquivo) {
|
|
689
|
+
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
699
690
|
this.erros = [];
|
|
700
691
|
this.atual = 0;
|
|
701
|
-
this.
|
|
692
|
+
this.blocos = 0;
|
|
702
693
|
this.escopos = [];
|
|
703
694
|
this.hashArquivo = hashArquivo || 0;
|
|
704
695
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
705
696
|
this.pragmas = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.pragmas) || {};
|
|
706
|
-
|
|
697
|
+
const declaracoes = [];
|
|
707
698
|
while (!this.estaNoFinal()) {
|
|
708
699
|
declaracoes.push(this.declaracao());
|
|
709
700
|
}
|
|
710
701
|
if (this.performance) {
|
|
711
|
-
|
|
712
|
-
console.log(
|
|
702
|
+
const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
|
|
703
|
+
console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
|
|
713
704
|
}
|
|
714
705
|
return {
|
|
715
706
|
declaracoes: declaracoes,
|
|
716
707
|
erros: this.erros,
|
|
717
708
|
};
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
}());
|
|
709
|
+
}
|
|
710
|
+
}
|
|
721
711
|
exports.AvaliadorSintaticoEguaP = AvaliadorSintaticoEguaP;
|
|
722
712
|
//# sourceMappingURL=avaliador-sintatico-eguap.js.map
|