@designliquido/lincones-mysql
Version:
Implementação de LinConEs para MySQL.
160 lines • 8.48 kB
JavaScript
"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