Skip to content

Commit cd4b5bc

Browse files
Remoção de um Lexador dedicado. Usando o do lincones-js.
1 parent 1ff116e commit cd4b5bc

File tree

4 files changed

+15
-449
lines changed

4 files changed

+15
-449
lines changed

fontes/avaliador-sintatico/avaliador-sintatico.ts

Lines changed: 11 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,14 @@
1-
import { Condicao } from '../../comum/fontes/construtos';
2-
import { Criar, Comando, Selecionar, Atualizar, Inserir, Excluir } from '../../comum/fontes/comandos';
1+
import { Criar, Comando, Excluir } from '../comum/fontes/comandos';
32
import {
43
RetornoAvaliadorSintatico,
54
RetornoLexador
6-
} from '../../comum/fontes/interfaces/retornos';
7-
import tiposDeSimbolos from '../../comum/fontes/tipos-de-simbolos';
8-
import { AvaliadorSintaticoBase } from '../../comum/fontes/avaliador-sintatico/avaliador-sintatico-base';
9-
import { Coluna } from '../../comum/fontes/construtos/coluna';
5+
} from '../comum/fontes/interfaces/retornos';
6+
import tiposDeSimbolos from '../comum/fontes/tipos-de-simbolos';
7+
import { AvaliadorSintaticoBase } from '../comum/fontes/avaliador-sintatico/avaliador-sintatico-base';
8+
import { Coluna } from '../comum/fontes/construtos/coluna';
109

1110
export class AvaliadorSintatico extends AvaliadorSintaticoBase {
12-
private avancar(): void {
13-
if (!this.estaNoFinal()) {
14-
this.atual++;
15-
}
16-
}
17-
18-
private comandoAtualizar(): Atualizar {
19-
// Essa linha nunca deve retornar erro.
20-
this.consumir(tiposDeSimbolos.ATUALIZAR, 'Esperado palavra reservada "ATUALIZAR".');
21-
22-
const nomeDaTabela = this.consumir(tiposDeSimbolos.IDENTIFICADOR,
23-
'Esperado identificador de nome de tabela após palavra reservada "ATUALIZAR".');
24-
25-
this.consumir(tiposDeSimbolos.DEFINIR, 'Esperado palavra reservada "DEFINIR". após palavra reservada "ATUALIZAR".');
26-
27-
// Relação de colunas para atualização
28-
const colunasAtualizacao = []
29-
do {
30-
const esquerda = this.consumir(tiposDeSimbolos.IDENTIFICADOR, `Esperado nome de coluna ou literal em descrição de atualização.`);
31-
this.consumir(tiposDeSimbolos.IGUAL, 'Esperado operador válido após identificador em descrição de atualização.');
32-
33-
if (![
34-
tiposDeSimbolos.IDENTIFICADOR,
35-
tiposDeSimbolos.NUMERO,
36-
tiposDeSimbolos.TEXTO,
37-
tiposDeSimbolos.VERDADEIRO,
38-
tiposDeSimbolos.FALSO
39-
].includes(this.simbolos[this.atual].tipo)) {
40-
throw this.erro(this.simbolos[this.atual], `Esperado operador válido após identificador em descrição de atualização.`);
41-
}
42-
43-
const direita = this.simbolos[this.atual];
44-
this.avancar();
45-
colunasAtualizacao.push({
46-
esquerda,
47-
direita
48-
});
49-
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
50-
51-
// Condições
52-
const condicoes = this.logicaComumCondicoes('seleção');
53-
54-
return new Atualizar(-1, nomeDaTabela.lexema, colunasAtualizacao, condicoes);
55-
}
56-
57-
private comandoCriacaoColuna(): Coluna {
11+
override comandoCriacaoColuna(): Coluna {
5812
// Nome
5913
const nomeDaColuna = this.consumir(tiposDeSimbolos.IDENTIFICADOR,
6014
'Esperado identificador de nome de coluna em comando de criação de tabela.');
@@ -126,7 +80,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
12680
return new Coluna(nomeDaColuna.lexema, tipoColuna, tamanhoColuna, nulo, chavePrimaria, false);
12781
}
12882

129-
private comandoCriar(): Criar {
83+
override comandoCriar(): Criar {
13084
// Essa linha nunca deve retornar erro.
13185
this.consumir(tiposDeSimbolos.CRIAR, 'Esperado palavra reservada "CRIAR".');
13286

@@ -137,7 +91,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
13791
}
13892
}
13993

140-
private comandoCriarTabela() {
94+
override comandoCriarTabela() {
14195
// Essa linha nunca deve retornar erro.
14296
this.consumir(tiposDeSimbolos.TABELA, 'Esperado palavra reservada "TABELA".');
14397

@@ -168,7 +122,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
168122
);
169123
}
170124

171-
private comandoExcluir() {
125+
override comandoExcluir() {
172126
// Essa linha nunca deve retornar erro.
173127
const simboloExcluir = this.consumir(tiposDeSimbolos.EXCLUIR, 'Esperado palavra reservada "EXCLUIR".');
174128

@@ -182,126 +136,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
182136
return new Excluir(-1, nomeDaTabela.lexema, condicoes);
183137
}
184138

185-
private comandoInserir(): Inserir {
186-
// Essa linha nunca deve retornar erro.
187-
const simboloInserir = this.consumir(tiposDeSimbolos.INSERIR, 'Esperado palavra reservada "INSERIR".');
188-
189-
this.consumir(tiposDeSimbolos.EM, 'Esperado palavra reservada "EM" após palavra reservada "INSERIR".');
190-
191-
const nomeDaTabela = this.consumir(tiposDeSimbolos.IDENTIFICADOR,
192-
'Esperado identificador de nome de tabela após palavra reservada "EM" em declaração "INSERIR".');
193-
194-
// Colunas
195-
this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO,
196-
'Esperado abertura de parênteses após identificador de nome de tabela em comando "INSERIR".');
197-
const colunas = [];
198-
do {
199-
const nomeDaColuna = this.consumir(tiposDeSimbolos.IDENTIFICADOR,
200-
'Esperado identificador de nome de coluna após identificador de nome de tabela em comando "INSERIR".');
201-
colunas.push(nomeDaColuna.lexema);
202-
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
203-
204-
this.consumir(tiposDeSimbolos.PARENTESE_DIREITO,
205-
'Esperado fechamento de parênteses após declaração de colunas em comando "INSERIR".');
206-
this.consumir(tiposDeSimbolos.VALORES,
207-
'Esperado palavra reservada "VALORES" após primeiro fechamento de parênteses em comando "INSERIR".');
208-
this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO,
209-
'Esperado abertura de parênteses após palavra reservada "VALORES" em comando "INSERIR".');
210-
211-
// Valores
212-
const valores = [];
213-
do {
214-
if (![
215-
tiposDeSimbolos.IDENTIFICADOR,
216-
tiposDeSimbolos.NUMERO,
217-
tiposDeSimbolos.TEXTO,
218-
tiposDeSimbolos.VERDADEIRO,
219-
tiposDeSimbolos.FALSO
220-
].includes(this.simbolos[this.atual].tipo)) {
221-
throw this.erro(this.simbolos[this.atual], `Esperado valor válido para inserção em comando "INSERIR".`);
222-
}
223-
224-
valores.push(this.simbolos[this.atual]);
225-
this.avancar();
226-
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
227-
228-
this.consumir(tiposDeSimbolos.PARENTESE_DIREITO,
229-
'Esperado fechamento de parênteses após declaração de valores em comando "INSERIR".');
230-
231-
if (valores.length !== colunas.length) {
232-
throw this.erro(simboloInserir,
233-
'Número de colunas não correspondente ao número de valores em comando "INSERIR".');
234-
}
235-
236-
return new Inserir(-1, nomeDaTabela.lexema, colunas, valores);
237-
}
238-
239-
private logicaComumCondicoes(operacao: string): Condicao[] {
240-
const condicoes: Condicao[] = [];
241-
if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ONDE)) {
242-
do {
243-
const esquerda = this.consumir(tiposDeSimbolos.IDENTIFICADOR, `Esperado nome de coluna ou literal em condição de ${operacao}.`);
244-
if (![
245-
tiposDeSimbolos.IGUAL,
246-
tiposDeSimbolos.MAIOR,
247-
tiposDeSimbolos.MAIOR_IGUAL,
248-
tiposDeSimbolos.MENOR,
249-
tiposDeSimbolos.MENOR_IGUAL
250-
].includes(this.simbolos[this.atual].tipo)) {
251-
throw this.erro(this.simbolos[this.atual], `Esperado operador válido após identificador em condição de ${operacao}.`);
252-
}
253-
254-
const operador = this.simbolos[this.atual].tipo;
255-
this.avancar();
256-
257-
if (![
258-
tiposDeSimbolos.IDENTIFICADOR,
259-
tiposDeSimbolos.NUMERO,
260-
tiposDeSimbolos.TEXTO
261-
].includes(this.simbolos[this.atual].tipo)) {
262-
throw this.erro(this.simbolos[this.atual], `Esperado operador válido após identificador em condição de ${operacao}.`);
263-
}
264-
265-
const direita = this.simbolos[this.atual];
266-
this.avancar();
267-
268-
condicoes.push(new Condicao(esquerda, operador, direita.literal || direita.lexema));
269-
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.E));
270-
}
271-
272-
return condicoes;
273-
}
274-
275-
private comandoSelecionar() {
276-
// Essa linha nunca deve retornar erro.
277-
this.consumir(tiposDeSimbolos.SELECIONAR, 'Esperado palavra reservada "SELECIONAR".');
278-
279-
// Colunas
280-
let tudo = false;
281-
const colunas = [];
282-
if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.TUDO)) {
283-
tudo = true;
284-
} else {
285-
do {
286-
colunas.push(this.simbolos[this.atual].lexema);
287-
this.avancar();
288-
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA))
289-
}
290-
291-
// De
292-
this.consumir(tiposDeSimbolos.DE, 'Esperado palavra reservada "de" após definição das colunas em comando de seleção.');
293-
const nomeTabela = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome de coluna ou literal em condição de seleção.');
294-
295-
// Condições
296-
const condicoes = this.logicaComumCondicoes('seleção');
297-
298-
// Ponto-e-vírgula opcional.
299-
this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PONTO_VIRGULA);
300-
301-
return new Selecionar(-1, nomeTabela.lexema, colunas, condicoes, tudo);
302-
}
303-
304-
private declaracao() {
139+
override declaracao() {
305140
switch (this.simbolos[this.atual].tipo) {
306141
case tiposDeSimbolos.ATUALIZAR:
307142
return this.comandoAtualizar();
@@ -319,7 +154,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
319154
}
320155
}
321156

322-
public analisar(retornoLexador: RetornoLexador): RetornoAvaliadorSintatico {
157+
analisar(retornoLexador: RetornoLexador): RetornoAvaliadorSintatico {
323158
this.erros = [];
324159
this.atual = 0;
325160
this.bloco = 0;

fontes/comum

0 commit comments

Comments
 (0)