UNPKG

@designliquido/lincones-mysql

Version:
160 lines 8.48 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AvaliadorSintatico = void 0; const comandos_1 = require("../comum/fontes/comandos"); const avaliador_sintatico_base_1 = require("../comum/fontes/avaliador-sintatico/avaliador-sintatico-base"); const coluna_1 = require("../comum/fontes/construtos/coluna"); const tipos_de_simbolos_1 = __importDefault(require("../comum/fontes/tipos-de-simbolos")); class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase { comandoCriacaoColuna() { // Nome const nomeDaColuna = this.consumir(tipos_de_simbolos_1.default.IDENTIFICADOR, 'Esperado identificador de nome de coluna em comando de criação de tabela.'); // Tipo de dados let tipoColuna = null; let tamanhoColuna = null; switch (this.simbolos[this.atual].tipo) { case tipos_de_simbolos_1.default.INTEIRO: tipoColuna = tipos_de_simbolos_1.default.INTEIRO; this.avancar(); break; case tipos_de_simbolos_1.default.LOGICO: tipoColuna = tipos_de_simbolos_1.default.LOGICO; this.avancar(); break; case tipos_de_simbolos_1.default.TEXTO: tipoColuna = tipos_de_simbolos_1.default.TEXTO; this.avancar(); if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.PARENTESE_ESQUERDO)) { tamanhoColuna = this.consumir(tipos_de_simbolos_1.default.NUMERO, 'Esperado tamanho de texto de coluna em comando de criação de tabela.'); this.consumir(tipos_de_simbolos_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após declaração de tamanho de coluna em comando de criação de tabela.'); } break; default: throw this.erro(this.simbolos[this.atual], 'Esperado tipo de dados válido na definição de coluna em comando de criação de tabela.'); } // Nulo/Não Nulo let nulo = true; if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.NAO, tipos_de_simbolos_1.default.NULO)) { const simboloAnterior = this.simbolos[this.atual - 1]; switch (simboloAnterior.tipo) { case tipos_de_simbolos_1.default.NAO: this.consumir(tipos_de_simbolos_1.default.NULO, 'Esperado palavra reservada "NULO" após palavra reservada "NÃO" em declaração de coluna em comando de criação de tabela.'); nulo = false; break; case tipos_de_simbolos_1.default.NULO: default: break; } } // Chave primária? let chavePrimaria = false; let autoIncremento = false; if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.CHAVE)) { switch (this.simbolos[this.atual].tipo) { case tipos_de_simbolos_1.default.PRIMARIA: chavePrimaria = true; this.avancar(); if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.AUTO)) { this.consumir(tipos_de_simbolos_1.default.INCREMENTO, 'Esperado palavra reservada "INCREMENTO" após palavra reservada "AUTO" em declaração de coluna em comando de criação de tabela.'); autoIncremento = true; } break; default: throw this.erro(this.simbolos[this.atual], 'Esperado palavra reservada "PRIMARIA" após palavra reservada "CHAVE" na definição de coluna em comando de criação de tabela.'); } } return new coluna_1.Coluna(nomeDaColuna.lexema, tipoColuna, tamanhoColuna, nulo, chavePrimaria, false); } comandoCriar() { // Essa linha nunca deve retornar erro. this.consumir(tipos_de_simbolos_1.default.CRIAR, 'Esperado palavra reservada "CRIAR".'); switch (this.simbolos[this.atual].tipo) { case 'TABELA': default: return this.comandoCriarTabela(); } } comandoCriarTabela() { // Essa linha nunca deve retornar erro. this.consumir(tipos_de_simbolos_1.default.TABELA, 'Esperado palavra reservada "TABELA".'); const nomeDaTabela = this.consumir(tipos_de_simbolos_1.default.IDENTIFICADOR, 'Esperado identificador de nome de tabela após palavra reservada "TABELA".'); this.consumir(tipos_de_simbolos_1.default.PARENTESE_ESQUERDO, 'Esperado abertura de parênteses após nome da tabela'); const colunas = []; do { colunas.push(this.comandoCriacaoColuna()); } while (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.VIRGULA)); this.consumir(tipos_de_simbolos_1.default.PARENTESE_DIREITO, 'Esperado fechamento de parênteses após nome da tabela'); // Ponto-e-vírgula opcional. // TODO: trazer isso mais tarde. // this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PONTO_VIRGULA); return new comandos_1.Criar(this.simbolos[this.atual].linha, nomeDaTabela.lexema, colunas); } comandoExcluir() { // Essa linha nunca deve retornar erro. const simboloExcluir = this.consumir(tipos_de_simbolos_1.default.EXCLUIR, 'Esperado palavra reservada "EXCLUIR".'); const nomeDaTabela = this.consumir(tipos_de_simbolos_1.default.IDENTIFICADOR, 'Esperado identificador de nome de tabela após palavra reservada "TABELA".'); const condicoes = this.logicaComumCondicoes('exclusão'); this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.PONTO_VIRGULA); return new comandos_1.Excluir(-1, nomeDaTabela.lexema, condicoes); } comandoSelecionar() { // Essa linha nunca deve retornar erro. this.consumir(tipos_de_simbolos_1.default.SELECIONAR, 'Esperado palavra reservada "SELECIONAR".'); // Colunas let tudo = false; const colunas = []; if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.TUDO)) { tudo = true; } else { do { colunas.push(this.simbolos[this.atual].lexema); this.avancar(); } while (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.VIRGULA)); } // De this.consumir(tipos_de_simbolos_1.default.DE, 'Esperado palavra reservada "de" após definição das colunas em comando de seleção.'); const nomeTabela = this.consumir(tipos_de_simbolos_1.default.IDENTIFICADOR, 'Esperado nome de coluna ou literal em condição de seleção.'); // Condições const condicoes = this.logicaComumCondicoes('seleção'); // Ponto-e-vírgula opcional. this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.PONTO_VIRGULA); return new comandos_1.Selecionar(-1, nomeTabela.lexema, colunas, condicoes, tudo); } declaracao() { switch (this.simbolos[this.atual].tipo) { case tipos_de_simbolos_1.default.ATUALIZAR: return this.comandoAtualizar(); case tipos_de_simbolos_1.default.CRIAR: return this.comandoCriar(); case tipos_de_simbolos_1.default.EXCLUIR: return this.comandoExcluir(); case tipos_de_simbolos_1.default.INSERIR: return this.comandoInserir(); case tipos_de_simbolos_1.default.SELECIONAR: return this.comandoSelecionar(); default: this.avancar(); return null; } } analisar(retornoLexador) { this.erros = []; this.atual = 0; this.bloco = 0; this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || []; const declaracoes = []; while (!this.estaNoFinal()) { declaracoes.push(this.declaracao()); } return { comandos: declaracoes, erros: this.erros }; } } exports.AvaliadorSintatico = AvaliadorSintatico; //# sourceMappingURL=avaliador-sintatico.js.map