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' ;
32import {
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
1110export 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 ;
0 commit comments