@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.
Files changed (34) hide show
  1. package/README.md +31 -0
  2. package/avaliador-sintatico/avaliador-sintatico-mapler.d.ts +12 -5
  3. package/avaliador-sintatico/avaliador-sintatico-mapler.d.ts.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico-mapler.js +195 -229
  5. package/avaliador-sintatico/avaliador-sintatico-mapler.js.map +1 -1
  6. package/declaracoes/declaracao-futura.d.ts +14 -0
  7. package/declaracoes/declaracao-futura.d.ts.map +1 -0
  8. package/declaracoes/declaracao-futura.js +22 -0
  9. package/declaracoes/declaracao-futura.js.map +1 -0
  10. package/declaracoes/index.d.ts +1 -0
  11. package/declaracoes/index.d.ts.map +1 -0
  12. package/declaracoes/index.js +1 -0
  13. package/declaracoes/index.js.map +1 -0
  14. package/lexador/lexador-mapler.d.ts +1 -0
  15. package/lexador/lexador-mapler.d.ts.map +1 -1
  16. package/lexador/lexador-mapler.js +11 -6
  17. package/lexador/lexador-mapler.js.map +1 -1
  18. package/lexador/palavras-reservadas.d.ts +2 -3
  19. package/lexador/palavras-reservadas.d.ts.map +1 -1
  20. package/lexador/palavras-reservadas.js +2 -3
  21. package/lexador/palavras-reservadas.js.map +1 -1
  22. package/package.json +2 -2
  23. package/resolvedor/index.d.ts +2 -0
  24. package/resolvedor/index.d.ts.map +1 -0
  25. package/resolvedor/index.js +18 -0
  26. package/resolvedor/index.js.map +1 -0
  27. package/resolvedor/resolvedor-mapler.d.ts +83 -0
  28. package/resolvedor/resolvedor-mapler.d.ts.map +1 -0
  29. package/resolvedor/resolvedor-mapler.js +237 -0
  30. package/resolvedor/resolvedor-mapler.js.map +1 -0
  31. package/tipos-de-simbolos/lexico-regular.d.ts +1 -4
  32. package/tipos-de-simbolos/lexico-regular.d.ts.map +1 -1
  33. package/tipos-de-simbolos/lexico-regular.js +1 -4
  34. 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 mapler_1 = __importDefault(require("@designliquido/delegua/tipos-de-simbolos/mapler"));
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(mapler_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
30
- this.consumir(mapler_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
31
- this.consumir(mapler_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
32
- const numeroFinal = this.consumir(mapler_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
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(mapler_1.default.VIRGULA));
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(mapler_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
41
- } while (this.verificarSeSimboloAtualEIgualA(mapler_1.default.VIRGULA));
42
- this.consumir(mapler_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
43
- if (!this.verificarSeSimboloAtualEIgualA(mapler_1.default.CADEIA, mapler_1.default.CARACTERE, mapler_1.default.INTEIRO, mapler_1.default.LOGICO, mapler_1.default.REAL, mapler_1.default.VETOR)) {
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(mapler_1.default.INICIO)) {
61
- const simboloAtual = this.simbolos[this.atual];
62
- switch (simboloAtual.tipo) {
63
- // case tiposDeSimbolos.PROCEDIMENTO:
64
- // const dadosProcedimento = this.declaracaoProcedimento();
65
- // inicializacoes.push(dadosProcedimento);
66
- // break;
67
- default:
68
- const dadosVariaveis = this.logicaComumParametroMapler();
69
- // Se chegou até aqui, variáveis são válidas.
70
- // Devem ser declaradas com um valor inicial padrão.
71
- for (let identificador of dadosVariaveis.identificadores) {
72
- switch (dadosVariaveis.tipo) {
73
- case mapler_1.default.CADEIA:
74
- case mapler_1.default.CARACTERE:
75
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), ''), 'texto'));
76
- break;
77
- case mapler_1.default.INTEIRO:
78
- case mapler_1.default.REAL:
79
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0), 'numero'));
80
- break;
81
- case mapler_1.default.LOGICO:
82
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false), 'lógico'));
83
- break;
84
- case mapler_1.default.VETOR:
85
- // TODO: Validar vetor
86
- this.consumir(mapler_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
87
- const dimensoes = this.validarDimensoesVetor();
88
- this.consumir(mapler_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
89
- this.consumir(mapler_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
90
- if (!this.verificarSeSimboloAtualEIgualA(mapler_1.default.CARACTERE, mapler_1.default.INTEIRO, mapler_1.default.LOGICO, mapler_1.default.REAL, mapler_1.default.VETOR)) {
91
- throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
92
- }
93
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes)), 'vetor'));
94
- break;
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
- break;
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(mapler_1.default.PONTO_VIRGULA, "Esperado ';' após declaração de variável.");
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(mapler_1.default.FALSO))
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(mapler_1.default.VERDADEIRO))
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(mapler_1.default.IDENTIFICADOR)) {
113
- return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
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(mapler_1.default.NUMERO, mapler_1.default.CADEIA, mapler_1.default.CARACTERE)) {
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(mapler_1.default.PARENTESE_ESQUERDO)) {
134
+ if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
120
135
  const expressao = this.expressao();
121
- this.consumir(mapler_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
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
- //TODO: @Samuel
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(mapler_1.default.DIFERENTE, mapler_1.default.IGUAL)) {
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(mapler_1.default.OU /*, tiposDeSimbolos.XOU*/)) {
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(mapler_1.default.SETA_ATRIBUICAO)) {
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(mapler_1.default.LER))
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
- // while (![
176
- // tiposDeSimbolos.FIM_FUNCAO,
177
- // tiposDeSimbolos.FIM_PROCEDIMENTO
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(mapler_1.default.PARENTESE_ESQUERDO)) {
197
+ if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
191
198
  expressao = this.finalizarChamada(expressao);
192
199
  }
193
- else if (this.verificarSeSimboloAtualEIgualA(mapler_1.default.COLCHETE_ESQUERDO)) {
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(mapler_1.default.VIRGULA));
204
+ } while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
198
205
  const indice = indices[0];
199
- const simboloFechamento = this.consumir(mapler_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
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
- this.consumir(mapler_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
211
- // this.consumir(tiposDeSimbolos.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
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
- return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), null, corpo);
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(mapler_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
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 (![mapler_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
224
- ![mapler_1.default.ENQUANTO].includes(this.simbolos[this.atual + 1].tipo));
225
- this.consumir(mapler_1.default.FIM, "Esperado palavra-chave 'fim' para iniciar o fechamento de declaração 'enquanto'.");
226
- this.consumir(mapler_1.default.ENQUANTO, "Esperado palavra-chave 'enquanto' para o fechamento de declaração 'enquanto'.");
227
- this.consumir(mapler_1.default.PONTO_VIRGULA, "Esperado palavra-chave ';' para o fechamento de declaração 'enquanto'.");
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(mapler_1.default.VIRGULA));
240
- this.consumir(mapler_1.default.PONTO_VIRGULA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
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 (![mapler_1.default.ATE].includes(this.simbolos[this.atual].tipo));
262
- this.consumir(mapler_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
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(mapler_1.default.PONTO_VIRGULA));
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
- * Procedimentos nada mais são do que funções que não retornam valor.
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
- // declaracaoProcedimento() {
393
- // const simboloProcedimento: SimboloInterface = this.avancarEDevolverAnterior();
394
- // const nomeProcedimento = this.consumir(tiposDeSimbolos.IDENTIFICADOR,
395
- // "Esperado nome do procedimento após palavra-chave `procedimento`.");
396
- // // Parâmetros
397
- // const parametros = this.logicaComumParametros();
398
- // this.validarSegmentoVariaveis();
399
- // this.validarSegmentoInicio('procedimento');
400
- // const corpo = this.blocoEscopo();
401
- // return new FuncaoDeclaracao(
402
- // nomeProcedimento, new FuncaoConstruto(
403
- // this.hashArquivo,
404
- // Number(simboloProcedimento.linha),
405
- // parametros,
406
- // corpo.filter(d => d)
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(mapler_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
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(mapler_1.default.SENAO)) {
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 (![mapler_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
424
- ![mapler_1.default.SE].includes(this.simbolos[this.atual + 1].tipo));
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 (![mapler_1.default.FIM].includes(this.simbolos[this.atual].tipo) &&
428
- ![mapler_1.default.SE].includes(this.simbolos[this.atual + 1].tipo));
429
- this.consumir(mapler_1.default.FIM, "Esperado palavra-chave 'fim' para iniciar o fechamento de declaração 'se'.");
430
- this.consumir(mapler_1.default.SE, "Esperado palavra-chave 'se' para o fechamento de declaração 'se'.");
431
- this.consumir(mapler_1.default.PONTO_VIRGULA, "Esperado palavra-chave ';' para o fechamento de declaração 'se'.");
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 mapler_1.default.ENQUANTO:
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 mapler_1.default.ESCREVER:
397
+ case lexico_regular_1.default.ESCREVER:
440
398
  return this.declaracaoEscrevaMesmaLinha();
441
- // case tiposDeSimbolos.FUNCAO:
442
- // return this.funcao('funcao');
443
- // case tiposDeSimbolos.INTERROMPA:
444
- // return this.declaracaoInterrompa();
445
- case mapler_1.default.LER:
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 mapler_1.default.PARA:
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
- // case tiposDeSimbolos.PROCEDIMENTO:
452
- // return this.declaracaoProcedimento();
453
- case mapler_1.default.REPITA:
414
+ case lexico_regular_1.default.REPITA:
454
415
  return this.declaracaoFazer();
455
- case mapler_1.default.SE:
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.consumir(mapler_1.default.VARIAVEIS, "Esperado expressão 'variaveis' para inicializar programa.");
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(mapler_1.default.INICIO, `Esperado expressão 'inicio' para marcar o inicio do programa.`);
476
- while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== mapler_1.default.FIM) {
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((d) => d),
446
+ declaracoes: declaracoes.filter(d => d),
481
447
  erros: this.erros,
482
448
  };
483
449
  }