@designliquido/foles
Version:
Linguagem de folhas de estilo para documentos em geral em português
201 lines • 6.49 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.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