@designliquido/delegua 0.33.8 → 0.33.9

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 (90) hide show
  1. package/analisador-semantico/dialetos/index.d.ts +0 -1
  2. package/analisador-semantico/dialetos/index.d.ts.map +1 -1
  3. package/analisador-semantico/dialetos/index.js +0 -1
  4. package/analisador-semantico/dialetos/index.js.map +1 -1
  5. package/avaliador-sintatico/dialetos/index.d.ts +0 -1
  6. package/avaliador-sintatico/dialetos/index.d.ts.map +1 -1
  7. package/avaliador-sintatico/dialetos/index.js +0 -1
  8. package/avaliador-sintatico/dialetos/index.js.map +1 -1
  9. package/bin/package.json +1 -1
  10. package/formatadores/index.d.ts +0 -1
  11. package/formatadores/index.d.ts.map +1 -1
  12. package/formatadores/index.js +0 -1
  13. package/formatadores/index.js.map +1 -1
  14. package/interpretador/dialetos/index.d.ts +0 -1
  15. package/interpretador/dialetos/index.d.ts.map +1 -1
  16. package/interpretador/dialetos/index.js +0 -1
  17. package/interpretador/dialetos/index.js.map +1 -1
  18. package/lexador/dialetos/index.d.ts +0 -1
  19. package/lexador/dialetos/index.d.ts.map +1 -1
  20. package/lexador/dialetos/index.js +0 -1
  21. package/lexador/dialetos/index.js.map +1 -1
  22. package/lexador/dialetos/palavras-reservadas/index.d.ts +0 -1
  23. package/lexador/dialetos/palavras-reservadas/index.d.ts.map +1 -1
  24. package/lexador/dialetos/palavras-reservadas/index.js +1 -3
  25. package/lexador/dialetos/palavras-reservadas/index.js.map +1 -1
  26. package/package.json +1 -1
  27. package/tradutores/index.d.ts +0 -1
  28. package/tradutores/index.d.ts.map +1 -1
  29. package/tradutores/index.js +0 -1
  30. package/tradutores/index.js.map +1 -1
  31. package/analisador-semantico/dialetos/analisador-semantico-visualg.d.ts +0 -38
  32. package/analisador-semantico/dialetos/analisador-semantico-visualg.d.ts.map +0 -1
  33. package/analisador-semantico/dialetos/analisador-semantico-visualg.js +0 -229
  34. package/analisador-semantico/dialetos/analisador-semantico-visualg.js.map +0 -1
  35. package/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.d.ts +0 -85
  36. package/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.d.ts.map +0 -1
  37. package/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.js +0 -731
  38. package/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.js.map +0 -1
  39. package/avaliador-sintatico/dialetos/visualg/index.d.ts +0 -2
  40. package/avaliador-sintatico/dialetos/visualg/index.d.ts.map +0 -1
  41. package/avaliador-sintatico/dialetos/visualg/index.js +0 -18
  42. package/avaliador-sintatico/dialetos/visualg/index.js.map +0 -1
  43. package/avaliador-sintatico/dialetos/visualg/parametro-visualg.d.ts +0 -8
  44. package/avaliador-sintatico/dialetos/visualg/parametro-visualg.d.ts.map +0 -1
  45. package/avaliador-sintatico/dialetos/visualg/parametro-visualg.js +0 -3
  46. package/avaliador-sintatico/dialetos/visualg/parametro-visualg.js.map +0 -1
  47. package/bibliotecas/dialetos/visualg/caracteres.d.ts +0 -4
  48. package/bibliotecas/dialetos/visualg/caracteres.d.ts.map +0 -1
  49. package/bibliotecas/dialetos/visualg/caracteres.js +0 -46
  50. package/bibliotecas/dialetos/visualg/caracteres.js.map +0 -1
  51. package/bibliotecas/dialetos/visualg/index.d.ts +0 -3
  52. package/bibliotecas/dialetos/visualg/index.d.ts.map +0 -1
  53. package/bibliotecas/dialetos/visualg/index.js +0 -19
  54. package/bibliotecas/dialetos/visualg/index.js.map +0 -1
  55. package/bibliotecas/dialetos/visualg/numerica.d.ts +0 -4
  56. package/bibliotecas/dialetos/visualg/numerica.d.ts.map +0 -1
  57. package/bibliotecas/dialetos/visualg/numerica.js +0 -74
  58. package/bibliotecas/dialetos/visualg/numerica.js.map +0 -1
  59. package/formatadores/formatador-visualg.d.ts +0 -73
  60. package/formatadores/formatador-visualg.d.ts.map +0 -1
  61. package/formatadores/formatador-visualg.js +0 -617
  62. package/formatadores/formatador-visualg.js.map +0 -1
  63. package/interpretador/dialetos/visualg/comum.d.ts +0 -21
  64. package/interpretador/dialetos/visualg/comum.d.ts.map +0 -1
  65. package/interpretador/dialetos/visualg/comum.js +0 -372
  66. package/interpretador/dialetos/visualg/comum.js.map +0 -1
  67. package/interpretador/dialetos/visualg/index.d.ts +0 -3
  68. package/interpretador/dialetos/visualg/index.d.ts.map +0 -1
  69. package/interpretador/dialetos/visualg/index.js +0 -19
  70. package/interpretador/dialetos/visualg/index.js.map +0 -1
  71. package/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.d.ts +0 -55
  72. package/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.d.ts.map +0 -1
  73. package/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.js +0 -211
  74. package/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.js.map +0 -1
  75. package/interpretador/dialetos/visualg/interpretador-visualg.d.ts +0 -58
  76. package/interpretador/dialetos/visualg/interpretador-visualg.d.ts.map +0 -1
  77. package/interpretador/dialetos/visualg/interpretador-visualg.js +0 -194
  78. package/interpretador/dialetos/visualg/interpretador-visualg.js.map +0 -1
  79. package/lexador/dialetos/lexador-visualg.d.ts +0 -20
  80. package/lexador/dialetos/lexador-visualg.d.ts.map +0 -1
  81. package/lexador/dialetos/lexador-visualg.js +0 -226
  82. package/lexador/dialetos/lexador-visualg.js.map +0 -1
  83. package/lexador/dialetos/palavras-reservadas/visualg.d.ts +0 -75
  84. package/lexador/dialetos/palavras-reservadas/visualg.d.ts.map +0 -1
  85. package/lexador/dialetos/palavras-reservadas/visualg.js +0 -82
  86. package/lexador/dialetos/palavras-reservadas/visualg.js.map +0 -1
  87. package/tradutores/tradutor-reverso-visualg.d.ts +0 -54
  88. package/tradutores/tradutor-reverso-visualg.d.ts.map +0 -1
  89. package/tradutores/tradutor-reverso-visualg.js +0 -264
  90. package/tradutores/tradutor-reverso-visualg.js.map +0 -1
@@ -1,731 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AvaliadorSintaticoVisuAlg = void 0;
7
- const avaliador_sintatico_base_1 = require("../../avaliador-sintatico-base");
8
- const declaracoes_1 = require("../../../declaracoes");
9
- const construtos_1 = require("../../../construtos");
10
- const lexador_1 = require("../../../lexador");
11
- const visualg_1 = __importDefault(require("../../../tipos-de-simbolos/visualg"));
12
- const erro_avaliador_sintatico_1 = require("../../erro-avaliador-sintatico");
13
- const inicio_algoritmo_1 = require("../../../declaracoes/inicio-algoritmo");
14
- class AvaliadorSintaticoVisuAlg extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
15
- constructor() {
16
- super();
17
- this.blocoPrincipalIniciado = false;
18
- }
19
- validarSegmentoAlgoritmo() {
20
- this.consumir(visualg_1.default.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
21
- const descricaoAlgoritmo = this.consumir(visualg_1.default.CARACTERE, "Esperada cadeia de caracteres após palavra-chave 'algoritmo'.");
22
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
23
- return descricaoAlgoritmo;
24
- }
25
- criarVetorNDimensional(dimensoes) {
26
- if (dimensoes.length > 0) {
27
- const dimensao = dimensoes[0] + 1;
28
- const resto = dimensoes.slice(1);
29
- const novoArray = Array(dimensao);
30
- for (let i = 0; i <= dimensao; i++) {
31
- novoArray[i] = this.criarVetorNDimensional(resto);
32
- }
33
- return novoArray;
34
- }
35
- return undefined;
36
- }
37
- validarDimensoesVetor() {
38
- let dimensoes = [];
39
- do {
40
- const numeroInicial = this.consumir(visualg_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
41
- this.consumir(visualg_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
42
- this.consumir(visualg_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
43
- const numeroFinal = this.consumir(visualg_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
44
- dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
45
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
46
- return dimensoes;
47
- }
48
- logicaComumParametroVisuAlg() {
49
- const identificadores = [];
50
- let referencia = this.verificarSeSimboloAtualEIgualA(visualg_1.default.VAR);
51
- do {
52
- identificadores.push(this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
53
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
54
- this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
55
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTER, visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
56
- throw this.erro(this.simbolos[this.atual], `Tipo de variável não conhecido: ${this.simbolos[this.atual].lexema}`);
57
- }
58
- const simboloAnterior = this.simbolos[this.atual - 1];
59
- const tipoVariavel = simboloAnterior.tipo;
60
- return {
61
- identificadores,
62
- tipo: tipoVariavel,
63
- simbolo: simboloAnterior,
64
- referencia: referencia,
65
- };
66
- }
67
- /**
68
- * Validação do segmento de declaração de variáveis (opcional).
69
- * @returns Vetor de Construtos para inicialização de variáveis.
70
- */
71
- validarSegmentoVar() {
72
- // Podem haver linhas de comentários acima de `var`, que geram
73
- // quebras de linha.
74
- while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
75
- this.avancarEDevolverAnterior();
76
- }
77
- if (!this.verificarTipoSimboloAtual(visualg_1.default.VAR)) {
78
- return [];
79
- }
80
- const inicializacoes = [];
81
- this.avancarEDevolverAnterior(); // Var
82
- while (!this.verificarTipoSimboloAtual(visualg_1.default.INICIO)) {
83
- // Se ainda houver quebras de linha, volta para o começo do `while`.
84
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.QUEBRA_LINHA)) {
85
- continue;
86
- }
87
- const simboloAtual = this.simbolos[this.atual];
88
- switch (simboloAtual.tipo) {
89
- case visualg_1.default.FUNCAO:
90
- case visualg_1.default.FUNÇÃO:
91
- const dadosFuncao = this.funcao('funcao');
92
- inicializacoes.push(dadosFuncao);
93
- break;
94
- case visualg_1.default.PROCEDIMENTO:
95
- const dadosProcedimento = this.declaracaoProcedimento();
96
- inicializacoes.push(dadosProcedimento);
97
- break;
98
- default:
99
- const dadosVariaveis = this.logicaComumParametroVisuAlg();
100
- // Se chegou até aqui, variáveis são válidas.
101
- // Devem ser declaradas com um valor inicial padrão.
102
- if (dadosVariaveis.tipo === visualg_1.default.VETOR) {
103
- this.consumir(visualg_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
104
- const dimensoes = this.validarDimensoesVetor();
105
- this.consumir(visualg_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
106
- this.consumir(visualg_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
107
- const simboloTipo = this.simbolos[this.atual];
108
- if (![
109
- visualg_1.default.CARACTER,
110
- visualg_1.default.CARACTERE,
111
- visualg_1.default.INTEIRO,
112
- visualg_1.default.LOGICO,
113
- visualg_1.default.REAL,
114
- visualg_1.default.VETOR,
115
- ].includes(simboloTipo.tipo)) {
116
- throw this.erro(simboloTipo, 'Tipo de variável não conhecido para inicialização de vetor.');
117
- }
118
- for (let identificador of dadosVariaveis.identificadores) {
119
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes)), `${simboloTipo.lexema}[]`));
120
- }
121
- this.atual++;
122
- }
123
- else {
124
- for (let identificador of dadosVariaveis.identificadores) {
125
- const tipo = dadosVariaveis.tipo;
126
- switch (dadosVariaveis.tipo) {
127
- case visualg_1.default.CARACTER:
128
- case visualg_1.default.CARACTERE:
129
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), ''), tipo));
130
- break;
131
- case visualg_1.default.INTEIRO:
132
- case visualg_1.default.REAL:
133
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0), tipo));
134
- break;
135
- case visualg_1.default.LOGICO:
136
- inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false), tipo));
137
- break;
138
- }
139
- }
140
- }
141
- break;
142
- }
143
- this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração de variável.');
144
- }
145
- return inicializacoes;
146
- }
147
- validarSegmentoInicio(algoritmoOuFuncao) {
148
- const simboloInicio = this.consumir(visualg_1.default.INICIO, `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`);
149
- return simboloInicio;
150
- }
151
- estaNoFinal() {
152
- return this.atual === this.simbolos.length;
153
- }
154
- metodoBibliotecaGlobal() {
155
- const simboloAnterior = this.simbolos[this.atual - 1];
156
- switch (simboloAnterior.lexema) {
157
- case 'int':
158
- return new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.IDENTIFICADOR, 'inteiro', null, Number(simboloAnterior.linha), this.hashArquivo)), null, []);
159
- default:
160
- return null;
161
- }
162
- }
163
- primario() {
164
- const simboloAtual = this.simbolos[this.atual];
165
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.FALSO))
166
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
167
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VERDADEIRO))
168
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
169
- if (simboloAtual.lexema === 'limpatela') {
170
- const variavel = new construtos_1.Variavel(this.hashArquivo, simboloAtual);
171
- this.avancarEDevolverAnterior();
172
- return new construtos_1.Chamada(this.hashArquivo, variavel, null, []);
173
- }
174
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.IDENTIFICADOR, visualg_1.default.METODO_BIBLIOTECA_GLOBAL)) {
175
- return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
176
- }
177
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO, visualg_1.default.CARACTER, visualg_1.default.CARACTERE)) {
178
- const simboloAnterior = this.simbolos[this.atual - 1];
179
- return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
180
- }
181
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
182
- const expressao = this.expressao();
183
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
184
- return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
185
- }
186
- throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
187
- }
188
- comparacaoIgualdade() {
189
- let expressao = this.comparar();
190
- while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DIFERENTE, visualg_1.default.IGUAL)) {
191
- const simboloAnterior = this.simbolos[this.atual - 1];
192
- const direito = this.comparar();
193
- expressao = new construtos_1.Binario(this.hashArquivo, expressao, simboloAnterior, direito);
194
- }
195
- return expressao;
196
- }
197
- ou() {
198
- let expressao = this.e();
199
- while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.OU, visualg_1.default.XOU)) {
200
- const operador = this.simbolos[this.atual - 1];
201
- const direito = this.e();
202
- expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
203
- }
204
- return expressao;
205
- }
206
- /**
207
- * Método que resolve atribuições.
208
- * @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
209
- */
210
- atribuir() {
211
- const expressao = this.ou();
212
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SETA_ATRIBUICAO)) {
213
- const setaAtribuicao = this.simbolos[this.atual - 1];
214
- const valor = this.atribuir();
215
- if (expressao instanceof construtos_1.Variavel) {
216
- const simbolo = expressao.simbolo;
217
- return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
218
- }
219
- else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
220
- return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
221
- }
222
- else if (expressao instanceof construtos_1.AcessoElementoMatriz) {
223
- return new construtos_1.AtribuicaoPorIndicesMatriz(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indicePrimario, expressao.indiceSecundario, valor);
224
- }
225
- this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
226
- }
227
- return expressao;
228
- }
229
- expressao() {
230
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.LEIA))
231
- return this.declaracaoLeia();
232
- return this.atribuir();
233
- }
234
- blocoEscopo() {
235
- const declaracoes = [];
236
- while (![visualg_1.default.FIM_FUNCAO, visualg_1.default.FIM_FUNÇÃO, visualg_1.default.FIM_PROCEDIMENTO].includes(this.simbolos[this.atual].tipo) &&
237
- !this.estaNoFinal()) {
238
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
239
- }
240
- // Se chegou até aqui, simplesmente consome o símbolo.
241
- this.avancarEDevolverAnterior();
242
- // this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
243
- return declaracoes;
244
- }
245
- chamar() {
246
- let expressao = this.primario();
247
- while (true) {
248
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
249
- expressao = this.finalizarChamada(expressao);
250
- }
251
- else if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.COLCHETE_ESQUERDO)) {
252
- const indices = [];
253
- do {
254
- indices.push(this.expressao());
255
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
256
- const simboloFechamento = this.consumir(visualg_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
257
- if (!indices[1]) {
258
- expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indices[0], simboloFechamento);
259
- }
260
- else {
261
- expressao = new construtos_1.AcessoElementoMatriz(this.hashArquivo, expressao, indices[0], indices[1], simboloFechamento);
262
- }
263
- }
264
- else {
265
- break;
266
- }
267
- }
268
- return expressao;
269
- }
270
- simboloAtual() {
271
- return this.simbolos[this.atual - 2];
272
- }
273
- verificarDefinicaoTipoAtual() {
274
- const tipos = ['inteiro', 'qualquer', 'real', 'texto', 'vazio', 'vetor', 'caracter'];
275
- const lexema = this.simboloAtual().lexema.toLowerCase();
276
- const contemTipo = tipos.find((tipo) => tipo === lexema);
277
- if (contemTipo && this.verificarTipoProximoSimbolo(visualg_1.default.COLCHETE_ESQUERDO)) {
278
- const tiposVetores = ['inteiro[]', 'qualquer[]', 'real[]', 'texto[]', 'caracter[]'];
279
- this.avancarEDevolverAnterior();
280
- if (!this.verificarTipoProximoSimbolo(visualg_1.default.COLCHETE_DIREITO)) {
281
- throw this.erro(this.simbolos[this.atual - 1], "Esperado símbolo de fechamento do vetor ']'.");
282
- }
283
- const contemTipoVetor = tiposVetores.find((tipo) => tipo === `${lexema}[]`);
284
- this.avancarEDevolverAnterior();
285
- return contemTipoVetor;
286
- }
287
- return contemTipo;
288
- }
289
- corpoDaFuncao(tipo) {
290
- const simboloAnterior = this.simbolos[this.atual - 1];
291
- // Parâmetros
292
- const parametros = this.logicaComumParametros();
293
- this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
294
- // Tipo retornado pela função.
295
- let tipoRetorno = null;
296
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.INTEIRO, visualg_1.default.CARACTER, visualg_1.default.CARACTERE, visualg_1.default.REAL, visualg_1.default.LOGICO)) {
297
- throw this.erro(this.simbolos[this.atual], 'Esperado um tipo válido para retorno de função');
298
- }
299
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
300
- tipoRetorno = this.verificarDefinicaoTipoAtual();
301
- const inicializacoes = this.validarSegmentoVar();
302
- this.validarSegmentoInicio('função');
303
- const corpo = inicializacoes.concat(this.blocoEscopo());
304
- return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), parametros, corpo.filter((d) => d), tipoRetorno);
305
- }
306
- declaracaoEnquanto() {
307
- const simboloAtual = this.avancarEDevolverAnterior();
308
- const condicao = this.expressao();
309
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.FACA, visualg_1.default.FAÇA)) {
310
- this.consumir(this.simbolos[this.atual].tipo, "Esperado paravra reservada 'faca' ou 'faça' após condição de continuidade em declaracão 'enquanto'.");
311
- }
312
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' em declaracão 'enquanto'.");
313
- const declaracoes = [];
314
- do {
315
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
316
- } while (![visualg_1.default.FIM_ENQUANTO].includes(this.simbolos[this.atual].tipo));
317
- this.consumir(visualg_1.default.FIM_ENQUANTO, "Esperado palavra-chave 'fimenquanto' para fechamento de declaração 'enquanto'.");
318
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimenquanto'.");
319
- return new declaracoes_1.Enquanto(condicao, new declaracoes_1.Bloco(simboloAtual.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)));
320
- }
321
- logicaCasosEscolha() {
322
- const literais = [];
323
- let simboloAtualCaso = this.simbolos[this.atual];
324
- while (simboloAtualCaso.tipo !== visualg_1.default.QUEBRA_LINHA) {
325
- literais.push(this.primario());
326
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA);
327
- simboloAtualCaso = this.simbolos[this.atual];
328
- }
329
- return literais;
330
- }
331
- declaracaoEscolha() {
332
- const simboloAtual = this.avancarEDevolverAnterior();
333
- // Parênteses são opcionais para delimitar o identificador.
334
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO);
335
- const identificador = this.primario();
336
- this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_DIREITO);
337
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após variável ou literal de declaração 'caso'.");
338
- while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
339
- this.avancarEDevolverAnterior();
340
- }
341
- // Blocos de caso
342
- const caminhos = [];
343
- let simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
344
- while (![visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(simboloAtualBlocoCaso.tipo)) {
345
- const caminhoCondicoes = this.logicaCasosEscolha();
346
- const declaracoes = [];
347
- do {
348
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
349
- } while (![visualg_1.default.CASO, visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(this.simbolos[this.atual].tipo));
350
- caminhos.push({
351
- condicoes: caminhoCondicoes.filter((c) => c),
352
- declaracoes: declaracoes.filter((d) => d),
353
- });
354
- while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
355
- this.avancarEDevolverAnterior();
356
- }
357
- simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
358
- }
359
- let caminhoPadrao = null;
360
- if (simboloAtualBlocoCaso.tipo === visualg_1.default.OUTRO_CASO) {
361
- const declaracoes = [];
362
- do {
363
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
364
- } while (!this.verificarTipoSimboloAtual(visualg_1.default.FIM_ESCOLHA));
365
- caminhoPadrao = {
366
- declaracoes: declaracoes.filter((d) => d),
367
- };
368
- simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
369
- }
370
- if (simboloAtualBlocoCaso.tipo !== visualg_1.default.FIM_ESCOLHA) {
371
- throw this.erro(this.simbolos[this.atual], "Esperado palavra-chave 'fimescolha' para fechamento de declaração 'escolha'.");
372
- }
373
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimescolha'.");
374
- return new declaracoes_1.Escolha(identificador, caminhos, caminhoPadrao);
375
- }
376
- logicaComumEscreva() {
377
- const simboloParenteses = this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
378
- const argumentos = [];
379
- // Sem não houver parâmetros, retorna vetor com literal vazio.
380
- if (this.simbolos[this.atual].tipo === visualg_1.default.PARENTESE_DIREITO) {
381
- this.avancarEDevolverAnterior();
382
- return [
383
- new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), new construtos_1.Literal(this.hashArquivo, Number(simboloParenteses.linha), '')),
384
- ];
385
- }
386
- do {
387
- const valor = this.expressao();
388
- let espacos = 0;
389
- let casasDecimais = 0;
390
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
391
- // Espaços
392
- const simboloEspacos = this.consumir(visualg_1.default.NUMERO, 'Esperado número após sinal de dois-pontos após identificador como argumento.');
393
- espacos = Number(simboloEspacos.lexema) - 1;
394
- }
395
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
396
- // Casas decimais
397
- const simboloCasasDecimais = this.consumir(visualg_1.default.NUMERO, 'Esperado número após segundo sinal de dois-pontos após identificador como argumento.');
398
- casasDecimais = Number(simboloCasasDecimais.lexema);
399
- }
400
- argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), valor, espacos, casasDecimais));
401
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
402
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
403
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
404
- return argumentos;
405
- }
406
- declaracaoEscreva() {
407
- const simboloAtual = this.avancarEDevolverAnterior();
408
- const argumentos = this.logicaComumEscreva();
409
- return new declaracoes_1.Escreva(Number(simboloAtual.linha), this.hashArquivo, argumentos);
410
- }
411
- declaracaoEscrevaMesmaLinha() {
412
- const simboloAtual = this.avancarEDevolverAnterior();
413
- const argumentos = this.logicaComumEscreva();
414
- return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), this.hashArquivo, argumentos);
415
- }
416
- /**
417
- * Criação de declaração "repita".
418
- * @returns Um construto do tipo Fazer
419
- */
420
- declaracaoFazer() {
421
- const simboloAtual = this.avancarEDevolverAnterior();
422
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
423
- const declaracoes = [];
424
- do {
425
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
426
- } while (![visualg_1.default.ATE, visualg_1.default.ATÉ].includes(this.simbolos[this.atual].tipo));
427
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.ATE, visualg_1.default.ATÉ)) {
428
- this.consumir(this.simbolos[this.atual].tipo, "Esperado palavra-chave 'ate' ou 'até' após declaração de bloco em instrução 'repita'.");
429
- }
430
- const condicao = this.expressao();
431
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após condição de continuidade em instrução 'repita'.");
432
- return new declaracoes_1.Fazer(this.hashArquivo, Number(simboloAtual.linha), new declaracoes_1.Bloco(this.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)), condicao);
433
- }
434
- /**
435
- * Criação de declaração "interrompa".
436
- * Em VisuAlg, "sustar" é chamada de "interrompa".
437
- * @returns Uma declaração do tipo Sustar.
438
- */
439
- declaracaoInterrompa() {
440
- const simboloAtual = this.avancarEDevolverAnterior();
441
- // TODO: Contar blocos para colocar esta condição de erro.
442
- /* if (this.blocos < 1) {
443
- this.erro(this.simbolos[this.atual - 1], "'interrompa' deve estar dentro de um laço de repetição.");
444
- } */
445
- return new declaracoes_1.Sustar(simboloAtual);
446
- }
447
- /**
448
- * Análise de uma declaração `leia()`. No VisuAlg, `leia()` aceita 1..N argumentos.
449
- * @returns Uma declaração `Leia`.
450
- */
451
- declaracaoLeia() {
452
- const simboloLeia = this.avancarEDevolverAnterior();
453
- this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
454
- const argumentos = [];
455
- do {
456
- argumentos.push(this.expressao());
457
- } while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
458
- this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
459
- this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.');
460
- return new declaracoes_1.Leia(simboloLeia, argumentos);
461
- }
462
- declaracaoPara() {
463
- const simboloPara = this.avancarEDevolverAnterior();
464
- const variavelIteracao = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
465
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.DE, visualg_1.default.SETA_ATRIBUICAO)) {
466
- throw this.erro(this.simbolos[this.atual], "Esperado palavra reservada 'de' ou seta de atribuição após variável de controle de 'para'.");
467
- }
468
- const literalOuVariavelInicio = this.adicaoOuSubtracao();
469
- this.consumir(visualg_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
470
- const literalOuVariavelFim = this.adicaoOuSubtracao();
471
- let operadorCondicao = new lexador_1.Simbolo(visualg_1.default.MENOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
472
- let operadorCondicaoIncremento = new lexador_1.Simbolo(visualg_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo);
473
- // Isso existe porque o laço `para` do VisuAlg pode ter o passo positivo ou negativo
474
- // dependendo dos operandos de início e fim, que só são possíveis de determinar
475
- // em tempo de execução.
476
- // Quando um dos operandos é uma variável, tanto a condição do laço quanto o
477
- // passo são considerados indefinidos aqui.
478
- let passo;
479
- let resolverIncrementoEmExecucao = false;
480
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PASSO)) {
481
- passo = this.unario();
482
- if (passo.hasOwnProperty('operador') && passo.operador.tipo === visualg_1.default.SUBTRACAO) {
483
- operadorCondicao = new lexador_1.Simbolo(visualg_1.default.MAIOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
484
- operadorCondicaoIncremento = new lexador_1.Simbolo(visualg_1.default.MAIOR, '', '', Number(simboloPara.linha), this.hashArquivo);
485
- }
486
- }
487
- else {
488
- if (literalOuVariavelInicio instanceof construtos_1.Literal && literalOuVariavelFim instanceof construtos_1.Literal) {
489
- if (literalOuVariavelInicio.valor > literalOuVariavelFim.valor) {
490
- passo = new construtos_1.Unario(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.SUBTRACAO, '-', undefined, simboloPara.linha, simboloPara.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1), 'ANTES');
491
- operadorCondicao = new lexador_1.Simbolo(visualg_1.default.MAIOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
492
- operadorCondicaoIncremento = new lexador_1.Simbolo(visualg_1.default.MAIOR, '', '', Number(simboloPara.linha), this.hashArquivo);
493
- }
494
- else {
495
- passo = new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1);
496
- }
497
- }
498
- else {
499
- // Passo e operador de condição precisam ser resolvidos em tempo de execução.
500
- passo = undefined;
501
- operadorCondicao = undefined;
502
- operadorCondicaoIncremento = undefined;
503
- resolverIncrementoEmExecucao = true;
504
- }
505
- }
506
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.FACA, visualg_1.default.FAÇA)) {
507
- this.consumir(this.simbolos[this.atual].tipo, "Esperado palavra reservada 'faca' ou 'faça' após valor final do laço de repetição 'para'.");
508
- }
509
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'.");
510
- const declaracoesBlocoPara = [];
511
- let simboloAtualBlocoPara = this.simbolos[this.atual];
512
- while (simboloAtualBlocoPara.tipo !== visualg_1.default.FIM_PARA) {
513
- declaracoesBlocoPara.push(this.resolverDeclaracaoForaDeBloco());
514
- simboloAtualBlocoPara = this.simbolos[this.atual];
515
- }
516
- this.consumir(visualg_1.default.FIM_PARA, '');
517
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
518
- const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
519
- const para = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha),
520
- // Inicialização.
521
- new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, literalOuVariavelInicio),
522
- // Condição.
523
- new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicao, literalOuVariavelFim),
524
- // Incremento, feito em construto especial `FimPara`.
525
- new construtos_1.FimPara(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicaoIncremento, literalOuVariavelFim), new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), passo)))), corpo);
526
- para.blocoPosExecucao = corpo;
527
- para.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
528
- return para;
529
- }
530
- logicaComumParametros() {
531
- const parametros = [];
532
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
533
- while (!this.verificarTipoSimboloAtual(visualg_1.default.PARENTESE_DIREITO)) {
534
- const dadosParametros = this.logicaComumParametroVisuAlg();
535
- const tipoDadoParametro = {
536
- nome: dadosParametros.simbolo.lexema,
537
- tipo: dadosParametros.tipo,
538
- tipoInvalido: !dadosParametros.tipo ? this.simboloAtual().lexema : null,
539
- };
540
- for (let parametro of dadosParametros.identificadores) {
541
- parametros.push({
542
- abrangencia: 'padrao',
543
- nome: parametro,
544
- referencia: dadosParametros.referencia,
545
- tipoDado: tipoDadoParametro,
546
- });
547
- }
548
- }
549
- // Consumir parêntese direito
550
- this.consumir(visualg_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito para finalização da leitura de parâmetros.');
551
- }
552
- return parametros;
553
- }
554
- /**
555
- * Procedimentos nada mais são do que funções que não retornam valor.
556
- */
557
- declaracaoProcedimento() {
558
- const simboloProcedimento = this.avancarEDevolverAnterior();
559
- const nomeProcedimento = this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome do procedimento após palavra-chave `procedimento`.');
560
- // Parâmetros
561
- const parametros = this.logicaComumParametros();
562
- const inicializacoes = this.validarSegmentoVar();
563
- this.validarSegmentoInicio('procedimento');
564
- const corpo = inicializacoes.concat(this.blocoEscopo());
565
- return new declaracoes_1.FuncaoDeclaracao(nomeProcedimento, new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloProcedimento.linha), parametros, corpo.filter((d) => d)));
566
- }
567
- declaracaoRetorna() {
568
- const simboloRetorna = this.avancarEDevolverAnterior();
569
- let valor = null;
570
- if ([
571
- visualg_1.default.CARACTER,
572
- visualg_1.default.CARACTERE,
573
- visualg_1.default.IDENTIFICADOR,
574
- visualg_1.default.NUMERO,
575
- visualg_1.default.VERDADEIRO,
576
- visualg_1.default.NEGACAO,
577
- visualg_1.default.FALSO,
578
- visualg_1.default.PARENTESE_ESQUERDO,
579
- ].includes(this.simbolos[this.atual].tipo)) {
580
- valor = this.expressao();
581
- }
582
- return new declaracoes_1.Retorna(simboloRetorna, valor);
583
- }
584
- declaracaoSe() {
585
- const simboloSe = this.avancarEDevolverAnterior();
586
- const condicao = this.expressao();
587
- if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.ENTAO, visualg_1.default.ENTÃO)) {
588
- this.consumir(this.simbolos[this.atual].tipo, "Esperado palavra reservada 'entao' ou 'então' após condição em declaração 'se'.");
589
- }
590
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'entao' em declaração 'se'.");
591
- const declaracoes = [];
592
- do {
593
- declaracoes.push(this.resolverDeclaracaoForaDeBloco());
594
- } while (![visualg_1.default.SENAO, visualg_1.default.SENÃO, visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
595
- let caminhoSenao = null;
596
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SENAO, visualg_1.default.SENÃO)) {
597
- const simboloSenao = this.simbolos[this.atual - 1];
598
- const declaracoesSenao = [];
599
- do {
600
- declaracoesSenao.push(this.resolverDeclaracaoForaDeBloco());
601
- } while (![visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
602
- caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
603
- }
604
- this.consumir(visualg_1.default.FIM_SE, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
605
- this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimse'.");
606
- return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
607
- }
608
- declaracaoAleatorio() {
609
- const simboloAleatorio = this.avancarEDevolverAnterior();
610
- let argumentos = {
611
- min: 0,
612
- max: 0,
613
- };
614
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO)) {
615
- this.consumir(visualg_1.default.VIRGULA, "Esperado ',' após declaração do primeiro número.");
616
- argumentos.min = Number(this.simboloAtual().literal);
617
- this.consumir(visualg_1.default.NUMERO, "Esperado um número após ','.");
618
- argumentos.max = Number(this.simbolos[this.atual - 1].literal);
619
- }
620
- else if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.ON)) {
621
- this.consumir(simboloAleatorio.tipo, "Esperado palavra reservada 'ON'ou 'on' ou combinação de número'(min, max)' após declaração 'aleatorio'");
622
- argumentos = null;
623
- }
624
- this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração do último número.');
625
- const decoracoes = [];
626
- do {
627
- const decoracao = this.resolverDeclaracaoForaDeBloco();
628
- if (decoracao instanceof declaracoes_1.Leia)
629
- decoracao.eParaInterromper = true;
630
- decoracoes.push(decoracao);
631
- } while (![visualg_1.default.ALEATORIO, visualg_1.default.FIM_ALGORITMO].includes(this.simbolos[this.atual].tipo));
632
- if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.ALEATORIO)) {
633
- this.consumir(visualg_1.default.OFF, "Esperado palavra reservada 'off' ou 'OFF' após declaração 'aleatorio'.");
634
- }
635
- return new declaracoes_1.Aleatorio(simboloAleatorio.linha, simboloAleatorio.hashArquivo, new declaracoes_1.Bloco(simboloAleatorio.hashArquivo, Number(simboloAleatorio.linha), decoracoes.filter((d) => d)), argumentos);
636
- }
637
- resolverDeclaracaoForaDeBloco() {
638
- const simboloAtual = this.simbolos[this.atual];
639
- switch (simboloAtual.tipo) {
640
- case visualg_1.default.ALEATORIO:
641
- return this.declaracaoAleatorio();
642
- case visualg_1.default.ENQUANTO:
643
- return this.declaracaoEnquanto();
644
- case visualg_1.default.ESCOLHA:
645
- return this.declaracaoEscolha();
646
- case visualg_1.default.ESCREVA:
647
- return this.declaracaoEscrevaMesmaLinha();
648
- case visualg_1.default.ESCREVA_LINHA:
649
- return this.declaracaoEscreva();
650
- case visualg_1.default.FUNCAO:
651
- return this.funcao('funcao');
652
- case visualg_1.default.INICIO:
653
- const simboloInicio = this.validarSegmentoInicio('algoritmo');
654
- return new inicio_algoritmo_1.InicioAlgoritmo(simboloInicio.linha, simboloInicio.hashArquivo);
655
- case visualg_1.default.INTERROMPA:
656
- return this.declaracaoInterrompa();
657
- case visualg_1.default.LEIA:
658
- return this.declaracaoLeia();
659
- case visualg_1.default.PARA:
660
- return this.declaracaoPara();
661
- case visualg_1.default.PARENTESE_DIREITO:
662
- throw new Error('Não deveria estar caindo aqui.');
663
- case visualg_1.default.PROCEDIMENTO:
664
- return this.declaracaoProcedimento();
665
- case visualg_1.default.QUEBRA_LINHA:
666
- this.avancarEDevolverAnterior();
667
- return null;
668
- case visualg_1.default.REPITA:
669
- return this.declaracaoFazer();
670
- case visualg_1.default.RETORNE:
671
- return this.declaracaoRetorna();
672
- case visualg_1.default.SE:
673
- return this.declaracaoSe();
674
- case visualg_1.default.VAR:
675
- if (this.blocoPrincipalIniciado) {
676
- throw this.erro(this.simbolos[this.atual], 'Sintaxe incorreta: início do bloco principal já foi declarado.');
677
- }
678
- return this.validarSegmentoVar();
679
- default:
680
- return new declaracoes_1.Expressao(this.expressao());
681
- }
682
- }
683
- /**
684
- * No VisuAlg, há uma determinada cadência de validação de símbolos.
685
- * - O primeiro símbolo é `algoritmo`, seguido por um identificador e
686
- * uma quebra de linha.
687
- * - Os próximos símbolo pode `var`, que pode ser seguido por uma série de
688
- * declarações de variáveis e finalizado por uma quebra de linha,
689
- * ou ainda `funcao` ou `procedimento`, seguidos dos devidos símbolos que definem
690
- * os blocos.
691
- * - O penúltimo símbolo é `inicio`, seguido por uma quebra de linha.
692
- * Pode haver ou não declarações dentro do bloco.
693
- * - O último símbolo deve ser `fimalgoritmo`, que também é usado para
694
- * definir quando não existem mais construtos a serem adicionados.
695
- * @param retornoLexador Os símbolos entendidos pelo Lexador.
696
- * @param hashArquivo Obrigatório por interface mas não usado aqui.
697
- */
698
- analisar(retornoLexador, hashArquivo) {
699
- this.erros = [];
700
- this.atual = 0;
701
- this.blocos = 0;
702
- this.blocoPrincipalIniciado = false;
703
- this.hashArquivo = hashArquivo || 0;
704
- this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
705
- while (this.verificarTipoSimboloAtual(visualg_1.default.QUEBRA_LINHA)) {
706
- this.avancarEDevolverAnterior();
707
- }
708
- let declaracoes = [];
709
- const simboloNomeAlgoritmo = this.validarSegmentoAlgoritmo();
710
- declaracoes.push(new declaracoes_1.CabecalhoPrograma(simboloNomeAlgoritmo.linha, simboloNomeAlgoritmo.hashArquivo, simboloNomeAlgoritmo.literal));
711
- while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== visualg_1.default.FIM_ALGORITMO) {
712
- const declaracao = this.resolverDeclaracaoForaDeBloco();
713
- if (Array.isArray(declaracao)) {
714
- declaracoes = declaracoes.concat(declaracao);
715
- }
716
- else {
717
- declaracoes.push(declaracao);
718
- }
719
- }
720
- const ultimoSimbolo = this.simbolos[this.simbolos.length - 1];
721
- if (ultimoSimbolo.tipo !== visualg_1.default.FIM_ALGORITMO) {
722
- throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(ultimoSimbolo, `Programa não termina com 'fimalgoritmo'. Último símbolo: '${ultimoSimbolo.lexema || ultimoSimbolo.literal}'.`);
723
- }
724
- return {
725
- declaracoes: declaracoes.filter((d) => d),
726
- erros: this.erros,
727
- };
728
- }
729
- }
730
- exports.AvaliadorSintaticoVisuAlg = AvaliadorSintaticoVisuAlg;
731
- //# sourceMappingURL=avaliador-sintatico-visualg.js.map