@designliquido/delegua 0.9.3 → 0.9.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/README.md +25 -3
- package/bin/delegua +1 -1
- package/bin/delegua.cmd +1 -1
- package/bin/package.json +7 -5
- 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.js +108 -105
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/fontes/avaliador-sintatico/avaliador-sintatico.js +226 -232
- package/fontes/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js +35 -55
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +211 -216
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js +231 -237
- 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 +188 -121
- 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 +117 -200
- 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/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 +1 -0
- package/fontes/lexador/dialetos/lexador-birl.js +55 -64
- 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.js +1 -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.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 +1 -0
- package/fontes/tipos-de-simbolos/birl.js +1 -0
- 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 +4 -0
- package/index.js +4 -26
- package/index.js.map +1 -1
- package/jest.config.js +9 -47
- package/jest.config.js.map +1 -1
- package/package.json +7 -5
- 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.js +8 -8
- package/testes/birl/avaliador-sintatico.test.js.map +1 -1
- package/testes/birl/lexador.test.js +10 -10
- package/testes/birl/lexador.test.js.map +1 -1
- 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
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,72 +41,68 @@ 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
107
|
if (this.simboloAtual().tipo !== eguap_1.default.COLCHETE_DIREITO) {
|
|
113
108
|
this.consumir(eguap_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
@@ -116,15 +111,15 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
116
111
|
return new construtos_1.Vetor(this.hashArquivo, 0, valores);
|
|
117
112
|
}
|
|
118
113
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_ESQUERDA)) {
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
const chaves = [];
|
|
115
|
+
const valores = [];
|
|
121
116
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA)) {
|
|
122
117
|
return new construtos_1.Dicionario(this.hashArquivo, 0, [], []);
|
|
123
118
|
}
|
|
124
119
|
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA)) {
|
|
125
|
-
|
|
120
|
+
const chave = this.atribuir();
|
|
126
121
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
127
|
-
|
|
122
|
+
const valor = this.atribuir();
|
|
128
123
|
chaves.push(chave);
|
|
129
124
|
valores.push(valor);
|
|
130
125
|
if (this.simboloAtual().tipo !== eguap_1.default.CHAVE_DIREITA) {
|
|
@@ -142,23 +137,23 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
142
137
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.ISTO))
|
|
143
138
|
return new construtos_1.Isto(this.hashArquivo, 0, this.simboloAnterior());
|
|
144
139
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.NUMERO, eguap_1.default.TEXTO)) {
|
|
145
|
-
|
|
140
|
+
const simboloAnterior = this.simboloAnterior();
|
|
146
141
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
147
142
|
}
|
|
148
143
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IDENTIFICADOR)) {
|
|
149
144
|
return new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
|
|
150
145
|
}
|
|
151
146
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PARENTESE_ESQUERDO)) {
|
|
152
|
-
|
|
147
|
+
const expressao = this.expressao();
|
|
153
148
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
154
149
|
return new construtos_1.Agrupamento(this.hashArquivo, 0, expressao);
|
|
155
150
|
}
|
|
156
151
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IMPORTAR))
|
|
157
152
|
return this.declaracaoImportar();
|
|
158
153
|
throw this.erro(this.simboloAtual(), 'Esperado expressão.');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
}
|
|
155
|
+
finalizarChamada(entidadeChamada) {
|
|
156
|
+
const argumentos = [];
|
|
162
157
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
163
158
|
do {
|
|
164
159
|
if (argumentos.length >= 255) {
|
|
@@ -167,22 +162,22 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
167
162
|
argumentos.push(this.expressao());
|
|
168
163
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
169
164
|
}
|
|
170
|
-
|
|
165
|
+
const parenteseDireito = this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
171
166
|
return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
167
|
+
}
|
|
168
|
+
chamar() {
|
|
169
|
+
let expressao = this.primario();
|
|
175
170
|
while (true) {
|
|
176
171
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PARENTESE_ESQUERDO)) {
|
|
177
172
|
expressao = this.finalizarChamada(expressao);
|
|
178
173
|
}
|
|
179
174
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PONTO)) {
|
|
180
|
-
|
|
175
|
+
const nome = this.consumir(eguap_1.default.IDENTIFICADOR, "Esperado nome do método após '.'.");
|
|
181
176
|
expressao = new construtos_1.AcessoMetodo(this.hashArquivo, expressao, nome);
|
|
182
177
|
}
|
|
183
178
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.COLCHETE_ESQUERDO)) {
|
|
184
|
-
|
|
185
|
-
|
|
179
|
+
const indice = this.expressao();
|
|
180
|
+
const simboloFechamento = this.consumir(eguap_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
186
181
|
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
187
182
|
}
|
|
188
183
|
else {
|
|
@@ -190,122 +185,122 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
190
185
|
}
|
|
191
186
|
}
|
|
192
187
|
return expressao;
|
|
193
|
-
}
|
|
194
|
-
|
|
188
|
+
}
|
|
189
|
+
unario() {
|
|
195
190
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.NEGACAO, eguap_1.default.SUBTRACAO, eguap_1.default.BIT_NOT)) {
|
|
196
|
-
|
|
197
|
-
|
|
191
|
+
const operador = this.simboloAnterior();
|
|
192
|
+
const direito = this.unario();
|
|
198
193
|
return new construtos_1.Unario(this.hashArquivo, operador, direito);
|
|
199
194
|
}
|
|
200
195
|
return this.chamar();
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
196
|
+
}
|
|
197
|
+
exponenciacao() {
|
|
198
|
+
let expressao = this.unario();
|
|
204
199
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.EXPONENCIACAO)) {
|
|
205
|
-
|
|
206
|
-
|
|
200
|
+
const operador = this.simboloAnterior();
|
|
201
|
+
const direito = this.unario();
|
|
207
202
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
208
203
|
}
|
|
209
204
|
return expressao;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
205
|
+
}
|
|
206
|
+
multiplicar() {
|
|
207
|
+
let expressao = this.exponenciacao();
|
|
213
208
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DIVISAO, eguap_1.default.MULTIPLICACAO, eguap_1.default.MODULO)) {
|
|
214
|
-
|
|
215
|
-
|
|
209
|
+
const operador = this.simboloAnterior();
|
|
210
|
+
const direito = this.exponenciacao();
|
|
216
211
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
217
212
|
}
|
|
218
213
|
return expressao;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
|
|
214
|
+
}
|
|
215
|
+
adicaoOuSubtracao() {
|
|
216
|
+
let expressao = this.multiplicar();
|
|
222
217
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SUBTRACAO, eguap_1.default.ADICAO)) {
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
const operador = this.simboloAnterior();
|
|
219
|
+
const direito = this.multiplicar();
|
|
225
220
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
226
221
|
}
|
|
227
222
|
return expressao;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
223
|
+
}
|
|
224
|
+
bitFill() {
|
|
225
|
+
let expressao = this.adicaoOuSubtracao();
|
|
231
226
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.MENOR_MENOR, eguap_1.default.MAIOR_MAIOR)) {
|
|
232
|
-
|
|
233
|
-
|
|
227
|
+
const operador = this.simboloAnterior();
|
|
228
|
+
const direito = this.adicaoOuSubtracao();
|
|
234
229
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
235
230
|
}
|
|
236
231
|
return expressao;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
|
|
232
|
+
}
|
|
233
|
+
bitE() {
|
|
234
|
+
let expressao = this.bitFill();
|
|
240
235
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.BIT_AND)) {
|
|
241
|
-
|
|
242
|
-
|
|
236
|
+
const operador = this.simboloAnterior();
|
|
237
|
+
const direito = this.bitFill();
|
|
243
238
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
244
239
|
}
|
|
245
240
|
return expressao;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
|
|
241
|
+
}
|
|
242
|
+
bitOu() {
|
|
243
|
+
let expressao = this.bitE();
|
|
249
244
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.BIT_OR, eguap_1.default.BIT_XOR)) {
|
|
250
|
-
|
|
251
|
-
|
|
245
|
+
const operador = this.simboloAnterior();
|
|
246
|
+
const direito = this.bitE();
|
|
252
247
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
253
248
|
}
|
|
254
249
|
return expressao;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
|
|
250
|
+
}
|
|
251
|
+
comparar() {
|
|
252
|
+
let expressao = this.bitOu();
|
|
258
253
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIOR, eguap_1.default.MAIOR_IGUAL, eguap_1.default.MENOR, eguap_1.default.MENOR_IGUAL)) {
|
|
259
|
-
|
|
260
|
-
|
|
254
|
+
const operador = this.simboloAnterior();
|
|
255
|
+
const direito = this.bitOu();
|
|
261
256
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
262
257
|
}
|
|
263
258
|
return expressao;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
|
|
259
|
+
}
|
|
260
|
+
comparacaoIgualdade() {
|
|
261
|
+
let expressao = this.comparar();
|
|
267
262
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DIFERENTE, eguap_1.default.IGUAL_IGUAL)) {
|
|
268
|
-
|
|
269
|
-
|
|
263
|
+
const operador = this.simboloAnterior();
|
|
264
|
+
const direito = this.comparar();
|
|
270
265
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
271
266
|
}
|
|
272
267
|
return expressao;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
268
|
+
}
|
|
269
|
+
em() {
|
|
270
|
+
let expressao = this.comparacaoIgualdade();
|
|
276
271
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.EM)) {
|
|
277
|
-
|
|
278
|
-
|
|
272
|
+
const operador = this.simboloAnterior();
|
|
273
|
+
const direito = this.comparacaoIgualdade();
|
|
279
274
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
280
275
|
}
|
|
281
276
|
return expressao;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
277
|
+
}
|
|
278
|
+
e() {
|
|
279
|
+
let expressao = this.em();
|
|
285
280
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.E)) {
|
|
286
|
-
|
|
287
|
-
|
|
281
|
+
const operador = this.simboloAnterior();
|
|
282
|
+
const direito = this.em();
|
|
288
283
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
289
284
|
}
|
|
290
285
|
return expressao;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
286
|
+
}
|
|
287
|
+
ou() {
|
|
288
|
+
let expressao = this.e();
|
|
294
289
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.OU)) {
|
|
295
|
-
|
|
296
|
-
|
|
290
|
+
const operador = this.simboloAnterior();
|
|
291
|
+
const direito = this.e();
|
|
297
292
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
298
293
|
}
|
|
299
294
|
return expressao;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
295
|
+
}
|
|
296
|
+
atribuir() {
|
|
297
|
+
const expressao = this.ou();
|
|
303
298
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IGUAL) ||
|
|
304
299
|
this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIS_IGUAL)) {
|
|
305
|
-
|
|
306
|
-
|
|
300
|
+
const igual = this.simboloAnterior();
|
|
301
|
+
const valor = this.atribuir();
|
|
307
302
|
if (expressao instanceof construtos_1.Variavel) {
|
|
308
|
-
|
|
303
|
+
const simbolo = expressao.simbolo;
|
|
309
304
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
310
305
|
}
|
|
311
306
|
else if (expressao instanceof construtos_1.AcessoMetodo) {
|
|
@@ -317,40 +312,40 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
317
312
|
this.erro(igual, 'Tarefa de atribuição inválida');
|
|
318
313
|
}
|
|
319
314
|
return expressao;
|
|
320
|
-
}
|
|
321
|
-
|
|
315
|
+
}
|
|
316
|
+
expressao() {
|
|
322
317
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.LEIA))
|
|
323
318
|
return this.declaracaoLeia();
|
|
324
319
|
return this.atribuir();
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
|
|
320
|
+
}
|
|
321
|
+
declaracaoEscreva() {
|
|
322
|
+
const simboloAtual = this.simboloAtual();
|
|
328
323
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
329
|
-
|
|
324
|
+
const argumentos = [];
|
|
330
325
|
do {
|
|
331
326
|
argumentos.push(this.expressao());
|
|
332
327
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
333
328
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
334
329
|
return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
330
|
+
}
|
|
331
|
+
declaracaoExpressao() {
|
|
332
|
+
const expressao = this.expressao();
|
|
338
333
|
return new declaracoes_1.Expressao(expressao);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
|
|
334
|
+
}
|
|
335
|
+
declaracaoLeia() {
|
|
336
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
342
337
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em leia.");
|
|
343
|
-
|
|
338
|
+
const argumentos = [];
|
|
344
339
|
do {
|
|
345
340
|
argumentos.push(this.expressao());
|
|
346
341
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
347
342
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em leia.");
|
|
348
343
|
return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
344
|
+
}
|
|
345
|
+
blocoEscopo() {
|
|
346
|
+
const declaracoes = [];
|
|
347
|
+
let simboloAtual = this.simboloAtual();
|
|
348
|
+
const simboloAnterior = this.simboloAnterior();
|
|
354
349
|
// Situação 1: não tem bloco de escopo.
|
|
355
350
|
//
|
|
356
351
|
// Exemplo: `se verdadeiro: escreva('Alguma coisa')`.
|
|
@@ -364,12 +359,12 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
364
359
|
// Verifica-se o número de espaços à esquerda da linha através dos pragmas.
|
|
365
360
|
// Se número de espaços da linha do símbolo atual é menor ou igual ao número de espaços
|
|
366
361
|
// da linha anterior, e bloco ainda não começou, é uma situação de erro.
|
|
367
|
-
|
|
368
|
-
|
|
362
|
+
let espacosIndentacaoLinhaAtual = this.pragmas[simboloAtual.linha].espacosIndentacao;
|
|
363
|
+
const espacosIndentacaoLinhaAnterior = this.pragmas[simboloAnterior.linha].espacosIndentacao;
|
|
369
364
|
if (espacosIndentacaoLinhaAtual <= espacosIndentacaoLinhaAnterior) {
|
|
370
|
-
this.erro(simboloAtual,
|
|
371
|
-
|
|
372
|
-
|
|
365
|
+
this.erro(simboloAtual, `Indentação inconsistente na linha ${simboloAtual.linha}. ` +
|
|
366
|
+
`Esperado: >= ${espacosIndentacaoLinhaAnterior}. ` +
|
|
367
|
+
`Atual: ${espacosIndentacaoLinhaAtual}`);
|
|
373
368
|
}
|
|
374
369
|
else {
|
|
375
370
|
// Indentação ok, é um bloco de escopo.
|
|
@@ -377,7 +372,7 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
377
372
|
// de indentação do bloco.
|
|
378
373
|
// Se `simboloAtual` for definido em algum momento como indefinido,
|
|
379
374
|
// Significa que o código acabou, então o bloco também acabou.
|
|
380
|
-
|
|
375
|
+
const espacosIndentacaoBloco = espacosIndentacaoLinhaAtual;
|
|
381
376
|
while (espacosIndentacaoLinhaAtual === espacosIndentacaoBloco) {
|
|
382
377
|
declaracoes.push(this.declaracao());
|
|
383
378
|
simboloAtual = this.simboloAtual();
|
|
@@ -388,18 +383,18 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
388
383
|
}
|
|
389
384
|
}
|
|
390
385
|
return declaracoes;
|
|
391
|
-
}
|
|
392
|
-
|
|
386
|
+
}
|
|
387
|
+
declaracaoSe() {
|
|
393
388
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'se'.");
|
|
394
|
-
|
|
389
|
+
const condicao = this.expressao();
|
|
395
390
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após condição do se.");
|
|
396
|
-
|
|
397
|
-
|
|
391
|
+
const caminhoEntao = this.resolverDeclaracao();
|
|
392
|
+
const caminhosSeSenao = [];
|
|
398
393
|
while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAOSE, eguap_1.default.SENÃOSE)) {
|
|
399
394
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'senaose' ou 'senãose'.");
|
|
400
|
-
|
|
395
|
+
const condicaoSeSenao = this.expressao();
|
|
401
396
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após codição do 'senaose' ou 'senãose'.");
|
|
402
|
-
|
|
397
|
+
const caminho = this.resolverDeclaracao();
|
|
403
398
|
caminhosSeSenao.push({
|
|
404
399
|
condicao: condicaoSeSenao,
|
|
405
400
|
caminho: caminho,
|
|
@@ -410,31 +405,31 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
410
405
|
/* if (this.escopos.length > 0) {
|
|
411
406
|
this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ESPACO_INDENTACAO);
|
|
412
407
|
} */
|
|
413
|
-
|
|
408
|
+
let caminhoSenao = null;
|
|
414
409
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAO, eguap_1.default.SENÃO)) {
|
|
415
410
|
caminhoSenao = this.resolverDeclaracao();
|
|
416
411
|
}
|
|
417
412
|
return new declaracoes_1.Se(condicao, caminhoEntao, caminhosSeSenao, caminhoSenao);
|
|
418
|
-
}
|
|
419
|
-
|
|
413
|
+
}
|
|
414
|
+
declaracaoEnquanto() {
|
|
420
415
|
try {
|
|
421
416
|
this.blocos += 1;
|
|
422
417
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'enquanto'.");
|
|
423
|
-
|
|
418
|
+
const condicao = this.expressao();
|
|
424
419
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após condicional.");
|
|
425
|
-
|
|
420
|
+
const corpo = this.resolverDeclaracao();
|
|
426
421
|
return new declaracoes_1.Enquanto(condicao, corpo);
|
|
427
422
|
}
|
|
428
423
|
finally {
|
|
429
424
|
this.blocos -= 1;
|
|
430
425
|
}
|
|
431
|
-
}
|
|
432
|
-
|
|
426
|
+
}
|
|
427
|
+
declaracaoPara() {
|
|
433
428
|
try {
|
|
434
|
-
|
|
429
|
+
const simboloPara = this.simboloAnterior();
|
|
435
430
|
this.blocos += 1;
|
|
436
431
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'para'.");
|
|
437
|
-
|
|
432
|
+
let inicializador;
|
|
438
433
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
439
434
|
inicializador = null;
|
|
440
435
|
}
|
|
@@ -444,16 +439,16 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
444
439
|
else {
|
|
445
440
|
inicializador = this.declaracaoExpressao();
|
|
446
441
|
}
|
|
447
|
-
|
|
442
|
+
let condicao = null;
|
|
448
443
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
449
444
|
condicao = this.expressao();
|
|
450
445
|
}
|
|
451
|
-
|
|
446
|
+
let incrementar = null;
|
|
452
447
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
453
448
|
incrementar = this.expressao();
|
|
454
449
|
}
|
|
455
450
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas");
|
|
456
|
-
|
|
451
|
+
const corpo = this.resolverDeclaracao();
|
|
457
452
|
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
458
453
|
}
|
|
459
454
|
catch (erro) {
|
|
@@ -462,44 +457,44 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
462
457
|
finally {
|
|
463
458
|
this.blocos -= 1;
|
|
464
459
|
}
|
|
465
|
-
}
|
|
466
|
-
|
|
460
|
+
}
|
|
461
|
+
declaracaoSustar() {
|
|
467
462
|
if (this.blocos < 1) {
|
|
468
463
|
this.erro(this.simboloAnterior(), "'sustar' deve estar dentro de um laço de repetição.");
|
|
469
464
|
}
|
|
470
465
|
return new declaracoes_1.Sustar(this.simboloAtual());
|
|
471
|
-
}
|
|
472
|
-
|
|
466
|
+
}
|
|
467
|
+
declaracaoContinua() {
|
|
473
468
|
if (this.blocos < 1) {
|
|
474
469
|
this.erro(this.simboloAnterior(), "'continua' precisa estar em um laço de repetição.");
|
|
475
470
|
}
|
|
476
471
|
return new declaracoes_1.Continua(this.simboloAtual());
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
472
|
+
}
|
|
473
|
+
declaracaoRetorna() {
|
|
474
|
+
const palavraChave = this.simboloAnterior();
|
|
475
|
+
let valor = null;
|
|
481
476
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PONTO_E_VIRGULA)) {
|
|
482
477
|
valor = this.expressao();
|
|
483
478
|
}
|
|
484
479
|
return new declaracoes_1.Retorna(palavraChave, valor);
|
|
485
|
-
}
|
|
486
|
-
|
|
480
|
+
}
|
|
481
|
+
declaracaoEscolha() {
|
|
487
482
|
try {
|
|
488
483
|
this.blocos += 1;
|
|
489
484
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após 'escolha'.");
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
485
|
+
const condicao = this.expressao();
|
|
486
|
+
const caminhos = [];
|
|
487
|
+
let caminhoPadrao = null;
|
|
493
488
|
while (!this.verificarSeSimboloAtualEIgualA(eguap_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
494
489
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.CASO)) {
|
|
495
|
-
|
|
490
|
+
const caminhoCondicoes = [this.expressao()];
|
|
496
491
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
497
492
|
while (this.verificarTipoSimboloAtual(eguap_1.default.CASO)) {
|
|
498
493
|
this.consumir(eguap_1.default.CASO, null);
|
|
499
494
|
caminhoCondicoes.push(this.expressao());
|
|
500
495
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
|
|
501
496
|
}
|
|
502
|
-
|
|
497
|
+
const declaracoes = [];
|
|
503
498
|
do {
|
|
504
499
|
declaracoes.push(this.resolverDeclaracao());
|
|
505
500
|
} while (!this.verificarTipoSimboloAtual(eguap_1.default.CASO) &&
|
|
@@ -507,24 +502,24 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
507
502
|
!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA));
|
|
508
503
|
caminhos.push({
|
|
509
504
|
condicoes: caminhoCondicoes,
|
|
510
|
-
declaracoes
|
|
505
|
+
declaracoes,
|
|
511
506
|
});
|
|
512
507
|
}
|
|
513
508
|
else if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PADRAO)) {
|
|
514
509
|
if (caminhoPadrao !== null) {
|
|
515
|
-
|
|
510
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simboloAtual(), "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
|
|
516
511
|
this.erros.push(excecao);
|
|
517
512
|
throw excecao;
|
|
518
513
|
}
|
|
519
514
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
|
|
520
|
-
|
|
515
|
+
const declaracoes = [];
|
|
521
516
|
do {
|
|
522
517
|
declaracoes.push(this.resolverDeclaracao());
|
|
523
518
|
} while (!this.verificarTipoSimboloAtual(eguap_1.default.CASO) &&
|
|
524
519
|
!this.verificarTipoSimboloAtual(eguap_1.default.PADRAO) &&
|
|
525
520
|
!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA));
|
|
526
521
|
caminhoPadrao = {
|
|
527
|
-
declaracoes
|
|
522
|
+
declaracoes,
|
|
528
523
|
};
|
|
529
524
|
}
|
|
530
525
|
}
|
|
@@ -533,50 +528,50 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
533
528
|
finally {
|
|
534
529
|
this.blocos -= 1;
|
|
535
530
|
}
|
|
536
|
-
}
|
|
537
|
-
|
|
531
|
+
}
|
|
532
|
+
declaracaoImportar() {
|
|
538
533
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
|
|
539
|
-
|
|
540
|
-
|
|
534
|
+
const caminho = this.expressao();
|
|
535
|
+
const simboloFechamento = this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
|
|
541
536
|
return new declaracoes_1.Importar(caminho, simboloFechamento);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
|
|
537
|
+
}
|
|
538
|
+
declaracaoTente() {
|
|
539
|
+
const simboloTente = this.simboloAnterior();
|
|
545
540
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'tente'.");
|
|
546
|
-
|
|
547
|
-
|
|
541
|
+
const blocoTente = this.blocoEscopo();
|
|
542
|
+
let blocoPegue = null;
|
|
548
543
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.PEGUE)) {
|
|
549
544
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
550
545
|
blocoPegue = this.blocoEscopo();
|
|
551
546
|
}
|
|
552
|
-
|
|
547
|
+
let blocoSenao = null;
|
|
553
548
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.SENAO, eguap_1.default.SENÃO)) {
|
|
554
549
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
555
550
|
blocoSenao = this.blocoEscopo();
|
|
556
551
|
}
|
|
557
|
-
|
|
552
|
+
let blocoFinalmente = null;
|
|
558
553
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.FINALMENTE)) {
|
|
559
554
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' após a declaração 'pegue'.");
|
|
560
555
|
blocoFinalmente = this.blocoEscopo();
|
|
561
556
|
}
|
|
562
557
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
|
|
558
|
+
}
|
|
559
|
+
declaracaoFazer() {
|
|
560
|
+
const simboloFazer = this.simboloAnterior();
|
|
566
561
|
try {
|
|
567
562
|
this.blocos += 1;
|
|
568
|
-
|
|
563
|
+
const caminhoFazer = this.resolverDeclaracao();
|
|
569
564
|
this.consumir(eguap_1.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
|
|
570
565
|
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração 'enquanto'.");
|
|
571
|
-
|
|
566
|
+
const condicaoEnquanto = this.expressao();
|
|
572
567
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração do 'enquanto'.");
|
|
573
568
|
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
|
|
574
569
|
}
|
|
575
570
|
finally {
|
|
576
571
|
this.blocos -= 1;
|
|
577
572
|
}
|
|
578
|
-
}
|
|
579
|
-
|
|
573
|
+
}
|
|
574
|
+
resolverDeclaracao() {
|
|
580
575
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.FAZER))
|
|
581
576
|
return this.declaracaoFazer();
|
|
582
577
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.TENTE))
|
|
@@ -599,31 +594,31 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
599
594
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.ESCREVA))
|
|
600
595
|
return this.declaracaoEscreva();
|
|
601
596
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.DOIS_PONTOS)) {
|
|
602
|
-
|
|
597
|
+
const simboloInicioBloco = this.simboloAnterior();
|
|
603
598
|
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
|
|
604
599
|
}
|
|
605
600
|
return this.declaracaoExpressao();
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
601
|
+
}
|
|
602
|
+
declaracaoDeVariavel() {
|
|
603
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome de variável.');
|
|
604
|
+
let inicializador = null;
|
|
610
605
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.IGUAL) ||
|
|
611
606
|
this.verificarSeSimboloAtualEIgualA(eguap_1.default.MAIS_IGUAL)) {
|
|
612
607
|
inicializador = this.expressao();
|
|
613
608
|
}
|
|
614
609
|
return new declaracoes_1.Var(simbolo, inicializador);
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
|
|
610
|
+
}
|
|
611
|
+
funcao(tipo) {
|
|
612
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, `Esperado nome ${tipo}.`);
|
|
618
613
|
return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo));
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
|
|
614
|
+
}
|
|
615
|
+
logicaComumParametros() {
|
|
616
|
+
const parametros = [];
|
|
622
617
|
do {
|
|
623
618
|
if (parametros.length >= 255) {
|
|
624
619
|
this.erro(this.simboloAtual(), 'Não pode haver mais de 255 parâmetros');
|
|
625
620
|
}
|
|
626
|
-
|
|
621
|
+
const parametro = {};
|
|
627
622
|
if (this.simboloAtual().tipo === eguap_1.default.MULTIPLICACAO) {
|
|
628
623
|
this.consumir(eguap_1.default.MULTIPLICACAO, null);
|
|
629
624
|
parametro['tipo'] = 'estrela';
|
|
@@ -640,38 +635,38 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
640
635
|
break;
|
|
641
636
|
} while (this.verificarSeSimboloAtualEIgualA(eguap_1.default.VIRGULA));
|
|
642
637
|
return parametros;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
this.consumir(eguap_1.default.PARENTESE_ESQUERDO,
|
|
646
|
-
|
|
638
|
+
}
|
|
639
|
+
corpoDaFuncao(tipo) {
|
|
640
|
+
this.consumir(eguap_1.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
|
|
641
|
+
let parametros = [];
|
|
647
642
|
if (!this.verificarTipoSimboloAtual(eguap_1.default.PARENTESE_DIREITO)) {
|
|
648
643
|
parametros = this.logicaComumParametros();
|
|
649
644
|
}
|
|
650
645
|
this.consumir(eguap_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
651
|
-
this.consumir(eguap_1.default.DOIS_PONTOS,
|
|
652
|
-
|
|
646
|
+
this.consumir(eguap_1.default.DOIS_PONTOS, `Esperado ':' antes do escopo do ${tipo}.`);
|
|
647
|
+
const corpo = this.blocoEscopo();
|
|
653
648
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, 0, parametros, corpo);
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
649
|
+
}
|
|
650
|
+
declaracaoDeClasse() {
|
|
651
|
+
const simbolo = this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
652
|
+
let superClasse = null;
|
|
658
653
|
if (this.verificarSeSimboloAtualEIgualA(eguap_1.default.HERDA)) {
|
|
659
654
|
this.consumir(eguap_1.default.IDENTIFICADOR, 'Esperado nome da SuperClasse.');
|
|
660
655
|
superClasse = new construtos_1.Variavel(this.hashArquivo, this.simboloAnterior());
|
|
661
656
|
}
|
|
662
657
|
this.consumir(eguap_1.default.DOIS_PONTOS, "Esperado ':' antes do escopo da classe.");
|
|
663
|
-
|
|
658
|
+
const metodos = [];
|
|
664
659
|
while (!this.verificarTipoSimboloAtual(eguap_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
665
660
|
metodos.push(this.funcao('método'));
|
|
666
661
|
}
|
|
667
662
|
return new declaracoes_1.Classe(simbolo, superClasse, metodos);
|
|
668
|
-
}
|
|
663
|
+
}
|
|
669
664
|
/**
|
|
670
665
|
* Consome o símbolo atual, verificando se é uma declaração de função, variável, classe
|
|
671
666
|
* ou uma expressão.
|
|
672
667
|
* @returns Objeto do tipo `Declaracao`.
|
|
673
668
|
*/
|
|
674
|
-
|
|
669
|
+
declaracao() {
|
|
675
670
|
try {
|
|
676
671
|
if ((this.verificarTipoSimboloAtual(eguap_1.default.FUNCAO) ||
|
|
677
672
|
this.verificarTipoSimboloAtual(eguap_1.default.FUNÇÃO)) &&
|
|
@@ -689,9 +684,9 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
689
684
|
this.sincronizar();
|
|
690
685
|
return null;
|
|
691
686
|
}
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
|
|
687
|
+
}
|
|
688
|
+
analisar(retornoLexador, hashArquivo) {
|
|
689
|
+
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
695
690
|
this.erros = [];
|
|
696
691
|
this.atual = 0;
|
|
697
692
|
this.blocos = 0;
|
|
@@ -699,20 +694,19 @@ var AvaliadorSintaticoEguaP = /** @class */ (function () {
|
|
|
699
694
|
this.hashArquivo = hashArquivo || 0;
|
|
700
695
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
701
696
|
this.pragmas = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.pragmas) || {};
|
|
702
|
-
|
|
697
|
+
const declaracoes = [];
|
|
703
698
|
while (!this.estaNoFinal()) {
|
|
704
699
|
declaracoes.push(this.declaracao());
|
|
705
700
|
}
|
|
706
701
|
if (this.performance) {
|
|
707
|
-
|
|
708
|
-
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`);
|
|
709
704
|
}
|
|
710
705
|
return {
|
|
711
706
|
declaracoes: declaracoes,
|
|
712
707
|
erros: this.erros,
|
|
713
708
|
};
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
}());
|
|
709
|
+
}
|
|
710
|
+
}
|
|
717
711
|
exports.AvaliadorSintaticoEguaP = AvaliadorSintaticoEguaP;
|
|
718
712
|
//# sourceMappingURL=avaliador-sintatico-eguap.js.map
|