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