@designliquido/mapler 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/avaliador-sintatico/avaliador-sintatico-mapler.d.ts +12 -5
- package/avaliador-sintatico/avaliador-sintatico-mapler.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-mapler.js +195 -229
- package/avaliador-sintatico/avaliador-sintatico-mapler.js.map +1 -1
- package/declaracoes/declaracao-futura.d.ts +14 -0
- package/declaracoes/declaracao-futura.d.ts.map +1 -0
- package/declaracoes/declaracao-futura.js +22 -0
- package/declaracoes/declaracao-futura.js.map +1 -0
- package/declaracoes/index.d.ts +1 -0
- package/declaracoes/index.d.ts.map +1 -0
- package/declaracoes/index.js +1 -0
- package/declaracoes/index.js.map +1 -0
- package/lexador/lexador-mapler.d.ts +1 -0
- package/lexador/lexador-mapler.d.ts.map +1 -1
- package/lexador/lexador-mapler.js +11 -6
- package/lexador/lexador-mapler.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +2 -3
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js +2 -3
- package/lexador/palavras-reservadas.js.map +1 -1
- package/package.json +2 -2
- package/resolvedor/index.d.ts +2 -0
- package/resolvedor/index.d.ts.map +1 -0
- package/resolvedor/index.js +18 -0
- package/resolvedor/index.js.map +1 -0
- package/resolvedor/resolvedor-mapler.d.ts +83 -0
- package/resolvedor/resolvedor-mapler.d.ts.map +1 -0
- package/resolvedor/resolvedor-mapler.js +237 -0
- package/resolvedor/resolvedor-mapler.js.map +1 -0
- package/tipos-de-simbolos/lexico-regular.d.ts +1 -4
- package/tipos-de-simbolos/lexico-regular.d.ts.map +1 -1
- package/tipos-de-simbolos/lexico-regular.js +1 -4
- package/tipos-de-simbolos/lexico-regular.js.map +1 -1
|
@@ -7,8 +7,15 @@ exports.AvaliadorSintaticoMapler = void 0;
|
|
|
7
7
|
const avaliador_sintatico_base_1 = require("@designliquido/delegua/avaliador-sintatico/avaliador-sintatico-base");
|
|
8
8
|
const declaracoes_1 = require("@designliquido/delegua/declaracoes");
|
|
9
9
|
const construtos_1 = require("@designliquido/delegua/construtos");
|
|
10
|
-
const
|
|
10
|
+
const declaracao_futura_1 = require("../declaracoes/declaracao-futura");
|
|
11
|
+
const lexico_regular_1 = __importDefault(require("../tipos-de-simbolos/lexico-regular"));
|
|
12
|
+
const delegua_1 = require("@designliquido/delegua");
|
|
11
13
|
class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.lendoModulos = false;
|
|
17
|
+
this.modulos = [];
|
|
18
|
+
}
|
|
12
19
|
criarVetorNDimensional(dimensoes) {
|
|
13
20
|
if (dimensoes.length > 0) {
|
|
14
21
|
const dimensao = dimensoes[0] + 1;
|
|
@@ -26,21 +33,21 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
26
33
|
validarDimensoesVetor() {
|
|
27
34
|
let dimensoes = [];
|
|
28
35
|
do {
|
|
29
|
-
const numeroInicial = this.consumir(
|
|
30
|
-
this.consumir(
|
|
31
|
-
this.consumir(
|
|
32
|
-
const numeroFinal = this.consumir(
|
|
36
|
+
const numeroInicial = this.consumir(lexico_regular_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
|
|
37
|
+
this.consumir(lexico_regular_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
38
|
+
this.consumir(lexico_regular_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
39
|
+
const numeroFinal = this.consumir(lexico_regular_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
|
|
33
40
|
dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
|
|
34
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
41
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
35
42
|
return dimensoes;
|
|
36
43
|
}
|
|
37
44
|
logicaComumParametroMapler() {
|
|
38
45
|
const identificadores = [];
|
|
39
46
|
do {
|
|
40
|
-
identificadores.push(this.consumir(
|
|
41
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
42
|
-
this.consumir(
|
|
43
|
-
if (!this.verificarSeSimboloAtualEIgualA(
|
|
47
|
+
identificadores.push(this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
48
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
49
|
+
this.consumir(lexico_regular_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
|
|
50
|
+
if (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.CADEIA, lexico_regular_1.default.CARACTERE, lexico_regular_1.default.INTEIRO, lexico_regular_1.default.LOGICO, lexico_regular_1.default.MODULO, lexico_regular_1.default.REAL, lexico_regular_1.default.VETOR)) {
|
|
44
51
|
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido.');
|
|
45
52
|
}
|
|
46
53
|
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
@@ -57,46 +64,48 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
57
64
|
*/
|
|
58
65
|
validarSegmentoVariaveis() {
|
|
59
66
|
const inicializacoes = [];
|
|
60
|
-
while (!this.verificarTipoSimboloAtual(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
67
|
+
while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.INICIO)) {
|
|
68
|
+
if (this.simbolos[this.atual].tipo === lexico_regular_1.default.COMENTARIO) {
|
|
69
|
+
inicializacoes.push(this.declaracaoComentario());
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const dadosVariaveis = this.logicaComumParametroMapler();
|
|
73
|
+
// Se chegou até aqui, variáveis são válidas.
|
|
74
|
+
// Devem ser declaradas com um valor inicial padrão.
|
|
75
|
+
for (let identificador of dadosVariaveis.identificadores) {
|
|
76
|
+
switch (dadosVariaveis.tipo) {
|
|
77
|
+
case lexico_regular_1.default.CADEIA:
|
|
78
|
+
case lexico_regular_1.default.CARACTERE:
|
|
79
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), ''), 'texto'));
|
|
80
|
+
break;
|
|
81
|
+
case lexico_regular_1.default.INTEIRO:
|
|
82
|
+
case lexico_regular_1.default.REAL:
|
|
83
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0), 'numero'));
|
|
84
|
+
break;
|
|
85
|
+
case lexico_regular_1.default.LOGICO:
|
|
86
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false), 'lógico'));
|
|
87
|
+
break;
|
|
88
|
+
case lexico_regular_1.default.MODULO:
|
|
89
|
+
// Para efeitos práticos, declarar um módulo (função) como uma
|
|
90
|
+
// variável apenas serve para dizer ao interpretador que as
|
|
91
|
+
// declarações das funções propriamente ditas irão ao
|
|
92
|
+
// final do código.
|
|
93
|
+
this.modulos.push(identificador.lexema);
|
|
94
|
+
break;
|
|
95
|
+
case lexico_regular_1.default.VETOR:
|
|
96
|
+
// TODO: Validar vetor
|
|
97
|
+
this.consumir(lexico_regular_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
|
|
98
|
+
const dimensoes = this.validarDimensoesVetor();
|
|
99
|
+
this.consumir(lexico_regular_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
|
|
100
|
+
this.consumir(lexico_regular_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
|
|
101
|
+
if (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.CARACTERE, lexico_regular_1.default.INTEIRO, lexico_regular_1.default.LOGICO, lexico_regular_1.default.REAL, lexico_regular_1.default.VETOR)) {
|
|
102
|
+
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
|
|
95
103
|
}
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes)), 'vetor'));
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
98
107
|
}
|
|
99
|
-
this.consumir(
|
|
108
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, "Esperado ';' após declaração de variável.");
|
|
100
109
|
}
|
|
101
110
|
return inicializacoes;
|
|
102
111
|
}
|
|
@@ -105,31 +114,36 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
105
114
|
}
|
|
106
115
|
primario() {
|
|
107
116
|
const simboloAtual = this.simbolos[this.atual];
|
|
108
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
117
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.FALSO))
|
|
109
118
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
|
|
110
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
119
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VERDADEIRO))
|
|
111
120
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
|
|
112
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
113
|
-
|
|
121
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.IDENTIFICADOR)) {
|
|
122
|
+
const simboloIdentificador = this.simbolos[this.atual - 1];
|
|
123
|
+
if (this.modulos.includes(simboloIdentificador.lexema)) {
|
|
124
|
+
// TODO: Chamar função
|
|
125
|
+
return new declaracao_futura_1.DeclaracaoFutura(simboloIdentificador);
|
|
126
|
+
// return new Expressao(new Chamada(simboloAtual.hashArquivo, funcaoDeclaracao.funcao, null, []))
|
|
127
|
+
}
|
|
128
|
+
return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador);
|
|
114
129
|
}
|
|
115
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
130
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.NUMERO, lexico_regular_1.default.CADEIA, lexico_regular_1.default.CARACTERE)) {
|
|
116
131
|
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
117
132
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
118
133
|
}
|
|
119
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
134
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
|
|
120
135
|
const expressao = this.expressao();
|
|
121
|
-
this.consumir(
|
|
136
|
+
this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
122
137
|
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
123
138
|
}
|
|
124
|
-
|
|
125
|
-
if (this.verificarSeSimboloAtualEIgualA(mapler_1.default.PONTO_VIRGULA)) {
|
|
139
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PONTO_VIRGULA)) {
|
|
126
140
|
return null;
|
|
127
141
|
}
|
|
128
142
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
129
143
|
}
|
|
130
144
|
comparacaoIgualdade() {
|
|
131
145
|
let expressao = this.comparar();
|
|
132
|
-
while (this.verificarSeSimboloAtualEIgualA(
|
|
146
|
+
while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.DIFERENTE, lexico_regular_1.default.IGUAL)) {
|
|
133
147
|
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
134
148
|
const direito = this.comparar();
|
|
135
149
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, simboloAnterior, direito);
|
|
@@ -138,7 +152,7 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
138
152
|
}
|
|
139
153
|
ou() {
|
|
140
154
|
let expressao = this.e();
|
|
141
|
-
while (this.verificarSeSimboloAtualEIgualA(
|
|
155
|
+
while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.OU)) {
|
|
142
156
|
const operador = this.simbolos[this.atual - 1];
|
|
143
157
|
const direito = this.e();
|
|
144
158
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
@@ -151,7 +165,7 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
151
165
|
*/
|
|
152
166
|
atribuir() {
|
|
153
167
|
const expressao = this.ou();
|
|
154
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
168
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.SETA_ATRIBUICAO)) {
|
|
155
169
|
const setaAtribuicao = this.simbolos[this.atual - 1];
|
|
156
170
|
const valor = this.atribuir();
|
|
157
171
|
if (expressao instanceof construtos_1.Variavel) {
|
|
@@ -166,37 +180,30 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
166
180
|
return expressao;
|
|
167
181
|
}
|
|
168
182
|
expressao() {
|
|
169
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
183
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.LER))
|
|
170
184
|
return this.declaracaoLeia();
|
|
171
185
|
return this.atribuir();
|
|
172
186
|
}
|
|
173
187
|
blocoEscopo() {
|
|
174
188
|
const declaracoes = [];
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// ].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal())
|
|
179
|
-
// {
|
|
180
|
-
// declaracoes.push(this.declaracao());
|
|
181
|
-
// }
|
|
182
|
-
// Se chegou até aqui, simplesmente consome o símbolo.
|
|
183
|
-
this.avancarEDevolverAnterior();
|
|
184
|
-
// this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
|
|
189
|
+
while (this.simbolos[this.atual].tipo !== lexico_regular_1.default.FIM) {
|
|
190
|
+
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
191
|
+
}
|
|
185
192
|
return declaracoes;
|
|
186
193
|
}
|
|
187
194
|
chamar() {
|
|
188
195
|
let expressao = this.primario();
|
|
189
196
|
while (true) {
|
|
190
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
197
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
|
|
191
198
|
expressao = this.finalizarChamada(expressao);
|
|
192
199
|
}
|
|
193
|
-
else if (this.verificarSeSimboloAtualEIgualA(
|
|
200
|
+
else if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_ESQUERDO)) {
|
|
194
201
|
const indices = [];
|
|
195
202
|
do {
|
|
196
203
|
indices.push(this.expressao());
|
|
197
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
204
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
198
205
|
const indice = indices[0];
|
|
199
|
-
const simboloFechamento = this.consumir(
|
|
206
|
+
const simboloFechamento = this.consumir(lexico_regular_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
200
207
|
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
201
208
|
}
|
|
202
209
|
else {
|
|
@@ -207,24 +214,30 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
207
214
|
}
|
|
208
215
|
corpoDaFuncao(tipo) {
|
|
209
216
|
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
210
|
-
|
|
211
|
-
// this.
|
|
212
|
-
this.validarSegmentoVariaveis();
|
|
217
|
+
// TODO: Verificar como Mapler lida com varíaveis em módulos.
|
|
218
|
+
// this.validarSegmentoVariaveis();
|
|
213
219
|
const corpo = this.blocoEscopo();
|
|
214
|
-
|
|
220
|
+
this.consumir(lexico_regular_1.default.FIM, `Isso nunca dá erro.`);
|
|
221
|
+
this.consumir(tipo, `Esperado palavra reservada "${tipo.toLowerCase()}" após palavra reservada "fim" para finalização da declaração.`);
|
|
222
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, `Esperado ponto-e-vírgula após palavras reservadas "fim ${tipo.toLowerCase()}."`);
|
|
223
|
+
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), [], corpo);
|
|
224
|
+
}
|
|
225
|
+
declaracaoComentario() {
|
|
226
|
+
const simboloComentario = this.avancarEDevolverAnterior();
|
|
227
|
+
return new construtos_1.Comentario(simboloComentario.hashArquivo, simboloComentario.linha, simboloComentario.literal, false);
|
|
215
228
|
}
|
|
216
229
|
declaracaoEnquanto() {
|
|
217
230
|
const simboloAtual = this.avancarEDevolverAnterior();
|
|
218
231
|
const condicao = this.expressao();
|
|
219
|
-
this.consumir(
|
|
232
|
+
this.consumir(lexico_regular_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
|
|
220
233
|
const declaracoes = [];
|
|
221
234
|
do {
|
|
222
235
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
223
|
-
} while (![
|
|
224
|
-
![
|
|
225
|
-
this.consumir(
|
|
226
|
-
this.consumir(
|
|
227
|
-
this.consumir(
|
|
236
|
+
} while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
|
|
237
|
+
![lexico_regular_1.default.ENQUANTO].includes(this.simbolos[this.atual + 1].tipo));
|
|
238
|
+
this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para iniciar o fechamento de declaração 'enquanto'.");
|
|
239
|
+
this.consumir(lexico_regular_1.default.ENQUANTO, "Esperado palavra-chave 'enquanto' para o fechamento de declaração 'enquanto'.");
|
|
240
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, "Esperado palavra-chave ';' para o fechamento de declaração 'enquanto'.");
|
|
228
241
|
return new declaracoes_1.Enquanto(condicao, new declaracoes_1.Bloco(simboloAtual.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)));
|
|
229
242
|
}
|
|
230
243
|
declaracaoEscolha() {
|
|
@@ -236,8 +249,8 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
236
249
|
do {
|
|
237
250
|
const valor = this.resolverDeclaracaoForaDeBloco();
|
|
238
251
|
argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloAtual.linha), valor));
|
|
239
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
240
|
-
this.consumir(
|
|
252
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
253
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
|
|
241
254
|
return argumentos;
|
|
242
255
|
}
|
|
243
256
|
declaracaoEscreva() {
|
|
@@ -254,12 +267,11 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
254
267
|
*/
|
|
255
268
|
declaracaoFazer() {
|
|
256
269
|
const simboloAtual = this.avancarEDevolverAnterior();
|
|
257
|
-
// this.consumir(tiposDeSimbolos.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
|
|
258
270
|
const declaracoes = [];
|
|
259
271
|
do {
|
|
260
272
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
261
|
-
} while (![
|
|
262
|
-
this.consumir(
|
|
273
|
+
} while (![lexico_regular_1.default.ATE].includes(this.simbolos[this.atual].tipo));
|
|
274
|
+
this.consumir(lexico_regular_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
|
|
263
275
|
const condicao = this.expressao();
|
|
264
276
|
// this.consumir(
|
|
265
277
|
// tiposDeSimbolos.QUEBRA_LINHA,
|
|
@@ -286,173 +298,122 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
286
298
|
*/
|
|
287
299
|
declaracaoLeia() {
|
|
288
300
|
const simboloAtual = this.avancarEDevolverAnterior();
|
|
289
|
-
// this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
|
|
290
301
|
const argumentos = [];
|
|
291
302
|
do {
|
|
292
303
|
argumentos.push(this.resolverDeclaracaoForaDeBloco());
|
|
293
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
294
|
-
// this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
|
|
295
|
-
// this.consumir(
|
|
296
|
-
// tiposDeSimbolos.QUEBRA_LINHA,
|
|
297
|
-
// 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.'
|
|
298
|
-
// );
|
|
304
|
+
} while (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PONTO_VIRGULA));
|
|
299
305
|
return new declaracoes_1.Leia(simboloAtual, argumentos);
|
|
300
306
|
}
|
|
301
|
-
declaracaoPara() {
|
|
302
|
-
throw new Error('Método não implementado.');
|
|
303
|
-
// const simboloPara: SimboloInterface = this.avancarEDevolverAnterior();
|
|
304
|
-
// const variavelIteracao = this.consumir(
|
|
305
|
-
// tiposDeSimbolos.IDENTIFICADOR,
|
|
306
|
-
// "Esperado identificador de variável após 'para'."
|
|
307
|
-
// );
|
|
308
|
-
// this.consumir(tiposDeSimbolos.DE, "Esperado palavra reservada 'de' após variável de controle de 'para'.");
|
|
309
|
-
// const numeroInicio = this.consumir(
|
|
310
|
-
// tiposDeSimbolos.NUMERO,
|
|
311
|
-
// "Esperado literal ou variável após 'de' em declaração 'para'."
|
|
312
|
-
// );
|
|
313
|
-
// this.consumir(
|
|
314
|
-
// tiposDeSimbolos.ATE,
|
|
315
|
-
// "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'."
|
|
316
|
-
// );
|
|
317
|
-
// const numeroFim = this.consumir(
|
|
318
|
-
// tiposDeSimbolos.NUMERO,
|
|
319
|
-
// "Esperado literal ou variável após 'de' em declaração 'para'."
|
|
320
|
-
// );
|
|
321
|
-
// this.consumir(
|
|
322
|
-
// tiposDeSimbolos.FACA,
|
|
323
|
-
// "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'."
|
|
324
|
-
// );
|
|
325
|
-
// this.consumir(
|
|
326
|
-
// tiposDeSimbolos.QUEBRA_LINHA,
|
|
327
|
-
// "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'."
|
|
328
|
-
// );
|
|
329
|
-
// const declaracoesBlocoPara = [];
|
|
330
|
-
// let simboloAtualBlocoPara: SimboloInterface = this.simbolos[this.atual];
|
|
331
|
-
// while (simboloAtualBlocoPara.tipo !== tiposDeSimbolos.FIM_PARA) {
|
|
332
|
-
// declaracoesBlocoPara.push(this.declaracao());
|
|
333
|
-
// simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
334
|
-
// }
|
|
335
|
-
// this.consumir(tiposDeSimbolos.FIM_PARA, '');
|
|
336
|
-
// this.consumir(tiposDeSimbolos.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
|
|
337
|
-
// const corpo = new Bloco(
|
|
338
|
-
// this.hashArquivo,
|
|
339
|
-
// Number(simboloPara.linha) + 1,
|
|
340
|
-
// declaracoesBlocoPara.filter((d) => d)
|
|
341
|
-
// );
|
|
342
|
-
// return new Para(
|
|
343
|
-
// this.hashArquivo,
|
|
344
|
-
// Number(simboloPara.linha),
|
|
345
|
-
// new Atribuir(
|
|
346
|
-
// this.hashArquivo,
|
|
347
|
-
// variavelIteracao,
|
|
348
|
-
// new Literal(this.hashArquivo, Number(simboloPara.linha), numeroInicio.literal)
|
|
349
|
-
// ),
|
|
350
|
-
// new Binario(
|
|
351
|
-
// this.hashArquivo,
|
|
352
|
-
// new Variavel(this.hashArquivo, variavelIteracao),
|
|
353
|
-
// new Simbolo(tiposDeSimbolos.MENOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo),
|
|
354
|
-
// new Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)
|
|
355
|
-
// ),
|
|
356
|
-
// new Atribuir(
|
|
357
|
-
// this.hashArquivo,
|
|
358
|
-
// variavelIteracao,
|
|
359
|
-
// new Binario(
|
|
360
|
-
// this.hashArquivo,
|
|
361
|
-
// new Variavel(this.hashArquivo, variavelIteracao),
|
|
362
|
-
// new Simbolo(tiposDeSimbolos.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo),
|
|
363
|
-
// new Literal(this.hashArquivo, Number(simboloPara.linha), 1)
|
|
364
|
-
// )
|
|
365
|
-
// ),
|
|
366
|
-
// corpo
|
|
367
|
-
// );
|
|
368
|
-
}
|
|
369
|
-
// logicaComumParametros(): ParametroInterface[] {
|
|
370
|
-
// const parametros: ParametroInterface[] = [];
|
|
371
|
-
// if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PARENTESE_ESQUERDO)) {
|
|
372
|
-
// while (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
|
|
373
|
-
// const dadosParametros = this.logicaComumParametroMapler();
|
|
374
|
-
// for (let parametro of dadosParametros.identificadores) {
|
|
375
|
-
// parametros.push({
|
|
376
|
-
// abrangencia: 'padrao',
|
|
377
|
-
// nome: parametro
|
|
378
|
-
// });
|
|
379
|
-
// }
|
|
380
|
-
// }
|
|
381
|
-
// // Consumir parêntese direito
|
|
382
|
-
// this.consumir(
|
|
383
|
-
// tiposDeSimbolos.PARENTESE_DIREITO,
|
|
384
|
-
// "Esperado parêntese direito para finalização da leitura de parâmetros."
|
|
385
|
-
// )
|
|
386
|
-
// }
|
|
387
|
-
// return parametros;
|
|
388
|
-
// }
|
|
389
307
|
/**
|
|
390
|
-
*
|
|
308
|
+
* Um módulo em Mapler nada mais é do que uma função.
|
|
309
|
+
* Um módulo aparentemente não especifica tipo de retorno.
|
|
310
|
+
* @returns Uma declaração de função.
|
|
391
311
|
*/
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
312
|
+
declaracaoModulo() {
|
|
313
|
+
const simboloModulo = this.avancarEDevolverAnterior();
|
|
314
|
+
const simboloNomeModulo = this.consumir(lexico_regular_1.default.IDENTIFICADOR, `Esperado nome do módulo após palavra reservada "modulo".`);
|
|
315
|
+
return new declaracoes_1.FuncaoDeclaracao(simboloNomeModulo, this.corpoDaFuncao(simboloModulo.tipo), null, []);
|
|
316
|
+
}
|
|
317
|
+
declaracaoPara() {
|
|
318
|
+
const simboloPara = this.avancarEDevolverAnterior();
|
|
319
|
+
const simboloVariavelIteracao = this.consumir(lexico_regular_1.default.IDENTIFICADOR, `Esperado identificador após palavra reservada "para".`);
|
|
320
|
+
this.consumir(lexico_regular_1.default.DE, `Esperado paravra reservada "de" após identificador em declaração "para".`);
|
|
321
|
+
const literalOuVariavelInicio = this.expressao();
|
|
322
|
+
this.consumir(lexico_regular_1.default.ATE, `Esperado paravra reservada "ate" após literal ou identificador de estado inicial em declaração "para".`);
|
|
323
|
+
const literalOuVariavelFim = this.expressao();
|
|
324
|
+
this.consumir(lexico_regular_1.default.PASSO, `Esperado paravra reservada "passo" após literal ou identificador de estado final em declaração "para".`);
|
|
325
|
+
let operadorCondicao = new delegua_1.Simbolo(lexico_regular_1.default.MENOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
326
|
+
let operadorCondicaoIncremento = new delegua_1.Simbolo(lexico_regular_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
327
|
+
// Se o valor do passo é uma variável, o passo só pode ser resolvido em
|
|
328
|
+
// tempo de execução.
|
|
329
|
+
let passo;
|
|
330
|
+
let resolverIncrementoEmExecucao = false;
|
|
331
|
+
if (literalOuVariavelInicio instanceof construtos_1.Literal && literalOuVariavelFim instanceof construtos_1.Literal) {
|
|
332
|
+
passo = this.unario();
|
|
333
|
+
if (passo.hasOwnProperty('operador') && passo.operador.tipo === lexico_regular_1.default.SUBTRACAO) {
|
|
334
|
+
operadorCondicao = new delegua_1.Simbolo(lexico_regular_1.default.MAIOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
335
|
+
operadorCondicaoIncremento = new delegua_1.Simbolo(lexico_regular_1.default.MAIOR, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// Passo e operador de condição precisam ser resolvidos em tempo de execução.
|
|
340
|
+
passo = undefined;
|
|
341
|
+
operadorCondicao = undefined;
|
|
342
|
+
operadorCondicaoIncremento = undefined;
|
|
343
|
+
resolverIncrementoEmExecucao = true;
|
|
344
|
+
}
|
|
345
|
+
this.consumir(lexico_regular_1.default.FACA, `Esperado palavra reservada "faca" após literal ou identificador de estado inicial em declaração "para".`);
|
|
346
|
+
const declaracoesBlocoPara = [];
|
|
347
|
+
let simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
348
|
+
while (simboloAtualBlocoPara.tipo !== lexico_regular_1.default.FIM) {
|
|
349
|
+
declaracoesBlocoPara.push(this.resolverDeclaracaoForaDeBloco());
|
|
350
|
+
simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
351
|
+
}
|
|
352
|
+
this.consumir(lexico_regular_1.default.FIM, '');
|
|
353
|
+
this.consumir(lexico_regular_1.default.PARA, "Esperado palavra reservada 'para' após palavra reservada 'fim' para encerrar declaração 'para'.");
|
|
354
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, "Esperado ponto-e-vírgula após palavra reservada 'para' para encerrar declaração 'para'.");
|
|
355
|
+
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
|
|
356
|
+
const declaracaoPara = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha),
|
|
357
|
+
// Inicialização.
|
|
358
|
+
new construtos_1.Atribuir(this.hashArquivo, simboloVariavelIteracao, literalOuVariavelInicio),
|
|
359
|
+
// Condição.
|
|
360
|
+
new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao), operadorCondicao, literalOuVariavelFim),
|
|
361
|
+
// Incremento, feito em construto especial `FimPara`.
|
|
362
|
+
new construtos_1.FimPara(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao), operadorCondicaoIncremento, literalOuVariavelFim), new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, simboloVariavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, simboloVariavelIteracao), new delegua_1.Simbolo(lexico_regular_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), passo)))), corpo);
|
|
363
|
+
declaracaoPara.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
|
|
364
|
+
return declaracaoPara;
|
|
365
|
+
}
|
|
410
366
|
declaracaoSe() {
|
|
411
367
|
const simboloSe = this.avancarEDevolverAnterior();
|
|
412
368
|
const condicao = this.expressao();
|
|
413
|
-
this.consumir(
|
|
369
|
+
this.consumir(lexico_regular_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
|
|
414
370
|
const declaracoes = [];
|
|
415
371
|
let caminhoSenao = null;
|
|
416
372
|
do {
|
|
417
373
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
418
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
374
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.SENAO)) {
|
|
419
375
|
const simboloSenao = this.simbolos[this.atual - 1];
|
|
420
376
|
const declaracoesSenao = [];
|
|
421
377
|
do {
|
|
422
378
|
declaracoesSenao.push(this.resolverDeclaracaoForaDeBloco());
|
|
423
|
-
} while (![
|
|
424
|
-
![
|
|
379
|
+
} while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
|
|
380
|
+
![lexico_regular_1.default.SE].includes(this.simbolos[this.atual + 1].tipo));
|
|
425
381
|
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
|
|
426
382
|
}
|
|
427
|
-
} while (![
|
|
428
|
-
![
|
|
429
|
-
this.consumir(
|
|
430
|
-
this.consumir(
|
|
431
|
-
this.consumir(
|
|
383
|
+
} while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
|
|
384
|
+
![lexico_regular_1.default.SE].includes(this.simbolos[this.atual + 1].tipo));
|
|
385
|
+
this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para iniciar o fechamento de declaração 'se'.");
|
|
386
|
+
this.consumir(lexico_regular_1.default.SE, "Esperado palavra-chave 'se' para o fechamento de declaração 'se'.");
|
|
387
|
+
this.consumir(lexico_regular_1.default.PONTO_VIRGULA, "Esperado palavra-chave ';' para o fechamento de declaração 'se'.");
|
|
432
388
|
return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
|
|
433
389
|
}
|
|
434
390
|
resolverDeclaracaoForaDeBloco() {
|
|
435
391
|
const simboloAtual = this.simbolos[this.atual];
|
|
436
392
|
switch (simboloAtual.tipo) {
|
|
437
|
-
case
|
|
393
|
+
case lexico_regular_1.default.COMENTARIO:
|
|
394
|
+
return this.declaracaoComentario();
|
|
395
|
+
case lexico_regular_1.default.ENQUANTO:
|
|
438
396
|
return this.declaracaoEnquanto();
|
|
439
|
-
case
|
|
397
|
+
case lexico_regular_1.default.ESCREVER:
|
|
440
398
|
return this.declaracaoEscrevaMesmaLinha();
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
case
|
|
399
|
+
case lexico_regular_1.default.FIM:
|
|
400
|
+
this.lendoModulos = true;
|
|
401
|
+
this.avancarEDevolverAnterior();
|
|
402
|
+
return null;
|
|
403
|
+
case lexico_regular_1.default.LER:
|
|
446
404
|
return this.declaracaoLeia();
|
|
447
|
-
case
|
|
405
|
+
case lexico_regular_1.default.MODULO:
|
|
406
|
+
if (!this.lendoModulos) {
|
|
407
|
+
throw this.erro(simboloAtual, 'Esperado instrução "FIM" antes de começar a ler módulos.');
|
|
408
|
+
}
|
|
409
|
+
return this.declaracaoModulo();
|
|
410
|
+
case lexico_regular_1.default.PARA:
|
|
448
411
|
return this.declaracaoPara();
|
|
449
412
|
// case tiposDeSimbolos.PARENTESE_DIREITO:
|
|
450
413
|
// throw new Error('Não deveria estar caindo aqui.');
|
|
451
|
-
|
|
452
|
-
// return this.declaracaoProcedimento();
|
|
453
|
-
case mapler_1.default.REPITA:
|
|
414
|
+
case lexico_regular_1.default.REPITA:
|
|
454
415
|
return this.declaracaoFazer();
|
|
455
|
-
case
|
|
416
|
+
case lexico_regular_1.default.SE:
|
|
456
417
|
return this.declaracaoSe();
|
|
457
418
|
default:
|
|
458
419
|
return this.expressao();
|
|
@@ -467,17 +428,22 @@ class AvaliadorSintaticoMapler extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
467
428
|
this.erros = [];
|
|
468
429
|
this.atual = 0;
|
|
469
430
|
this.blocos = 0;
|
|
431
|
+
this.lendoModulos = false;
|
|
432
|
+
this.modulos = [];
|
|
470
433
|
this.hashArquivo = hashArquivo || 0;
|
|
471
434
|
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
472
435
|
let declaracoes = [];
|
|
473
|
-
this.
|
|
436
|
+
while (this.simbolos[this.atual].tipo === lexico_regular_1.default.COMENTARIO) {
|
|
437
|
+
declaracoes.push(this.declaracaoComentario());
|
|
438
|
+
}
|
|
439
|
+
this.consumir(lexico_regular_1.default.VARIAVEIS, "Esperado expressão 'variaveis' para inicializar programa.");
|
|
474
440
|
declaracoes = declaracoes.concat(this.validarSegmentoVariaveis());
|
|
475
|
-
this.consumir(
|
|
476
|
-
while (!this.estaNoFinal()
|
|
441
|
+
this.consumir(lexico_regular_1.default.INICIO, `Esperado expressão 'inicio' para marcar o inicio do programa.`);
|
|
442
|
+
while (!this.estaNoFinal()) {
|
|
477
443
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
478
444
|
}
|
|
479
445
|
return {
|
|
480
|
-
declaracoes: declaracoes.filter(
|
|
446
|
+
declaracoes: declaracoes.filter(d => d),
|
|
481
447
|
erros: this.erros,
|
|
482
448
|
};
|
|
483
449
|
}
|