@designliquido/foles
Version:
Linguagem de folhas de estilo para documentos em geral em português
1,336 lines • 80 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.AvaliadorSintaticoReverso = void 0;
const declaracoes_1 = require("../declaracoes");
const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
const seletor_reverso_modificador_1 = require("../modificadores/superclasse/seletor-reverso-modificador");
const seletor_estruturas_html_1 = require("../estruturas/seletor-estruturas-html");
const css_1 = __importDefault(require("../tipos-de-simbolos/css"));
const seletores_1 = require("../seletores");
const hexadecimal_cor_1 = require("../valores/metodos/foles/hexadecimal-cor");
const seletor_valor_reverso_1 = require("../valores/seletor-valor-reverso");
const valores_1 = require("../valores");
const referencia_variavel_1 = require("../valores/referencia-variavel");
const gerais_1 = require("../modificadores/atributos/gerais");
const valores_personalizados_1 = require("../listas/valores-personalizados");
/**
* O avaliador sintático reverso avalia símbolos de arquivos CSS,
* transformando-os em estruturas de alto nível prontas para
* serem traduzidas para FolEs.
*/
class AvaliadorSintaticoReverso {
constructor(importador) {
this.importador = importador;
this.simbolos = [];
}
erro(simbolo, mensagemDeErro) {
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(simbolo, mensagemDeErro);
this.erros.push(excecao);
return excecao;
}
estaNoFinal() {
return this.atual === this.simbolos.length;
}
avancarEDevolverAnterior() {
if (!this.estaNoFinal())
this.atual += 1;
return this.simbolos[this.atual - 1];
}
verificarTipoSimboloAtual(tipo) {
if (this.estaNoFinal())
return false;
return this.simbolos[this.atual].tipo === tipo;
}
consumir(tipo, mensagemDeErro) {
if (this.verificarTipoSimboloAtual(tipo))
return this.avancarEDevolverAnterior();
throw this.erro(this.simbolos[this.atual], mensagemDeErro);
}
declaracaoPorSeletor() {
// TODO: Pensar lógica para seletor de classes.
this.avancarEDevolverAnterior();
return null;
}
resolverPseudoclasse() {
let pseudoclasse;
// TODO: Validar pseudoclasse.
if (this.verificarTipoSimboloAtual(css_1.default.DOIS_PONTOS)) {
this.avancarEDevolverAnterior();
pseudoclasse = this.consumir(css_1.default.IDENTIFICADOR, "Esperado nome de pseudoclasse.");
}
return pseudoclasse;
}
seletorPorEstrutura() {
const simboloSeletor = this.avancarEDevolverAnterior();
const pseudoclasse = this.resolverPseudoclasse();
return new seletores_1.SeletorEstrutura(new seletor_estruturas_html_1.SeletorEstruturasHtml(simboloSeletor.lexema, {
linha: simboloSeletor.linha,
colunaInicial: simboloSeletor.colunaInicial,
colunaFinal: simboloSeletor.colunaFinal,
}), pseudoclasse);
}
seletorPorId() {
this.atual += 1;
const simboloSeletor = this.avancarEDevolverAnterior();
const pseudoclasse = this.resolverPseudoclasse();
return new seletores_1.SeletorId(simboloSeletor.lexema, pseudoclasse, {
linha: simboloSeletor.linha,
colunaInicial: simboloSeletor.colunaInicial,
colunaFinal: simboloSeletor.colunaFinal,
});
}
seletorPorNomeDeClasse() {
this.atual += 1;
const simboloSeletor = this.avancarEDevolverAnterior();
const pseudoclasse = this.resolverPseudoclasse();
return new seletores_1.SeletorClasse(simboloSeletor.lexema, pseudoclasse, {
linha: simboloSeletor.linha,
colunaInicial: simboloSeletor.colunaInicial,
colunaFinal: simboloSeletor.colunaFinal,
});
}
/**
* Resolve os seletores. Por enquanto resolve apenas um seletor por vez.
* @param espacoReservado
*/
resolverSeletores(espacoReservado = null) {
const seletores = [];
do {
switch (this.simbolos[this.atual].tipo) {
case css_1.default.TAG:
seletores.push(this.seletorPorEstrutura());
break;
case css_1.default.PONTO:
seletores.push(this.seletorPorNomeDeClasse());
break;
case css_1.default.CERQUILHA:
seletores.push(this.seletorPorId());
break;
case css_1.default.IDENTIFICADOR:
throw new Error("Não deveria cair aqui.");
}
} while (this.simbolos[this.atual].tipo === css_1.default.VIRGULA);
return seletores;
}
resolverCor() {
const codigoCor = this.avancarEDevolverAnterior();
return new hexadecimal_cor_1.HexadecimalCor(codigoCor.lexema);
}
// TODO: Implementar lógica para resolver método
resolverMetodo(lexema) {
switch (lexema) {
case "annotation":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'annotation'.");
const valorAnotacao = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método annotation.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorAnotacao]);
case "blur":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'blur'.");
const valorBorrar = this.avancarEDevolverAnterior();
let quantificadorBorrar;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorBorrar = this.avancarEDevolverAnterior();
}
else {
quantificadorBorrar = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'blur'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorBorrar, quantificadorBorrar]);
case "brightness":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'brightness'.");
const valorBrilho = this.avancarEDevolverAnterior();
let quantificadorBrilho;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorBrilho = this.avancarEDevolverAnterior();
}
else {
quantificadorBrilho = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'brightness'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorBrilho, quantificadorBrilho]);
case "calc":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'calc'.");
const valorCalc1 = this.avancarEDevolverAnterior();
const quantificadorCalc1 = this.avancarEDevolverAnterior();
const operadorCalc = this.avancarEDevolverAnterior();
const valorCalc2 = this.avancarEDevolverAnterior();
const quantificadorCalc2 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'calc'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorCalc1,
quantificadorCalc1,
operadorCalc,
valorCalc2,
quantificadorCalc2,
]);
case "character-variant":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'character-variant'.");
const valorVariarCaractere = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método character-variant.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorVariarCaractere]);
case "circle":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'circle'.");
let arrayValoresCircular = [];
const valorCircular = this.avancarEDevolverAnterior();
arrayValoresCircular.push(valorCircular);
let quantificadorCircular = null;
if (this.simbolos[this.atual].tipo === 'QUANTIFICADOR') {
quantificadorCircular = this.avancarEDevolverAnterior();
arrayValoresCircular.push(quantificadorCircular);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'circle'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresCircular]);
case "clamp":
{
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'clamp'.");
const valorMin = this.avancarEDevolverAnterior();
const quantificadorMin = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'clamp'.");
const valorMed = this.avancarEDevolverAnterior();
const quantificadorMed = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método 'clamp'.");
const valorMax = this.avancarEDevolverAnterior();
const quantificadorMax = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método clamp.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorMin,
quantificadorMin,
valorMed,
quantificadorMed,
valorMax,
quantificadorMax,
]);
}
;
case "conic-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'conic-gradient'.");
const arrayGradienteConico = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorGradienteConico = this.avancarEDevolverAnterior();
arrayGradienteConico.push(proximoValorGradienteConico);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'conic-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayGradienteConico]);
case "contrast":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'contrast'.");
const valorContraste = this.avancarEDevolverAnterior();
let quantificadorContraste;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorContraste = this.avancarEDevolverAnterior();
}
else {
quantificadorContraste = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'contrast'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorContraste,
quantificadorContraste,
]);
case "counter":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'counter'.");
const nomeCounter = this.avancarEDevolverAnterior();
let estiloCounter = null;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperada vírgula após primeiro parâmetro do método 'counter'.");
estiloCounter = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'counter'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
nomeCounter,
estiloCounter,
]);
case "cross-fade":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'cross-fade'.");
const arrayGradienteTransicao1 = [];
while (this.simbolos[this.atual].tipo !== 'PONTO_E_VIRGULA') {
const proximoValorTransicao1 = this.avancarEDevolverAnterior();
arrayGradienteTransicao1.push(proximoValorTransicao1);
}
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayGradienteTransicao1]);
case "cubic-bezier":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'cubic-bezier'.");
const parametro1cubic = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método cubic-bezier.");
const parametro2cubic = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método cubic-bezier.");
const parametro3cubic = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após terceiro argumento do método cubic-bezier.");
const parametro4cubic = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após quarto argumento do método curva-cúbica.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
parametro1cubic,
parametro2cubic,
parametro3cubic,
parametro4cubic,
]);
case "drop-shadow": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'drop-shadow'.");
let corSombra = null;
if (this.simbolos[this.atual].tipo === "QUALITATIVO") {
corSombra = this.avancarEDevolverAnterior();
}
const valorSombra1 = this.avancarEDevolverAnterior();
const quantificadorSombra1 = this.avancarEDevolverAnterior();
const valorSombra2 = this.avancarEDevolverAnterior();
const quantificadorSombra2 = this.avancarEDevolverAnterior();
let valorSombra3;
let quantificadorSombra3;
if (this.simbolos[this.atual].tipo === "NUMERO") {
valorSombra3 = this.avancarEDevolverAnterior();
quantificadorSombra3 = this.avancarEDevolverAnterior();
}
else {
valorSombra3 = null;
quantificadorSombra3 = null;
}
if (this.simbolos[this.atual].tipo === "QUALITATIVO") {
corSombra = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'drop-shadow'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorSombra1,
quantificadorSombra1,
valorSombra2,
quantificadorSombra2,
valorSombra3,
quantificadorSombra3,
corSombra,
]);
}
case "element":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'element'.");
const simboloElemento = this.avancarEDevolverAnterior();
const referenciaElemento = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'element'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [simboloElemento, referenciaElemento]);
case "ellipse":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'ellipse'.");
const arrayValoresElipse = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorElipse = this.avancarEDevolverAnterior();
arrayValoresElipse.push(proximoValorElipse);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'ellipse'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresElipse]);
case "fit-content":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'fit-content'.");
const valorFit = this.avancarEDevolverAnterior();
const quantificadorFit = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método fit-content.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorFit["lexema"],
quantificadorFit["lexema"],
]);
case "grayscale":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'grayscale'.");
const valorEscala = this.avancarEDevolverAnterior();
let quantificadorEscala;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorEscala = this.avancarEDevolverAnterior();
}
else {
quantificadorEscala = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'grayscale'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorEscala,
quantificadorEscala,
]);
case "hsl": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'hsl'.");
const HdeHSL = this.avancarEDevolverAnterior();
const SdeHSL = this.avancarEDevolverAnterior();
this.consumir(css_1.default.QUANTIFICADOR, "Esperado símbolo percentual após argumento de saturação (S) no método 'hsl'.");
const LdeHSL = this.avancarEDevolverAnterior();
this.consumir(css_1.default.QUANTIFICADOR, "Esperado símbolo percentual após argumento de luminosidade (L) no método 'hsl'.");
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'hsl'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
HdeHSL,
SdeHSL,
LdeHSL,
]);
}
case "hsla": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'hsla'.");
const HdeHSLA = this.avancarEDevolverAnterior();
const SdeHSLA = this.avancarEDevolverAnterior();
this.consumir(css_1.default.QUANTIFICADOR, "Esperado símbolo percentual após argumento de saturação (S) no método 'hsla'.");
const LdeHSLA = this.avancarEDevolverAnterior();
this.consumir(css_1.default.QUANTIFICADOR, "Esperado símbolo percentual após argumento de luminosidade (L) no método 'hsla'.");
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumentos de método 'hsla'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
HdeHSLA,
SdeHSLA,
LdeHSLA,
]);
}
case "hue-rotate": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'hue-rotate'.");
const valorRotacao = this.avancarEDevolverAnterior();
let quantificadorRotacao;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacao = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacao = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scale.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorRotacao, quantificadorRotacao]);
}
case "image-set":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'image-set'.");
const linkImagem = this.avancarEDevolverAnterior();
const tamanhoImagem = this.avancarEDevolverAnterior();
const proporcaoImagem = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método 'image-set'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [linkImagem, tamanhoImagem, proporcaoImagem]);
case "inset":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'inset'.");
const valorInserir1 = this.avancarEDevolverAnterior();
const quantificadorInserir1 = this.avancarEDevolverAnterior();
const arrayValoresInserir = [valorInserir1, quantificadorInserir1];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorInserir = this.avancarEDevolverAnterior();
arrayValoresInserir.push(proximoValorInserir);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método inset.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresInserir]);
case "image":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'image'.");
const arrayImage = [];
while (this.simbolos[this.atual].tipo !== 'PONTO_E_VIRGULA') {
const proximoValorImage = this.avancarEDevolverAnterior();
arrayImage.push(proximoValorImage);
}
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayImage]);
case "invert": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'invert'.");
const valorInverter = this.avancarEDevolverAnterior();
let quantificadorInverter;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInverter = this.avancarEDevolverAnterior();
}
else {
quantificadorInverter = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'invert'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorInverter, quantificadorInverter]);
}
case "linear-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'linear-gradient'.");
const valorAngulo = this.avancarEDevolverAnterior();
let quantificadorAngulo;
if (valorAngulo.tipo === "QUALITATIVO") {
switch (valorAngulo.lexema) {
case "superior":
valorAngulo.lexema = "0";
valorAngulo.tipo = "NUMERO";
quantificadorAngulo = {
tipo: "QUANTIFICADOR",
lexema: "deg",
};
break;
case "direita":
valorAngulo.lexema = "90";
valorAngulo.tipo = "NUMERO";
quantificadorAngulo = {
tipo: "QUANTIFICADOR",
lexema: "deg",
};
break;
case "inferior":
valorAngulo.lexema = "180";
valorAngulo.tipo = "NUMERO";
quantificadorAngulo = {
tipo: "QUANTIFICADOR",
lexema: "deg",
};
break;
case "esquerda":
valorAngulo.lexema = "270";
valorAngulo.tipo = "NUMERO";
quantificadorAngulo = {
tipo: "QUANTIFICADOR",
lexema: "deg",
};
break;
default:
break;
}
}
else {
quantificadorAngulo = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método linear-gradient.");
const cor1 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método linear-gradient.");
const cor2 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'linear-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorAngulo,
quantificadorAngulo,
cor1,
cor2,
]);
case "path":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'path'.");
const proporcaoCaminho = this.avancarEDevolverAnterior();
let matrizCaminho = null;
if (this.simbolos[this.atual].tipo === 'TEXTO') {
matrizCaminho = this.avancarEDevolverAnterior();
}
const arrayValoresCaminho = [proporcaoCaminho];
if (matrizCaminho !== null) {
arrayValoresCaminho.push(matrizCaminho);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método 'path'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, arrayValoresCaminho);
case "polygon":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'polygon'.");
const arrayValoresPoligono = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorPoligono = this.avancarEDevolverAnterior();
arrayValoresPoligono.push(proximoValorPoligono);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'polygon'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresPoligono]);
case "radial-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'radial-gradient'.");
const arrayGradienteRadial = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorGradienteRadial = this.avancarEDevolverAnterior();
arrayGradienteRadial.push(proximoValorGradienteRadial);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'radial-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayGradienteRadial]);
case "rect":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rect'.");
const valorRect1 = this.avancarEDevolverAnterior();
const quantificadorRect1 = this.avancarEDevolverAnterior();
const arrayValoresRect = [valorRect1, quantificadorRect1];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorRect = this.avancarEDevolverAnterior();
arrayValoresRect.push(proximoValorRect);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método rect.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresRect]);
case "repeating-conic-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'repeating-conic-gradient'.");
const arrayValoresConico = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorConico = this.avancarEDevolverAnterior();
arrayValoresConico.push(proximoValorConico);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'repeating-conic-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresConico]);
case "repeating-linear-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'repeating-linear-gradient'.");
const arrayValoresLinear = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorLinear = this.avancarEDevolverAnterior();
arrayValoresLinear.push(proximoValorLinear);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'repeating-linear-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresLinear]);
case "repeating-radial-gradient":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'repeating-radial-gradient'.");
const arrayValoresRadial = [];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorRadial = this.avancarEDevolverAnterior();
arrayValoresRadial.push(proximoValorRadial);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método 'repeating-radial-gradient'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresRadial]);
case "scale3d": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scale3d'.");
const valorScale3d1 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método scale3d.");
const valorScale3d2 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método scale3d.");
const valorScale3d3 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scale3d.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorScale3d1,
valorScale3d2,
valorScale3d3,
]);
}
case "scaleX": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scaleX'.");
const valorScaleX = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scaleX.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScaleX]);
}
case "scaleY": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scaleY'.");
const valorScaleY = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scaleY.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScaleY]);
}
case "shape":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'shape'.");
const arrayShape = [];
while (this.simbolos[this.atual].tipo !== 'PONTO_E_VIRGULA') {
const proximoValorShape = this.avancarEDevolverAnterior();
arrayShape.push(proximoValorShape);
}
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayShape]);
case "skew": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skew'.");
const valorInclinar1 = this.avancarEDevolverAnterior();
let quantificadorInclinar1;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinar1 = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinar1 = null;
}
let valorInclinar2;
let quantificadorInclinar2;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'skew'.");
valorInclinar2 = this.avancarEDevolverAnterior();
quantificadorInclinar2 = this.avancarEDevolverAnterior();
}
else {
valorInclinar2 = null;
quantificadorInclinar2 = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skew'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinar1,
quantificadorInclinar1,
valorInclinar2,
quantificadorInclinar2,
]);
}
case "skewX": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skewX'.");
const valorInclinarX = this.avancarEDevolverAnterior();
let quantificadorInclinarX;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinarX = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinarX = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skewX'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinarX,
quantificadorInclinarX,
]);
}
case "skewY": {
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skewY'.");
const valorInclinarY = this.avancarEDevolverAnterior();
let quantificadorInclinarY;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinarY = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinarY = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skewY'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinarY,
quantificadorInclinarY,
]);
}
case "invert":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'invert'.");
const valorInverter = this.avancarEDevolverAnterior();
let quantificadorInverter;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInverter = this.avancarEDevolverAnterior();
}
else {
quantificadorInverter = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'invert'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInverter,
quantificadorInverter,
]);
case "clamp":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'clamp'.");
const valorMin = this.avancarEDevolverAnterior();
const quantificadorMin = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'clamp'.");
const valorMed = this.avancarEDevolverAnterior();
const quantificadorMed = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método 'clamp'.");
const valorMax = this.avancarEDevolverAnterior();
const quantificadorMax = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método clamp.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorMin,
quantificadorMin,
valorMed,
quantificadorMed,
valorMax,
quantificadorMax,
]);
case "linear":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'linear'.");
const valor1 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método linear.");
const valor2 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método linear.");
const valor3 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após terceiro argumento do método linear.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valor1,
valor2,
valor3,
]);
case "minmax":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'minmax'.");
const valor01 = this.avancarEDevolverAnterior();
let parametro01 = null;
if (Number(valor01["lexema"])) {
const quantificador01 = this.avancarEDevolverAnterior();
parametro01 = `${valor01["lexema"]}${quantificador01["lexema"]}`;
}
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método minmax.");
const valor02 = this.avancarEDevolverAnterior();
let parametro02 = null;
if (Number(valor02["lexema"])) {
const quantificador02 = this.avancarEDevolverAnterior();
parametro02 = `${valor02["lexema"]}${quantificador02["lexema"]}`;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método minmax.");
if (parametro01 !== null) {
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [parametro01, valor02["lexema"]]);
}
if (parametro02 !== null) {
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valor01["lexema"], parametro02]);
}
case "opacity":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'opacity'.");
const valorOpaco = this.avancarEDevolverAnterior();
let quantificadorOpaco;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorOpaco = this.avancarEDevolverAnterior();
}
else {
quantificadorOpaco = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'opacity'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorOpaco, quantificadorOpaco], true);
case "ornaments":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'ornaments'.");
const valorOrnaments = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método ornaments.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorOrnaments]);
case "paint":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'paint'.");
const referenciaPintura = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'paint'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [referenciaPintura]);
case "perspective":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'perspective'.");
const valorPerspectivar = this.avancarEDevolverAnterior();
let quantificadorPerspectivar;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorPerspectivar = this.avancarEDevolverAnterior();
}
else {
quantificadorPerspectivar = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'perspective'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorPerspectivar, quantificadorPerspectivar], true);
case "drop-shadow":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'drop-shadow'.");
let corSombra = null;
if (this.simbolos[this.atual].tipo === "QUALITATIVO") {
corSombra = this.avancarEDevolverAnterior();
}
const valorSombra1 = this.avancarEDevolverAnterior();
const quantificadorSombra1 = this.avancarEDevolverAnterior();
const valorSombra2 = this.avancarEDevolverAnterior();
const quantificadorSombra2 = this.avancarEDevolverAnterior();
let valorSombra3;
let quantificadorSombra3;
if (this.simbolos[this.atual].tipo === "NUMERO") {
valorSombra3 = this.avancarEDevolverAnterior();
quantificadorSombra3 = this.avancarEDevolverAnterior();
}
else {
valorSombra3 = null;
quantificadorSombra3 = null;
}
if (this.simbolos[this.atual].tipo === "QUALITATIVO") {
corSombra = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'drop-shadow'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorSombra1,
quantificadorSombra1,
valorSombra2,
quantificadorSombra2,
valorSombra3,
quantificadorSombra3,
corSombra,
]);
case "ray":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'ray'.");
let posicaoRaio;
if (this.simbolos[this.atual].tipo === "QUALITATIVO") {
posicaoRaio = this.avancarEDevolverAnterior();
}
else {
posicaoRaio = null;
}
const numeroRaio = this.avancarEDevolverAnterior();
const quantificadorRaio = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumentos de método 'ray'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
posicaoRaio,
numeroRaio,
quantificadorRaio,
]);
case "rgb":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rgb'.");
const vermelho = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após argumento de cor vermelha.");
const verde = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após argumento de cor verde.");
const azul = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumentos de método 'rgb'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [vermelho, verde, azul]);
case "rgba":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rgba'.");
const vermelhoRgba = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após argumento de cor vermelha.");
const verdeRgba = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após argumento de cor verde.");
const azulRgba = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumentos de método 'rgba'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
vermelhoRgba,
verdeRgba,
azulRgba,
]);
case "rotate":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rotate'.");
const valorRotacionar = this.avancarEDevolverAnterior();
let quantificadorRotacionar;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacionar = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacionar = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'rotate'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorRotacionar, quantificadorRotacionar], true);
case "rotate3d":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rotate3d'.");
const valor1Rotacionar3d = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperada vírgula após primeiro parâmetro do método 'rotate3d'.");
const valor2Rotacionar3d = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperada vírgula após segundo parâmetro do método 'rotate3d'.");
const valor3Rotacionar3d = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperada vírgula após terceiro parâmetro do método 'rotate3d'.");
const valor4Rotacionar3d = this.avancarEDevolverAnterior();
let quantificadorRotacionar3d;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacionar3d = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacionar3d = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'rotate3d'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valor1Rotacionar3d,
valor2Rotacionar3d,
valor3Rotacionar3d,
valor4Rotacionar3d,
quantificadorRotacionar3d,
]);
case "rotateZ":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rotateZ'.");
const valorRotacionarZ = this.avancarEDevolverAnterior();
let quantificadorRotacionarZ;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacionarZ = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacionarZ = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'rotateZ'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorRotacionarZ,
quantificadorRotacionarZ,
]);
case "rotateX":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rotateX'.");
const valorRotacionarX = this.avancarEDevolverAnterior();
let quantificadorRotacionarX;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacionarX = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacionarX = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'rotateX'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorRotacionarX,
quantificadorRotacionarX,
]);
case "hue-rotate":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'hue-rotate'.");
const valorRotacao = this.avancarEDevolverAnterior();
let quantificadorRotacao;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacao = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacao = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'hue-rotate'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorRotacao,
quantificadorRotacao,
]);
case "rotateY":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'rotateY'.");
const valorRotacionarY = this.avancarEDevolverAnterior();
let quantificadorRotacionarY;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorRotacionarY = this.avancarEDevolverAnterior();
}
else {
quantificadorRotacionarY = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'rotateY'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorRotacionarY,
quantificadorRotacionarY,
]);
case "saturate":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'saturate'.");
const valorSaturar = this.avancarEDevolverAnterior();
let quantificadorSaturar;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorSaturar = this.avancarEDevolverAnterior();
}
else {
quantificadorSaturar = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'saturate'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorSaturar,
quantificadorSaturar,
]);
case "scale":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scale'.");
const valorScale1 = this.avancarEDevolverAnterior();
let valorScale2;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método scale.");
valorScale2 = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scale.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScale1, valorScale2], true);
case "scale3d":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scale3d'.");
const valorScale3d1 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método scale3d.");
const valorScale3d2 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método scale3d.");
const valorScale3d3 = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scale3d.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorScale3d1,
valorScale3d2,
valorScale3d3,
]);
case "scaleZ":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scaleZ'.");
const valorScaleZ = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scaleZ.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScaleZ]);
case "scaleX":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scaleX'.");
const valorScaleX = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scaleX.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScaleX]);
case "scaleY":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'scaleY'.");
const valorScaleY = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método scaleY.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorScaleY]);
case "sepia":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'sepia'.");
const valorSepia = this.avancarEDevolverAnterior();
let quantificadorSepia;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorSepia = this.avancarEDevolverAnterior();
}
else {
quantificadorSepia = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'sepia'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorSepia,
quantificadorSepia,
]);
case "skew":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skew'.");
const valorInclinar1 = this.avancarEDevolverAnterior();
let quantificadorInclinar1;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinar1 = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinar1 = null;
}
let valorInclinar2;
let quantificadorInclinar2;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'skew'.");
valorInclinar2 = this.avancarEDevolverAnterior();
quantificadorInclinar2 = this.avancarEDevolverAnterior();
}
else {
valorInclinar2 = null;
quantificadorInclinar2 = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skew'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinar1,
quantificadorInclinar1,
valorInclinar2,
quantificadorInclinar2,
]);
case "skewX":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skewX'.");
const valorInclinarX = this.avancarEDevolverAnterior();
let quantificadorInclinarX;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinarX = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinarX = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skewX'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinarX,
quantificadorInclinarX,
]);
case "skewY":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'skewY'.");
const valorInclinarY = this.avancarEDevolverAnterior();
let quantificadorInclinarY;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorInclinarY = this.avancarEDevolverAnterior();
}
else {
quantificadorInclinarY = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'skewY'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorInclinarY,
quantificadorInclinarY,
]);
case "steps":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'steps'.");
const valorNumerico = this.avancarEDevolverAnterior();
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método steps.");
const termoSalto = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após segundo argumento do método steps.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorNumerico,
termoSalto,
]);
case "styleset":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'styleset'.");
const valor1ConjuntoEstilos = this.avancarEDevolverAnterior();
let valor2ConjuntoEstilos;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método styleset.");
valor2ConjuntoEstilos = this.avancarEDevolverAnterior();
}
let valor3ConjuntoEstilos;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após segundo argumento do método styleset.");
valor3ConjuntoEstilos = this.avancarEDevolverAnterior();
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método styleset.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valor1ConjuntoEstilos,
valor2ConjuntoEstilos,
valor3ConjuntoEstilos
]);
case "stylistic":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'stylistic'.");
const valorEstilistico = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método stylistic.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorEstilistico]);
case "swash":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'swash'.");
const valorEspirrar = this.avancarEDevolverAnterior();
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após argumento do método swash.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [valorEspirrar]);
case "translate":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'translate'.");
const valorTranslacao1 = this.avancarEDevolverAnterior();
let quantificadorTranlacao1;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranlacao1 = this.avancarEDevolverAnterior();
}
else {
quantificadorTranlacao1 = null;
}
let valorTranslacao2;
let quantificadorTranlacao2;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'translate'.");
valorTranslacao2 = this.avancarEDevolverAnterior();
quantificadorTranlacao2 = this.avancarEDevolverAnterior();
}
else {
valorTranslacao2 = null;
quantificadorTranlacao2 = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'translação'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorTranslacao1,
quantificadorTranlacao1,
valorTranslacao2,
quantificadorTranlacao2,
], true);
case "translate3d":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'translate3d'.");
const valorTranslacao3d1 = this.avancarEDevolverAnterior();
let quantificadorTranlacao3d1;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranlacao3d1 = this.avancarEDevolverAnterior();
}
else {
quantificadorTranlacao3d1 = null;
}
let valorTranslacao3d2;
let quantificadorTranlacao3d2;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'translate3d'.");
valorTranslacao3d2 = this.avancarEDevolverAnterior();
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranlacao3d2 =
this.avancarEDevolverAnterior();
}
else {
quantificadorTranlacao3d2 = null;
}
}
else {
valorTranslacao3d2 = null;
quantificadorTranlacao3d2 = null;
}
let valorTranslacao3d3;
let quantificadorTranlacao3d3;
if (this.simbolos[this.atual].tipo === "VIRGULA") {
this.consumir(css_1.default.VIRGULA, "Esperado vírgula após primeiro argumento do método 'translate3d'.");
valorTranslacao3d3 = this.avancarEDevolverAnterior();
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranlacao3d3 =
this.avancarEDevolverAnterior();
}
else {
quantificadorTranlacao3d3 = null;
}
}
else {
valorTranslacao3d3 = null;
quantificadorTranlacao3d3 = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'translate3d'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorTranslacao3d1,
quantificadorTranlacao3d1,
valorTranslacao3d2,
quantificadorTranlacao3d2,
valorTranslacao3d3,
quantificadorTranlacao3d3,
]);
case "translateX":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'translateX'.");
const valorTranslaçaoX = this.avancarEDevolverAnterior();
let quantificadorTranslaçaoX;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranslaçaoX = this.avancarEDevolverAnterior();
}
else {
quantificadorTranslaçaoX = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'translateX'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorTranslaçaoX,
quantificadorTranslaçaoX,
]);
case "translateY":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'translateY'.");
const valorTranslaçaoY = this.avancarEDevolverAnterior();
let quantificadorTranslaçaoY;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranslaçaoY = this.avancarEDevolverAnterior();
}
else {
quantificadorTranslaçaoY = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'translateY'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorTranslaçaoY,
quantificadorTranslaçaoY,
]);
case "translateZ":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'translateZ'.");
const valorTranslaçaoZ = this.avancarEDevolverAnterior();
let quantificadorTranslaçaoZ;
if (this.simbolos[this.atual].tipo === "QUANTIFICADOR") {
quantificadorTranslaçaoZ = this.avancarEDevolverAnterior();
}
else {
quantificadorTranslaçaoZ = null;
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após método 'translateZ'.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [
valorTranslaçaoZ,
quantificadorTranslaçaoZ,
]);
case "xywh":
this.consumir(css_1.default.PARENTESE_ESQUERDO, "Esperado parêntese esquerdo após método 'xywh'.");
const valorXywh = this.avancarEDevolverAnterior();
const quantificadorXywh = this.avancarEDevolverAnterior();
const arrayValoresXywh = [valorXywh, quantificadorXywh];
while (this.simbolos[this.atual].tipo !== 'PARENTESE_DIREITO') {
const proximoValorXywh = this.avancarEDevolverAnterior();
arrayValoresXywh.push(proximoValorXywh);
}
this.consumir(css_1.default.PARENTESE_DIREITO, "Esperado parêntese direito após último argumento do método xywh.");
return new seletor_valor_reverso_1.SeletorValorReverso(lexema, [arrayValoresXywh]);
}
}
valorNumerico(nomeModificador, valorModificador, ponto) {
let literalNumero = Number(valorModificador.lexema);
if (ponto) {
literalNumero = literalNumero / Math.pow(10, valorModificador.lexema.length);
}
let quantificadorNumero;
if (this.verificarTipoSimboloAtual(css_1.default.QUANTIFICADOR)) {
const simboloQuantificadorNumero = this.avancarEDevolverAnterior();
quantificadorNumero = simboloQuantificadorNumero.lexema;
}
const valorNumerico = new valores_1.ValorNumerico(nomeModificador, literalNumero, quantificadorNumero);
return valorNumerico;
}
valoresModificador(nomeModificador) {
const valoresResolvidos = [];
while (this.atual < this.simbolos.length &&
this.simbolos[this.atual].tipo !== css_1.default.PONTO_E_VIRGULA) {
const valorModificador = this.avancarEDevolverAnterior();
switch (valorModificador.tipo) {
case css_1.default.BARRA:
valoresResolvidos.push(new valores_1.ValorAbreviacao());
break;
case css_1.default.CIFRAO:
const nomeVariavel = this.avancarEDevolverAnterior();
const referenciaVariavel = new referencia_variavel_1.ReferenciaVariavel(nomeVariavel.lexema);
valoresResolvidos.push(referenciaVariavel);
break;
case css_1.default.METODO:
const metodo = this.resolverMetodo(valorModificador.lexema);
valoresResolvidos.push(metodo);
break;
case css_1.default.NUMERO:
const valorNumerico = this.valorNumerico(nomeModificador, valorModificador, false);
valoresResolvidos.push(valorNumerico);
break;
case css_1.default.PONTO:
const simboloNumero = this.consumir(css_1.default.NUMERO, "Esperado número após ponto para valor de modificador.");
const valorNumericoComecadoPorPonto = this.valorNumerico(nomeModificador, simboloNumero, true);
valoresResolvidos.push(valorNumericoComecadoPorPonto);
break;
case css_1.default.QUALITATIVO:
const valorQualitativo = new valores_1.ValorQualitativo(valorModificador.lexema);
valoresResolvidos.push(valorQualitativo);
break;
case css_1.default.TEXTO:
const valorTexto = new valores_1.ValorTexto(valorModificador.lexema);
valoresResolvidos.push(valorTexto);
break;
case css_1.default.VIRGULA:
const valorVirgula = new valores_1.ValorVirgula();
valoresResolvidos.push(valorVirgula);
break;
default:
if (valorModificador.lexema in gerais_1.valoresGerais) {
valoresResolvidos.push(new valores_1.ValorQualitativo(valorModificador.lexema));
break;
}
if (valores_personalizados_1.ModificadoresValorPersonalizado.includes(nomeModificador)) {
valoresResolvidos.push(new valores_1.ValorQualitativo(valorModificador.lexema));
break;
}
throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(valorModificador, `Modificador ou variável '${nomeModificador}' com valor '${valorModificador.lexema || valorModificador.tipo}' inválido.`);
}
}
this.consumir(css_1.default.PONTO_E_VIRGULA, "Esperado ponto-e-vírgula após declaração de valores de modificador.");
return valoresResolvidos;
}
resolverModificador() {
const modificador = this.consumir(css_1.default.IDENTIFICADOR, "Esperado nome do atributo de identificação.");
this.consumir(css_1.default.DOIS_PONTOS, `Esperado ':' após declaração de Modificador ou variável '${modificador.lexema}'.`);
const valoresModificador = this.valoresModificador(modificador.lexema);
const classeModificadora = new seletor_reverso_modificador_1.SeletorReversoModificador(modificador.lexema, valoresModificador, {
linha: modificador.linha,
colunaInicial: modificador.colunaInicial,
colunaFinal: modificador.colunaFinal,
});
return classeModificadora;
}
resolverModificadorEDeclaracoesAninhadas() {
this.consumir(css_1.default.CHAVE_ESQUERDA, "Esperado '{' após declaração de seletor.");
const modificadores = [];
const declaracoesAninhadas = [];
while (!this.verificarTipoSimboloAtual(css_1.default.CHAVE_DIREITA)) {
switch (this.simbolos[this.atual].tipo) {
case css_1.default.IDENTIFICADOR:
const modificador = this.resolverModificador();
modificadores.push(modificador);
break;
default:
const declaracaoAninhada = this.declaracao();
declaracoesAninhadas.push(declaracaoAninhada);
break;
}
}
this.avancarEDevolverAnterior(); // chave direita
return {
modificadores,
declaracoesAninhadas,
};
}
declaracao() {
if (this.estaNoFinal())
return null;
const seletores = this.resolverSeletores();
const modificadorEDeclaracoesAninhadas = this.resolverModificadorEDeclaracoesAninhadas();
return new declaracoes_1.BlocoDeclaracao(seletores, modificadorEDeclaracoesAninhadas.modificadores, modificadorEDeclaracoesAninhadas.declaracoesAninhadas);
}
analisar(simbolos) {
this.simbolos = simbolos;
this.erros = [];
this.atual = 0;
const declaracoes = [];
while (!this.estaNoFinal()) {
declaracoes.push(this.declaracao());
}
return declaracoes;
}
}
exports.AvaliadorSintaticoReverso = AvaliadorSintaticoReverso;
//# sourceMappingURL=avaliador-sintatico-reverso.js.map