@designliquido/lincones-sqlite
Version:
Implementação de LinConEs para SQLite.
65 lines • 3.38 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 tipos_de_simbolos_1 = __importDefault(require("../comum/fontes/tipos-de-simbolos"));
class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
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;
}
}
comandoCriar() {
// Essa linha nunca deve retornar erro.
this.consumir(tipos_de_simbolos_1.default.CRIAR, 'Esperado palavra reservada "CRIAR".');
// Essa linha nunca deve retornar erro.
const simboloTabela = this.consumir(tipos_de_simbolos_1.default.TABELA, 'Esperado palavra reservada "TABELA".');
let seNaoExistir = false;
if (this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.SE)) {
this.consumir(tipos_de_simbolos_1.default.NAO, 'Esperado palavra reservada "NÃO" após palavra reservada "SE".');
this.consumir(tipos_de_simbolos_1.default.EXISTIR, 'Esperado palavra reservada "EXISTIR" após palavra reservada "NÃO".');
seNaoExistir = true;
}
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');
this.verificarSeSimboloAtualEIgualA(tipos_de_simbolos_1.default.PONTO_VIRGULA);
return new comandos_1.Criar(simboloTabela.linha, nomeDaTabela.lexema, colunas, seNaoExistir);
}
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