@designliquido/delegua 0.9.3 → 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.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 +116 -199
- 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 +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.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,86 +4,81 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AvaliadorSintatico = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
|
|
8
|
+
const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime"));
|
|
9
|
+
const construtos_1 = require("../construtos");
|
|
10
|
+
const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
|
|
11
|
+
const declaracoes_1 = require("../declaracoes");
|
|
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.
|
|
15
15
|
* Há dois grupos de estruturas de alto nível: Construtos e Declarações.
|
|
16
16
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (performance === void 0) { performance = false; }
|
|
17
|
+
class AvaliadorSintatico {
|
|
18
|
+
constructor(performance = false) {
|
|
20
19
|
this.hashArquivo = 0;
|
|
21
20
|
this.atual = 0;
|
|
22
21
|
this.blocos = 0;
|
|
23
22
|
this.erros = [];
|
|
24
23
|
this.performance = performance;
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
erro(simbolo, mensagemDeErro) {
|
|
26
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
|
|
28
27
|
this.erros.push(excecao);
|
|
29
28
|
return excecao;
|
|
30
|
-
}
|
|
31
|
-
|
|
29
|
+
}
|
|
30
|
+
consumir(tipo, mensagemDeErro) {
|
|
32
31
|
if (this.verificarTipoSimboloAtual(tipo))
|
|
33
32
|
return this.avancarEDevolverAnterior();
|
|
34
33
|
throw this.erro(this.simbolos[this.atual], mensagemDeErro);
|
|
35
|
-
}
|
|
36
|
-
|
|
34
|
+
}
|
|
35
|
+
verificarTipoSimboloAtual(tipo) {
|
|
37
36
|
if (this.estaNoFinal())
|
|
38
37
|
return false;
|
|
39
38
|
return this.simbolos[this.atual].tipo === tipo;
|
|
40
|
-
}
|
|
41
|
-
|
|
39
|
+
}
|
|
40
|
+
verificarTipoProximoSimbolo(tipo) {
|
|
42
41
|
return this.simbolos[this.atual + 1].tipo === tipo;
|
|
43
|
-
}
|
|
44
|
-
|
|
42
|
+
}
|
|
43
|
+
simboloAtual() {
|
|
45
44
|
return this.simbolos[this.atual];
|
|
46
|
-
}
|
|
47
|
-
|
|
45
|
+
}
|
|
46
|
+
simboloAnterior() {
|
|
48
47
|
return this.simbolos[this.atual - 1];
|
|
49
|
-
}
|
|
50
|
-
|
|
48
|
+
}
|
|
49
|
+
estaNoFinal() {
|
|
51
50
|
return this.atual === this.simbolos.length;
|
|
52
|
-
}
|
|
53
|
-
|
|
51
|
+
}
|
|
52
|
+
avancarEDevolverAnterior() {
|
|
54
53
|
if (!this.estaNoFinal())
|
|
55
54
|
this.atual += 1;
|
|
56
55
|
return this.simbolos[this.atual - 1];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
argumentos[_i] = arguments[_i];
|
|
62
|
-
}
|
|
63
|
-
for (var i = 0; i < argumentos.length; i++) {
|
|
64
|
-
var tipoAtual = argumentos[i];
|
|
56
|
+
}
|
|
57
|
+
verificarSeSimboloAtualEIgualA(...argumentos) {
|
|
58
|
+
for (let i = 0; i < argumentos.length; i++) {
|
|
59
|
+
const tipoAtual = argumentos[i];
|
|
65
60
|
if (this.verificarTipoSimboloAtual(tipoAtual)) {
|
|
66
61
|
this.avancarEDevolverAnterior();
|
|
67
62
|
return true;
|
|
68
63
|
}
|
|
69
64
|
}
|
|
70
65
|
return false;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
}
|
|
67
|
+
primario() {
|
|
68
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
74
69
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SUPER)) {
|
|
75
|
-
|
|
70
|
+
const simboloChave = this.simbolos[this.atual - 1];
|
|
76
71
|
this.consumir(delegua_1.default.PONTO, "Esperado '.' após 'super'.");
|
|
77
|
-
|
|
72
|
+
const metodo = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome do método da SuperClasse.');
|
|
78
73
|
return new construtos_1.Super(this.hashArquivo, simboloChave, metodo);
|
|
79
74
|
}
|
|
80
75
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_ESQUERDO)) {
|
|
81
|
-
|
|
76
|
+
const valores = [];
|
|
82
77
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_DIREITO)) {
|
|
83
78
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
|
|
84
79
|
}
|
|
85
80
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_DIREITO)) {
|
|
86
|
-
|
|
81
|
+
const valor = this.atribuir();
|
|
87
82
|
valores.push(valor);
|
|
88
83
|
if (this.simbolos[this.atual].tipo !== delegua_1.default.COLCHETE_DIREITO) {
|
|
89
84
|
this.consumir(delegua_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
@@ -92,15 +87,15 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
92
87
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
|
|
93
88
|
}
|
|
94
89
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_ESQUERDA)) {
|
|
95
|
-
|
|
96
|
-
|
|
90
|
+
const chaves = [];
|
|
91
|
+
const valores = [];
|
|
97
92
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
|
|
98
93
|
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
|
|
99
94
|
}
|
|
100
95
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA)) {
|
|
101
|
-
|
|
96
|
+
const chave = this.atribuir();
|
|
102
97
|
this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
103
|
-
|
|
98
|
+
const valor = this.atribuir();
|
|
104
99
|
chaves.push(chave);
|
|
105
100
|
valores.push(valor);
|
|
106
101
|
if (this.simbolos[this.atual].tipo !== delegua_1.default.CHAVE_DIREITA) {
|
|
@@ -120,23 +115,23 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
120
115
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.ISTO))
|
|
121
116
|
return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), this.simbolos[this.atual - 1]);
|
|
122
117
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.NUMERO, delegua_1.default.TEXTO)) {
|
|
123
|
-
|
|
118
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
124
119
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
125
120
|
}
|
|
126
121
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IDENTIFICADOR)) {
|
|
127
122
|
return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
|
|
128
123
|
}
|
|
129
124
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO)) {
|
|
130
|
-
|
|
125
|
+
const expressao = this.expressao();
|
|
131
126
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
132
127
|
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
133
128
|
}
|
|
134
129
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IMPORTAR))
|
|
135
130
|
return this.declaracaoImportar();
|
|
136
131
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
}
|
|
133
|
+
finalizarChamada(entidadeChamada) {
|
|
134
|
+
const argumentos = [];
|
|
140
135
|
if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
|
|
141
136
|
do {
|
|
142
137
|
if (argumentos.length >= 255) {
|
|
@@ -145,22 +140,22 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
145
140
|
argumentos.push(this.expressao());
|
|
146
141
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
|
|
147
142
|
}
|
|
148
|
-
|
|
143
|
+
const parenteseDireito = this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
149
144
|
return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
145
|
+
}
|
|
146
|
+
chamar() {
|
|
147
|
+
let expressao = this.primario();
|
|
153
148
|
while (true) {
|
|
154
149
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PARENTESE_ESQUERDO)) {
|
|
155
150
|
expressao = this.finalizarChamada(expressao);
|
|
156
151
|
}
|
|
157
152
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO)) {
|
|
158
|
-
|
|
153
|
+
const nome = this.consumir(delegua_1.default.IDENTIFICADOR, "Esperado nome do método após '.'.");
|
|
159
154
|
expressao = new construtos_1.AcessoMetodo(this.hashArquivo, expressao, nome);
|
|
160
155
|
}
|
|
161
156
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.COLCHETE_ESQUERDO)) {
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
const indice = this.expressao();
|
|
158
|
+
const simboloFechamento = this.consumir(delegua_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
164
159
|
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
165
160
|
}
|
|
166
161
|
else {
|
|
@@ -168,125 +163,125 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
168
163
|
}
|
|
169
164
|
}
|
|
170
165
|
return expressao;
|
|
171
|
-
}
|
|
172
|
-
|
|
166
|
+
}
|
|
167
|
+
unario() {
|
|
173
168
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.NEGACAO, delegua_1.default.SUBTRACAO, delegua_1.default.BIT_NOT)) {
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
const operador = this.simbolos[this.atual - 1];
|
|
170
|
+
const direito = this.unario();
|
|
176
171
|
return new construtos_1.Unario(this.hashArquivo, operador, direito);
|
|
177
172
|
}
|
|
178
173
|
return this.chamar();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
|
|
174
|
+
}
|
|
175
|
+
exponenciacao() {
|
|
176
|
+
let expressao = this.unario();
|
|
182
177
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EXPONENCIACAO)) {
|
|
183
|
-
|
|
184
|
-
|
|
178
|
+
const operador = this.simbolos[this.atual - 1];
|
|
179
|
+
const direito = this.unario();
|
|
185
180
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
186
181
|
}
|
|
187
182
|
return expressao;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
183
|
+
}
|
|
184
|
+
multiplicar() {
|
|
185
|
+
let expressao = this.exponenciacao();
|
|
191
186
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIVISAO, delegua_1.default.MULTIPLICACAO, delegua_1.default.MODULO, delegua_1.default.DIVISAO_IGUAL, delegua_1.default.MULTIPLICACAO_IGUAL, delegua_1.default.MODULO_IGUAL)) {
|
|
192
|
-
|
|
193
|
-
|
|
187
|
+
const operador = this.simbolos[this.atual - 1];
|
|
188
|
+
const direito = this.exponenciacao();
|
|
194
189
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
195
190
|
}
|
|
196
191
|
return expressao;
|
|
197
|
-
}
|
|
192
|
+
}
|
|
198
193
|
/**
|
|
199
194
|
* Se símbolo de operação é `+`, `-`, `+=` ou `-=`, monta objeto `Binario` para
|
|
200
195
|
* ser avaliado pelo Interpretador.
|
|
201
196
|
* @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
|
|
202
197
|
*/
|
|
203
|
-
|
|
204
|
-
|
|
198
|
+
adicaoOuSubtracao() {
|
|
199
|
+
let expressao = this.multiplicar();
|
|
205
200
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SUBTRACAO, delegua_1.default.ADICAO, delegua_1.default.MAIS_IGUAL, delegua_1.default.MENOS_IGUAL)) {
|
|
206
|
-
|
|
207
|
-
|
|
201
|
+
const operador = this.simbolos[this.atual - 1];
|
|
202
|
+
const direito = this.multiplicar();
|
|
208
203
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
209
204
|
}
|
|
210
205
|
return expressao;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
|
|
206
|
+
}
|
|
207
|
+
bitFill() {
|
|
208
|
+
let expressao = this.adicaoOuSubtracao();
|
|
214
209
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MENOR_MENOR, delegua_1.default.MAIOR_MAIOR)) {
|
|
215
|
-
|
|
216
|
-
|
|
210
|
+
const operador = this.simbolos[this.atual - 1];
|
|
211
|
+
const direito = this.adicaoOuSubtracao();
|
|
217
212
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
218
213
|
}
|
|
219
214
|
return expressao;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
215
|
+
}
|
|
216
|
+
bitE() {
|
|
217
|
+
let expressao = this.bitFill();
|
|
223
218
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.BIT_AND)) {
|
|
224
|
-
|
|
225
|
-
|
|
219
|
+
const operador = this.simbolos[this.atual - 1];
|
|
220
|
+
const direito = this.bitFill();
|
|
226
221
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
227
222
|
}
|
|
228
223
|
return expressao;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
224
|
+
}
|
|
225
|
+
bitOu() {
|
|
226
|
+
let expressao = this.bitE();
|
|
232
227
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.BIT_OR, delegua_1.default.BIT_XOR)) {
|
|
233
|
-
|
|
234
|
-
|
|
228
|
+
const operador = this.simbolos[this.atual - 1];
|
|
229
|
+
const direito = this.bitE();
|
|
235
230
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
236
231
|
}
|
|
237
232
|
return expressao;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
233
|
+
}
|
|
234
|
+
comparar() {
|
|
235
|
+
let expressao = this.bitOu();
|
|
241
236
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.MAIOR, delegua_1.default.MAIOR_IGUAL, delegua_1.default.MENOR, delegua_1.default.MENOR_IGUAL)) {
|
|
242
|
-
|
|
243
|
-
|
|
237
|
+
const operador = this.simbolos[this.atual - 1];
|
|
238
|
+
const direito = this.bitOu();
|
|
244
239
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
245
240
|
}
|
|
246
241
|
return expressao;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
242
|
+
}
|
|
243
|
+
comparacaoIgualdade() {
|
|
244
|
+
let expressao = this.comparar();
|
|
250
245
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.DIFERENTE, delegua_1.default.IGUAL_IGUAL)) {
|
|
251
|
-
|
|
252
|
-
|
|
246
|
+
const operador = this.simbolos[this.atual - 1];
|
|
247
|
+
const direito = this.comparar();
|
|
253
248
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
254
249
|
}
|
|
255
250
|
return expressao;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
|
|
251
|
+
}
|
|
252
|
+
em() {
|
|
253
|
+
let expressao = this.comparacaoIgualdade();
|
|
259
254
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.EM)) {
|
|
260
|
-
|
|
261
|
-
|
|
255
|
+
const operador = this.simbolos[this.atual - 1];
|
|
256
|
+
const direito = this.comparacaoIgualdade();
|
|
262
257
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
263
258
|
}
|
|
264
259
|
return expressao;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
260
|
+
}
|
|
261
|
+
e() {
|
|
262
|
+
let expressao = this.em();
|
|
268
263
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.E)) {
|
|
269
|
-
|
|
270
|
-
|
|
264
|
+
const operador = this.simbolos[this.atual - 1];
|
|
265
|
+
const direito = this.em();
|
|
271
266
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
272
267
|
}
|
|
273
268
|
return expressao;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
269
|
+
}
|
|
270
|
+
ou() {
|
|
271
|
+
let expressao = this.e();
|
|
277
272
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.OU)) {
|
|
278
|
-
|
|
279
|
-
|
|
273
|
+
const operador = this.simbolos[this.atual - 1];
|
|
274
|
+
const direito = this.e();
|
|
280
275
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
281
276
|
}
|
|
282
277
|
return expressao;
|
|
283
|
-
}
|
|
278
|
+
}
|
|
284
279
|
/**
|
|
285
280
|
* Método que resolve atribuições.
|
|
286
281
|
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoSobrescrita`.
|
|
287
282
|
*/
|
|
288
|
-
|
|
289
|
-
|
|
283
|
+
atribuir() {
|
|
284
|
+
const expressao = this.ou();
|
|
290
285
|
if (expressao instanceof construtos_1.Binario &&
|
|
291
286
|
[
|
|
292
287
|
delegua_1.default.MAIS_IGUAL,
|
|
@@ -298,14 +293,14 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
298
293
|
return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda.simbolo, expressao);
|
|
299
294
|
}
|
|
300
295
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IGUAL)) {
|
|
301
|
-
|
|
302
|
-
|
|
296
|
+
const igual = this.simbolos[this.atual - 1];
|
|
297
|
+
const valor = this.atribuir();
|
|
303
298
|
if (expressao instanceof construtos_1.Variavel) {
|
|
304
|
-
|
|
299
|
+
const simbolo = expressao.simbolo;
|
|
305
300
|
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
306
301
|
}
|
|
307
302
|
else if (expressao instanceof construtos_1.AcessoMetodo) {
|
|
308
|
-
|
|
303
|
+
const get = expressao;
|
|
309
304
|
// return new Conjunto(this.hashArquivo, 0, get.objeto, get.simbolo, valor);
|
|
310
305
|
return new construtos_1.DefinirValor(this.hashArquivo, 0, get.objeto, get.simbolo, valor);
|
|
311
306
|
}
|
|
@@ -315,85 +310,85 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
315
310
|
this.erro(igual, 'Tarefa de atribuição inválida');
|
|
316
311
|
}
|
|
317
312
|
return expressao;
|
|
318
|
-
}
|
|
319
|
-
|
|
313
|
+
}
|
|
314
|
+
expressao() {
|
|
320
315
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.LEIA))
|
|
321
316
|
return this.declaracaoLeia();
|
|
322
317
|
return this.atribuir();
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
318
|
+
}
|
|
319
|
+
declaracaoEscreva() {
|
|
320
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
326
321
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
327
|
-
|
|
322
|
+
const argumentos = [];
|
|
328
323
|
do {
|
|
329
324
|
argumentos.push(this.expressao());
|
|
330
325
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
|
|
331
326
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
332
327
|
return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
|
|
328
|
+
}
|
|
329
|
+
declaracaoExpressao() {
|
|
330
|
+
const expressao = this.expressao();
|
|
336
331
|
return new declaracoes_1.Expressao(expressao);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
|
|
332
|
+
}
|
|
333
|
+
declaracaoLeia() {
|
|
334
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
340
335
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em leia.");
|
|
341
|
-
|
|
336
|
+
const argumentos = [];
|
|
342
337
|
do {
|
|
343
338
|
argumentos.push(this.expressao());
|
|
344
339
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
|
|
345
340
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em leia.");
|
|
346
341
|
return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
342
|
+
}
|
|
343
|
+
blocoEscopo() {
|
|
344
|
+
const declaracoes = [];
|
|
350
345
|
while (!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
351
346
|
declaracoes.push(this.declaracao());
|
|
352
347
|
}
|
|
353
348
|
this.consumir(delegua_1.default.CHAVE_DIREITA, "Esperado '}' após o bloco.");
|
|
354
349
|
return declaracoes;
|
|
355
|
-
}
|
|
356
|
-
|
|
350
|
+
}
|
|
351
|
+
declaracaoSe() {
|
|
357
352
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'se'.");
|
|
358
|
-
|
|
353
|
+
const condicao = this.expressao();
|
|
359
354
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após condição do se.");
|
|
360
|
-
|
|
361
|
-
|
|
355
|
+
const caminhoEntao = this.resolverDeclaracao();
|
|
356
|
+
const caminhosSeSenao = [];
|
|
362
357
|
while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SENAOSE, delegua_1.default.SENÃOSE)) {
|
|
363
358
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'senaose' ou 'senãose'.");
|
|
364
|
-
|
|
359
|
+
const condicaoSeSenao = this.expressao();
|
|
365
360
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após codição do 'senaose' ou 'senãose'.");
|
|
366
|
-
|
|
361
|
+
const caminho = this.resolverDeclaracao();
|
|
367
362
|
caminhosSeSenao.push({
|
|
368
363
|
condicao: condicaoSeSenao,
|
|
369
364
|
caminho: caminho,
|
|
370
365
|
});
|
|
371
366
|
}
|
|
372
|
-
|
|
367
|
+
let caminhoSenao = null;
|
|
373
368
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SENAO, delegua_1.default.SENÃO)) {
|
|
374
369
|
caminhoSenao = this.resolverDeclaracao();
|
|
375
370
|
}
|
|
376
371
|
return new declaracoes_1.Se(condicao, caminhoEntao, caminhosSeSenao, caminhoSenao);
|
|
377
|
-
}
|
|
378
|
-
|
|
372
|
+
}
|
|
373
|
+
declaracaoEnquanto() {
|
|
379
374
|
try {
|
|
380
375
|
this.blocos += 1;
|
|
381
376
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'enquanto'.");
|
|
382
|
-
|
|
377
|
+
const condicao = this.expressao();
|
|
383
378
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após condicional.");
|
|
384
|
-
|
|
379
|
+
const corpo = this.resolverDeclaracao();
|
|
385
380
|
return new declaracoes_1.Enquanto(condicao, corpo);
|
|
386
381
|
}
|
|
387
382
|
finally {
|
|
388
383
|
this.blocos -= 1;
|
|
389
384
|
}
|
|
390
|
-
}
|
|
391
|
-
|
|
385
|
+
}
|
|
386
|
+
declaracaoPara() {
|
|
392
387
|
try {
|
|
393
|
-
|
|
388
|
+
const simboloPara = this.simbolos[this.atual - 1];
|
|
394
389
|
this.blocos += 1;
|
|
395
390
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após 'para'.");
|
|
396
|
-
|
|
391
|
+
let inicializador;
|
|
397
392
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PONTO_E_VIRGULA)) {
|
|
398
393
|
inicializador = null;
|
|
399
394
|
}
|
|
@@ -403,61 +398,61 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
403
398
|
else {
|
|
404
399
|
inicializador = this.declaracaoExpressao();
|
|
405
400
|
}
|
|
406
|
-
|
|
401
|
+
let condicao = null;
|
|
407
402
|
if (!this.verificarTipoSimboloAtual(delegua_1.default.PONTO_E_VIRGULA)) {
|
|
408
403
|
condicao = this.expressao();
|
|
409
404
|
}
|
|
410
|
-
|
|
405
|
+
let incrementar = null;
|
|
411
406
|
if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
|
|
412
407
|
incrementar = this.expressao();
|
|
413
408
|
}
|
|
414
409
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas");
|
|
415
|
-
|
|
410
|
+
const corpo = this.resolverDeclaracao();
|
|
416
411
|
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
417
412
|
}
|
|
418
413
|
finally {
|
|
419
414
|
this.blocos -= 1;
|
|
420
415
|
}
|
|
421
|
-
}
|
|
422
|
-
|
|
416
|
+
}
|
|
417
|
+
declaracaoSustar() {
|
|
423
418
|
if (this.blocos < 1) {
|
|
424
419
|
this.erro(this.simbolos[this.atual - 1], "'sustar' ou 'pausa' deve estar dentro de um laço de repetição.");
|
|
425
420
|
}
|
|
426
421
|
return new declaracoes_1.Sustar(this.simbolos[this.atual]);
|
|
427
|
-
}
|
|
428
|
-
|
|
422
|
+
}
|
|
423
|
+
declaracaoContinua() {
|
|
429
424
|
if (this.blocos < 1) {
|
|
430
425
|
this.erro(this.simbolos[this.atual - 1], "'continua' precisa estar em um laço de repetição.");
|
|
431
426
|
}
|
|
432
427
|
return new declaracoes_1.Continua(this.simbolos[this.atual]);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
428
|
+
}
|
|
429
|
+
declaracaoRetorna() {
|
|
430
|
+
const simboloChave = this.simbolos[this.atual - 1];
|
|
431
|
+
let valor = null;
|
|
437
432
|
if (!this.verificarTipoSimboloAtual(delegua_1.default.PONTO_E_VIRGULA)) {
|
|
438
433
|
valor = this.expressao();
|
|
439
434
|
}
|
|
440
435
|
return new declaracoes_1.Retorna(simboloChave, valor);
|
|
441
|
-
}
|
|
442
|
-
|
|
436
|
+
}
|
|
437
|
+
declaracaoEscolha() {
|
|
443
438
|
try {
|
|
444
439
|
this.blocos += 1;
|
|
445
440
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '{' após 'escolha'.");
|
|
446
|
-
|
|
441
|
+
const condicao = this.expressao();
|
|
447
442
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado '}' após a condição de 'escolha'.");
|
|
448
443
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
|
|
449
|
-
|
|
450
|
-
|
|
444
|
+
const caminhos = [];
|
|
445
|
+
let caminhoPadrao = null;
|
|
451
446
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
452
447
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CASO)) {
|
|
453
|
-
|
|
448
|
+
const caminhoCondicoes = [this.expressao()];
|
|
454
449
|
this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
455
450
|
while (this.verificarTipoSimboloAtual(delegua_1.default.CASO)) {
|
|
456
451
|
this.consumir(delegua_1.default.CASO, null);
|
|
457
452
|
caminhoCondicoes.push(this.expressao());
|
|
458
453
|
this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
|
|
459
454
|
}
|
|
460
|
-
|
|
455
|
+
const declaracoes = [];
|
|
461
456
|
do {
|
|
462
457
|
declaracoes.push(this.resolverDeclaracao());
|
|
463
458
|
} while (!this.verificarTipoSimboloAtual(delegua_1.default.CASO) &&
|
|
@@ -465,24 +460,24 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
465
460
|
!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA));
|
|
466
461
|
caminhos.push({
|
|
467
462
|
condicoes: caminhoCondicoes,
|
|
468
|
-
declaracoes
|
|
463
|
+
declaracoes,
|
|
469
464
|
});
|
|
470
465
|
}
|
|
471
466
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PADRAO)) {
|
|
472
467
|
if (caminhoPadrao !== null) {
|
|
473
|
-
|
|
468
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
|
|
474
469
|
this.erros.push(excecao);
|
|
475
470
|
throw excecao;
|
|
476
471
|
}
|
|
477
472
|
this.consumir(delegua_1.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
|
|
478
|
-
|
|
473
|
+
const declaracoes = [];
|
|
479
474
|
do {
|
|
480
475
|
declaracoes.push(this.resolverDeclaracao());
|
|
481
476
|
} while (!this.verificarTipoSimboloAtual(delegua_1.default.CASO) &&
|
|
482
477
|
!this.verificarTipoSimboloAtual(delegua_1.default.PADRAO) &&
|
|
483
478
|
!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA));
|
|
484
479
|
caminhoPadrao = {
|
|
485
|
-
declaracoes
|
|
480
|
+
declaracoes,
|
|
486
481
|
};
|
|
487
482
|
}
|
|
488
483
|
}
|
|
@@ -491,50 +486,50 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
491
486
|
finally {
|
|
492
487
|
this.blocos -= 1;
|
|
493
488
|
}
|
|
494
|
-
}
|
|
495
|
-
|
|
489
|
+
}
|
|
490
|
+
declaracaoImportar() {
|
|
496
491
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
|
|
497
|
-
|
|
498
|
-
|
|
492
|
+
const caminho = this.expressao();
|
|
493
|
+
const simboloFechamento = this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
|
|
499
494
|
return new declaracoes_1.Importar(caminho, simboloFechamento);
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
|
|
495
|
+
}
|
|
496
|
+
declaracaoTente() {
|
|
497
|
+
const simboloTente = this.simbolos[this.atual - 1];
|
|
503
498
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
|
|
504
|
-
|
|
505
|
-
|
|
499
|
+
const blocoTente = this.blocoEscopo();
|
|
500
|
+
let blocoPegue = null;
|
|
506
501
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.PEGUE)) {
|
|
507
502
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
|
|
508
503
|
blocoPegue = this.blocoEscopo();
|
|
509
504
|
}
|
|
510
|
-
|
|
505
|
+
let blocoSenao = null;
|
|
511
506
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.SENAO, delegua_1.default.SENÃO)) {
|
|
512
507
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
|
|
513
508
|
blocoSenao = this.blocoEscopo();
|
|
514
509
|
}
|
|
515
|
-
|
|
510
|
+
let blocoFinalmente = null;
|
|
516
511
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.FINALMENTE)) {
|
|
517
512
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
|
|
518
513
|
blocoFinalmente = this.blocoEscopo();
|
|
519
514
|
}
|
|
520
515
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
|
|
516
|
+
}
|
|
517
|
+
declaracaoFazer() {
|
|
518
|
+
const simboloFazer = this.simbolos[this.atual - 1];
|
|
524
519
|
try {
|
|
525
520
|
this.blocos += 1;
|
|
526
|
-
|
|
521
|
+
const caminhoFazer = this.resolverDeclaracao();
|
|
527
522
|
this.consumir(delegua_1.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
|
|
528
523
|
this.consumir(delegua_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração 'enquanto'.");
|
|
529
|
-
|
|
524
|
+
const condicaoEnquanto = this.expressao();
|
|
530
525
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração do 'enquanto'.");
|
|
531
526
|
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
|
|
532
527
|
}
|
|
533
528
|
finally {
|
|
534
529
|
this.blocos -= 1;
|
|
535
530
|
}
|
|
536
|
-
}
|
|
537
|
-
|
|
531
|
+
}
|
|
532
|
+
resolverDeclaracao() {
|
|
538
533
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.FAZER))
|
|
539
534
|
return this.declaracaoFazer();
|
|
540
535
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.TENTE))
|
|
@@ -556,15 +551,15 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
556
551
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.ESCREVA))
|
|
557
552
|
return this.declaracaoEscreva();
|
|
558
553
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.CHAVE_ESQUERDA)) {
|
|
559
|
-
|
|
554
|
+
const simboloInicioBloco = this.simbolos[this.atual - 1];
|
|
560
555
|
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
|
|
561
556
|
}
|
|
562
|
-
|
|
557
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
563
558
|
if (simboloAtual.tipo === delegua_1.default.IDENTIFICADOR) {
|
|
564
559
|
// Pela gramática, a seguinte situação não pode ocorrer:
|
|
565
560
|
// 1. O símbolo anterior ser um identificador; e
|
|
566
561
|
// 2. O símbolo anterior estar na mesma linha do identificador atual.
|
|
567
|
-
|
|
562
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
568
563
|
if (!!simboloAnterior &&
|
|
569
564
|
simboloAnterior.tipo === delegua_1.default.IDENTIFICADOR &&
|
|
570
565
|
simboloAnterior.linha === simboloAtual.linha) {
|
|
@@ -572,30 +567,30 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
572
567
|
}
|
|
573
568
|
}
|
|
574
569
|
return this.declaracaoExpressao();
|
|
575
|
-
}
|
|
570
|
+
}
|
|
576
571
|
/**
|
|
577
572
|
* Caso símbolo atual seja `var`, devolve uma declaração de variável.
|
|
578
573
|
* @returns Um Construto do tipo Var.
|
|
579
574
|
*/
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
575
|
+
declaracaoDeVariavel() {
|
|
576
|
+
const simbolo = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome de variável.');
|
|
577
|
+
let inicializador = null;
|
|
583
578
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.IGUAL)) {
|
|
584
579
|
inicializador = this.expressao();
|
|
585
580
|
}
|
|
586
581
|
return new declaracoes_1.Var(simbolo, inicializador);
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
|
|
582
|
+
}
|
|
583
|
+
funcao(tipo) {
|
|
584
|
+
const simbolo = this.consumir(delegua_1.default.IDENTIFICADOR, `Esperado nome ${tipo}.`);
|
|
590
585
|
return new declaracoes_1.FuncaoDeclaracao(simbolo, this.corpoDaFuncao(tipo));
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
|
|
586
|
+
}
|
|
587
|
+
logicaComumParametros() {
|
|
588
|
+
const parametros = [];
|
|
594
589
|
do {
|
|
595
590
|
if (parametros.length >= 255) {
|
|
596
591
|
this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 parâmetros');
|
|
597
592
|
}
|
|
598
|
-
|
|
593
|
+
const parametro = {};
|
|
599
594
|
if (this.simbolos[this.atual].tipo === delegua_1.default.MULTIPLICACAO) {
|
|
600
595
|
this.consumir(delegua_1.default.MULTIPLICACAO, null);
|
|
601
596
|
parametro.tipo = 'estrela';
|
|
@@ -612,36 +607,36 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
612
607
|
break;
|
|
613
608
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_1.default.VIRGULA));
|
|
614
609
|
return parametros;
|
|
615
|
-
}
|
|
616
|
-
|
|
610
|
+
}
|
|
611
|
+
corpoDaFuncao(tipo) {
|
|
617
612
|
// O parêntese esquerdo é considerado o símbolo inicial para
|
|
618
613
|
// fins de pragma.
|
|
619
|
-
|
|
620
|
-
|
|
614
|
+
const parenteseEsquerdo = this.consumir(delegua_1.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
|
|
615
|
+
let parametros = [];
|
|
621
616
|
if (!this.verificarTipoSimboloAtual(delegua_1.default.PARENTESE_DIREITO)) {
|
|
622
617
|
parametros = this.logicaComumParametros();
|
|
623
618
|
}
|
|
624
619
|
this.consumir(delegua_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
625
|
-
this.consumir(delegua_1.default.CHAVE_ESQUERDA,
|
|
626
|
-
|
|
620
|
+
this.consumir(delegua_1.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
|
|
621
|
+
const corpo = this.blocoEscopo();
|
|
627
622
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
623
|
+
}
|
|
624
|
+
declaracaoDeClasse() {
|
|
625
|
+
const simbolo = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
626
|
+
let superClasse = null;
|
|
632
627
|
if (this.verificarSeSimboloAtualEIgualA(delegua_1.default.HERDA)) {
|
|
633
628
|
this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome da SuperClasse.');
|
|
634
629
|
superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
|
|
635
630
|
}
|
|
636
631
|
this.consumir(delegua_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
|
|
637
|
-
|
|
632
|
+
const metodos = [];
|
|
638
633
|
while (!this.verificarTipoSimboloAtual(delegua_1.default.CHAVE_DIREITA) && !this.estaNoFinal()) {
|
|
639
634
|
metodos.push(this.funcao('método'));
|
|
640
635
|
}
|
|
641
636
|
this.consumir(delegua_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
|
|
642
637
|
return new declaracoes_1.Classe(simbolo, superClasse, metodos);
|
|
643
|
-
}
|
|
644
|
-
|
|
638
|
+
}
|
|
639
|
+
declaracao() {
|
|
645
640
|
try {
|
|
646
641
|
if ((this.verificarTipoSimboloAtual(delegua_1.default.FUNCAO) ||
|
|
647
642
|
this.verificarTipoSimboloAtual(delegua_1.default.FUNÇÃO)) &&
|
|
@@ -659,16 +654,16 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
659
654
|
this.sincronizar();
|
|
660
655
|
return null;
|
|
661
656
|
}
|
|
662
|
-
}
|
|
657
|
+
}
|
|
663
658
|
/**
|
|
664
659
|
* Usado quando há erros na avaliação sintática.
|
|
665
660
|
* Garante que o código não entre em loop infinito.
|
|
666
661
|
* @returns Sempre retorna `void`.
|
|
667
662
|
*/
|
|
668
|
-
|
|
663
|
+
sincronizar() {
|
|
669
664
|
this.avancarEDevolverAnterior();
|
|
670
665
|
while (!this.estaNoFinal()) {
|
|
671
|
-
|
|
666
|
+
const tipoSimboloAtual = this.simbolos[this.atual - 1].tipo;
|
|
672
667
|
if (tipoSimboloAtual === delegua_1.default.PONTO_E_VIRGULA)
|
|
673
668
|
return;
|
|
674
669
|
switch (tipoSimboloAtual) {
|
|
@@ -685,28 +680,27 @@ var AvaliadorSintatico = /** @class */ (function () {
|
|
|
685
680
|
}
|
|
686
681
|
this.avancarEDevolverAnterior();
|
|
687
682
|
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
|
|
683
|
+
}
|
|
684
|
+
analisar(retornoLexador, hashArquivo) {
|
|
685
|
+
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
691
686
|
this.erros = [];
|
|
692
687
|
this.atual = 0;
|
|
693
688
|
this.blocos = 0;
|
|
694
689
|
this.hashArquivo = hashArquivo || 0;
|
|
695
690
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
696
|
-
|
|
691
|
+
const declaracoes = [];
|
|
697
692
|
while (!this.estaNoFinal()) {
|
|
698
693
|
declaracoes.push(this.declaracao());
|
|
699
694
|
}
|
|
700
695
|
if (this.performance) {
|
|
701
|
-
|
|
702
|
-
console.log(
|
|
696
|
+
const deltaAnalise = (0, browser_process_hrtime_1.default)(inicioAnalise);
|
|
697
|
+
console.log(`[Avaliador Sintático] Tempo para análise: ${deltaAnalise[0] * 1e9 + deltaAnalise[1]}ns`);
|
|
703
698
|
}
|
|
704
699
|
return {
|
|
705
700
|
declaracoes: declaracoes,
|
|
706
701
|
erros: this.erros,
|
|
707
702
|
};
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
}());
|
|
703
|
+
}
|
|
704
|
+
}
|
|
711
705
|
exports.AvaliadorSintatico = AvaliadorSintatico;
|
|
712
706
|
//# sourceMappingURL=avaliador-sintatico.js.map
|