Skip to content

Commit f074943

Browse files
Selecionar funcional.
1 parent 1ca375c commit f074943

File tree

22 files changed

+143
-38
lines changed

22 files changed

+143
-38
lines changed

.vscode/launch.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7+
{
8+
"type": "node",
9+
"request": "launch",
10+
"name": "Execução",
11+
"skipFiles": ["<node_internals>/**", "node_modules/**"],
12+
"cwd": "${workspaceRoot}",
13+
"console": "integratedTerminal",
14+
"args": [
15+
"${workspaceFolder}${pathSeparator}execucao.ts"
16+
],
17+
"runtimeExecutable": "node",
18+
"runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"]
19+
},
720
{
821
"name": "Testes AvaliadorSintatico",
922
"type": "node",

execucao.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// import { Lincones } from './fontes/lincones';
2+
import { AvaliadorSintatico } from "./fontes/avaliador-sintatico";
3+
import { Lexador } from "./fontes/lexador";
4+
5+
// const lincones = new Lincones();
6+
const lexador = new Lexador();
7+
const avaliadorSintatico = new AvaliadorSintatico();
8+
const sentencaSelecao = 'SELECIONAR NOME, EMAIL DE clientes ONDE IDADE = 18;';
9+
const resultadoLexador = lexador.mapear([sentencaSelecao]);
10+
const teste = avaliadorSintatico.analisar(resultadoLexador);
11+
console.log(teste);

fontes/avaliador-sintatico/avaliador-sintatico-base.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,14 @@ export abstract class AvaliadorSintaticoBase
4444
}
4545

4646
verificarSeSimboloAtualEIgualA(...argumentos: string[]): boolean {
47-
for (const argumento of argumentos) {
48-
const tipoAtual = argumentos[argumento];
47+
for (let i = 0; i < argumentos.length; i++) {
48+
const tipoAtual = argumentos[i];
4949
if (this.verificarTipoSimboloAtual(tipoAtual)) {
5050
this.avancarEDevolverAnterior();
5151
return true;
5252
}
5353
}
54+
5455
return false;
5556
}
5657
}

fontes/avaliador-sintatico/avaliador-sintatico.ts

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Criar, Declaracao } from '../declaracoes';
1+
import { Condicao } from '../construtos';
2+
import { Criar, Comando, Selecionar } from '../comandos';
23
import {
34
RetornoAvaliadorSintatico,
45
RetornoLexador
@@ -8,9 +9,11 @@ import { AvaliadorSintaticoBase } from './avaliador-sintatico-base';
89
import { InformacoesColuna } from './informacaoColuna';
910

1011
export class AvaliadorSintatico extends AvaliadorSintaticoBase {
11-
private logicaColunas(): InformacoesColuna {
12-
12+
private avancar(): void {
13+
this.atual++;
14+
}
1315

16+
private logicaColunas(): InformacoesColuna {
1417
return null;
1518
}
1619

@@ -42,15 +45,68 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
4245
}
4346
}
4447

45-
private avancar(): void {
46-
this.avancar();
47-
this.atual++;
48+
private declaracaoSelecionar() {
49+
// Essa linha nunca deve retornar erro.
50+
this.consumir(tiposDeSimbolos.SELECIONAR, 'Esperado palavra reservada "SELECIONAR".')
51+
52+
// Colunas
53+
let tudo = false;
54+
const colunas = [];
55+
if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.TUDO)) {
56+
tudo = true;
57+
} else {
58+
do {
59+
colunas.push(this.simbolos[this.atual].lexema);
60+
this.avancar();
61+
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA))
62+
}
63+
64+
// De
65+
this.consumir(tiposDeSimbolos.DE, 'Esperado palavra reservada "de" após definição das colunas em comando de seleção.');
66+
const nomeTabela = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome de coluna ou literal em condição de seleção.');
67+
68+
// Condições
69+
const condicoes = [];
70+
if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ONDE)) {
71+
do {
72+
const esquerda = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome de coluna ou literal em condição de seleção.');
73+
if (![
74+
tiposDeSimbolos.IGUAL,
75+
tiposDeSimbolos.MAIOR,
76+
tiposDeSimbolos.MAIOR_IGUAL,
77+
tiposDeSimbolos.MENOR,
78+
tiposDeSimbolos.MENOR_IGUAL
79+
].includes(this.simbolos[this.atual].tipo)) {
80+
throw this.erro(this.simbolos[this.atual], 'Esperado operador válido após identificador em condição de seleção.');
81+
}
82+
83+
const operador = this.simbolos[this.atual].tipo;
84+
this.avancar();
85+
86+
if (![
87+
tiposDeSimbolos.IDENTIFICADOR,
88+
tiposDeSimbolos.NUMERO,
89+
tiposDeSimbolos.TEXTO
90+
].includes(this.simbolos[this.atual].tipo)) {
91+
throw this.erro(this.simbolos[this.atual], 'Esperado operador válido após identificador em condição de seleção.');
92+
}
93+
94+
const direita = this.simbolos[this.atual];
95+
this.avancar();
96+
97+
condicoes.push(new Condicao(esquerda, operador, direita.literal || direita.lexema));
98+
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.E));
99+
}
100+
101+
return new Selecionar(-1, nomeTabela.lexema, colunas, condicoes, tudo);
48102
}
49103

50104
private declaracao() {
51105
switch (this.simbolos[this.atual].tipo) {
52106
case tiposDeSimbolos.CRIAR:
53107
return this.declaracaoCriar();
108+
case tiposDeSimbolos.SELECIONAR:
109+
return this.declaracaoSelecionar();
54110
default:
55111
this.avancar();
56112
return null;
@@ -63,7 +119,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
63119
this.bloco = 0;
64120
this.simbolos = retornoLexador?.simbolos || [];
65121

66-
const declaracoes: Declaracao[] = [];
122+
const declaracoes: Comando[] = [];
67123
while (!this.estaNoFinal()) {
68124
declaracoes.push(this.declaracao());
69125
}

fontes/declaracoes/atualizar.ts renamed to fontes/comandos/atualizar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Declaracao } from "./declaracao";
1+
import { Comando } from "./comando";
22

3-
export class Atualizar extends Declaracao {
3+
export class Atualizar extends Comando {
44
tabela: string;
55
colunasEValores: any[];
66
condicoes: any[];

fontes/declaracoes/declaracao.ts renamed to fontes/comandos/comando.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export class Declaracao {
1+
export class Comando {
22
linha: number;
33
assinaturaMetodo: string;
44

fontes/declaracoes/criar.ts renamed to fontes/comandos/criar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { InformacoesColuna } from '../avaliador-sintatico';
2-
import { Declaracao } from './declaracao';
2+
import { Comando } from './comando';
33

4-
export class Criar extends Declaracao {
4+
export class Criar extends Comando {
55
public tabela: string;
66
public colunas: InformacoesColuna[];
77
constructor(linha: number, tabela: string, colunas: InformacoesColuna[]) {

fontes/declaracoes/excluir.ts renamed to fontes/comandos/excluir.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Declaracao } from "./declaracao";
1+
import { Comando } from "./comando";
22

3-
export class Excluir extends Declaracao {
3+
export class Excluir extends Comando {
44
tabela: string;
55
condicoes: any[];
66

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export * from './atualizar';
2+
export * from './comando';
23
export * from './criar';
3-
export { Declaracao } from './declaracao';
44
export * from './excluir';
55
export * from './inserir';
66
export * from './selecionar';

fontes/declaracoes/inserir.ts renamed to fontes/comandos/inserir.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Declaracao } from "./declaracao";
1+
import { Comando } from "./comando";
22

3-
export class Inserir extends Declaracao {
3+
export class Inserir extends Comando {
44
tabela: string;
55
colunas: string[];
66
valores: any[];

0 commit comments

Comments
 (0)