UNPKG

@designliquido/foles

Version:

Linguagem de folhas de estilo para documentos em geral em português

201 lines 6.49 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.LexadorReverso = void 0; const simbolo_1 = require("./simbolo"); const css_1 = __importDefault(require("./palavras-reservadas/css")); const css_2 = __importDefault(require("../tipos-de-simbolos/css")); class LexadorReverso { constructor() { this.codigo = [""]; this.simbolos = []; this.erros = []; this.atual = 0; this.linha = 0; this.inicioSimbolo = 0; } /** * Indica se o código está na última linha. * @returns Verdadeiro se contador de linhas está na última linha. * Falso caso contrário. */ eUltimaLinha() { return this.linha >= this.codigo.length - 1; } eFinalDoCodigo() { return (this.eUltimaLinha() && this.codigo[this.codigo.length - 1].length <= this.atual); } eFinalDaLinha() { if (this.codigo.length === this.linha) { return true; } return this.atual >= this.codigo[this.linha].length; } simboloAtual() { if (this.eFinalDaLinha()) return "\0"; return this.codigo[this.linha].charAt(this.atual); } eDigito(caractere) { return caractere >= "0" && caractere <= "9"; } proximoSimbolo() { return this.codigo[this.linha].charAt(this.atual + 1); } eAlfabeto(caractere) { const acentuacoes = [ "á", "Á", "ã", "Ã", "â", "Â", "à", "À", "é", "É", "ê", "Ê", "í", "Í", "ó", "Ó", "õ", "Õ", "ô", "Ô", "ú", "Ú", "ç", "Ç", "_", "-", ]; return ((caractere >= "a" && caractere <= "z") || (caractere >= "A" && caractere <= "Z") || acentuacoes.includes(caractere)); } eAlfabetoOuDigito(caractere) { return this.eDigito(caractere) || this.eAlfabeto(caractere); } avancar() { this.atual += 1; if (this.eFinalDaLinha() && !this.eUltimaLinha()) { this.linha++; this.atual = 0; } } identificarPalavraChave() { while (this.eAlfabetoOuDigito(this.simboloAtual())) { this.avancar(); } const codigo = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual); const tipo = codigo in css_1.default ? css_1.default[codigo] : css_2.default.IDENTIFICADOR; this.adicionarSimbolo(tipo); } adicionarSimbolo(tipo, literal = null, lexema = null) { const texto = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual); this.simbolos.push(new simbolo_1.Simbolo(tipo, texto || lexema, literal, this.linha + 1, this.inicioSimbolo + 1, this.atual)); } analisarNumero() { while (this.eDigito(this.simboloAtual())) { this.avancar(); } if (this.simboloAtual() == "." && this.eDigito(this.proximoSimbolo())) { this.avancar(); while (this.eDigito(this.simboloAtual())) { this.avancar(); } } const numeroCompleto = this.codigo[this.linha].substring(this.inicioSimbolo, this.atual); this.adicionarSimbolo(css_2.default.NUMERO, parseFloat(numeroCompleto)); } analisarToken() { const caractere = this.simboloAtual(); switch (caractere) { case "{": this.adicionarSimbolo(css_2.default.CHAVE_ESQUERDA); this.avancar(); break; case "}": this.adicionarSimbolo(css_2.default.CHAVE_DIREITA); this.avancar(); break; case "(": this.adicionarSimbolo(css_2.default.PARENTESE_ESQUERDO); this.avancar(); break; case ")": this.adicionarSimbolo(css_2.default.PARENTESE_DIREITO); this.avancar(); break; case ":": this.adicionarSimbolo(css_2.default.DOIS_PONTOS); this.avancar(); break; case ";": this.adicionarSimbolo(css_2.default.PONTO_E_VIRGULA); this.avancar(); break; case "%": this.adicionarSimbolo(css_2.default.QUANTIFICADOR, null, "%"); this.avancar(); break; case ",": this.adicionarSimbolo(css_2.default.VIRGULA, null, ","); this.avancar(); break; case ".": this.adicionarSimbolo(css_2.default.PONTO, null, "."); this.avancar(); break; case "#": this.adicionarSimbolo(css_2.default.CERQUILHA, null, "#"); this.avancar(); break; case " ": case "\0": case "\r": case "\t": case ";": this.avancar(); break; default: if (this.eDigito(caractere)) this.analisarNumero(); else if (this.eAlfabeto(caractere)) this.identificarPalavraChave(); else { this.erros.push({ linha: this.linha + 1, caractere: caractere, mensagem: "Caractere inesperado.", }); this.avancar(); } } } mapear(codigo) { this.atual = 0; this.linha = 0; this.inicioSimbolo = 0; this.erros = []; this.simbolos = []; this.codigo = codigo || [""]; while (!this.eFinalDoCodigo()) { this.inicioSimbolo = this.atual; this.analisarToken(); } return { simbolos: this.simbolos, erros: this.erros, }; } } exports.LexadorReverso = LexadorReverso; //# sourceMappingURL=lexador-reverso.js.map