Skip to content

Commit 2c09ce3

Browse files
authored
Aprimorando suporte a variáveis na atribuição de valores (#179)
* Implementa suporte a variáveis para atribuição de números como valor * Apaga console.logs usados para debug * Amplia suporte de variáveis para aceitar quantificadores * Otimiza solução de quantificadores para suporte a variáveis * Amplia suporte a variáveis para receber Metodos como valor * Limpa logs do processo de implementação * Ajustes de indentacao e espaçamento no serializador * Ajustes no Lexador após erro nos testes * Testes unitários - qualitativos (suporte a variaveis) * Testes unitários - valor numérico com e sem quantificador (suporte a variaveis) * Testes unitários - Metodos (suporte a variaveis) * Testes unitários - casos de falha (suporte a variaveis)
1 parent b3fe7dc commit 2c09ce3

File tree

6 files changed

+466
-31
lines changed

6 files changed

+466
-31
lines changed

exemplos/exemplo5.foles

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
$valor-padrao: herdar;
22
$cor-secundaria: branco;
33

4+
$valor-recuo: 12px;
5+
46
lmht {
57
altura: $valor-padrao;
6-
recuo-direito: 12px;
8+
recuo-direito: $valor-recuo;
79
}
810

911
lmht {
1012
cor-barra-rolagem: $cor-secundaria;
1113
}
1214

1315
$valor-teste: verde;
16+
$valor-indice: 0;
1417

1518
lmht {
1619
borda-em-bloco: $valor-teste;
20+
indice-z: $valor-indice;
21+
}
22+
23+
$cor-padrao: rgb(31, 120, 50);
24+
25+
lmht {
26+
sombra-caixa: $cor-padrao;
27+
}
28+
29+
$cor-filtro: borrar(10px);
30+
lmht {
31+
filtro-fundo: $cor-filtro;
1732
}

fontes/avaliador-sintatico/avaliador-sintatico.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,9 +1150,10 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
11501150
protected declaracaoVariavel(): DeclaracaoVariavel {
11511151
let nomeVariavel: string;
11521152
let simboloValorVariavel: Simbolo;
1153-
let valorVariavel: string;
1153+
let valorVariavel: string | Valor;
1154+
let quantificadorVariavel: string;
11541155

1155-
while (this.simbolos[this.atual].tipo !== tiposDeSimbolos.PONTO_E_VIRGULA) {
1156+
while (this.simbolos[this.atual].tipo !== tiposDeSimbolos.PONTO_E_VIRGULA) {
11561157
this.consumir(
11571158
tiposDeSimbolos.CIFRAO,
11581159
"Esperado cifrão antes de declaração de variável."
@@ -1187,26 +1188,32 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
11871188

11881189
valorVariavel = simboloValorVariavel.lexema;
11891190
break;
1190-
case tiposDeSimbolos.NUMERO:
1191+
case tiposDeSimbolos.NUMERO:
11911192
simboloValorVariavel = this.consumir(
11921193
tiposDeSimbolos.NUMERO,
11931194
"Esperado valor numérico após declaração de variável"
11941195
);
11951196

11961197
valorVariavel = simboloValorVariavel.lexema;
1197-
1198-
const proximoSimbolo: Simbolo = this.avancarEDevolverAnterior();
1199-
if (proximoSimbolo.tipo === tiposDeSimbolos.QUANTIFICADOR) {
1200-
const quantificadorVariavel = this.consumir(
1198+
1199+
if (this.simbolos[this.atual].tipo === tiposDeSimbolos.QUANTIFICADOR) {
1200+
const quantificador = this.consumir(
12011201
tiposDeSimbolos.QUANTIFICADOR,
12021202
"Esperado quantificador após valor numérico atribuído à variável."
12031203
)
1204-
1205-
valorVariavel += quantificadorVariavel.lexema;
1204+
1205+
quantificadorVariavel = quantificador.lexema;
12061206
}
12071207
break;
12081208
case tiposDeSimbolos.METODO:
1209-
this.resolverMetodo(this.simbolos[this.atual - 1].lexema);
1209+
this.consumir(
1210+
tiposDeSimbolos.METODO,
1211+
"Esperada declaração de método no valor atribuído à variável."
1212+
)
1213+
1214+
const tratarMetodo = this.resolverMetodo(this.simbolos[this.atual - 1].lexema);
1215+
valorVariavel = tratarMetodo;
1216+
12101217
break;
12111218
default:
12121219
console.log('Não deveria cair aqui!')
@@ -1221,6 +1228,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
12211228
const variavel = {
12221229
nome: nomeVariavel,
12231230
valor: valorVariavel,
1231+
quantificador: quantificadorVariavel ? quantificadorVariavel : null,
12241232
};
12251233

12261234
return variavel;
@@ -1397,7 +1405,8 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
13971405

13981406
return new DeclaracaoVariavel(
13991407
variavel.nome,
1400-
variavel.valor
1408+
variavel.valor,
1409+
variavel.quantificador,
14011410
);
14021411
default:
14031412
const seletores = this.resolverSeletores();
@@ -1414,7 +1423,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
14141423
analisar(simbolos: Simbolo[]): Declaracao[] {
14151424
this.simbolos = simbolos;
14161425
this.erros = [];
1417-
this.atual = 0;
1426+
this.atual = 0;
14181427

14191428
const declaracoes: Declaracao[] = [];
14201429
while (!this.estaNoFinal()) {
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
import { Metodo } from "../valores/metodos/foles/metodo";
1+
import { Valor } from "../valores/valor";
22
import { Declaracao } from "./declaracao";
33

44
export class DeclaracaoVariavel extends Declaracao {
55
nome: string;
6-
valor: Metodo | string;
6+
valor: Valor | string;
7+
quantificador?: string;
78

89
constructor(
910
nome: string,
10-
valor: Metodo | string
11+
valor: Valor | string,
12+
quantificador: string = null,
1113
) {
1214
super();
1315
this.nome = nome;
1416
this.valor = valor;
17+
this.quantificador = quantificador;
1518
}
16-
}
19+
}

fontes/lexador/lexador.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ export class Lexador implements LexadorInterface {
374374
break;
375375
case "$":
376376
this.adicionarSimbolo(tiposDeSimbolos.CIFRAO, null, '$');
377+
this.avancar();
378+
break;
377379
default:
378380
if (this.eDigito(caractere)) this.analisarNumero();
379381
else if (this.eAlfabeto(caractere))

fontes/serializadores/serializador.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { valoresGerais } from "../modificadores/atributos/gerais";
44
import { SeletorEstrutura } from "../seletores";
55
import { SeletorEspacoReservado } from "../seletores/seletor-espaco-reservado";
66
import { Metodo } from "../valores/metodos/foles/metodo";
7-
87
import estruturasHtml from "../tradutores/estruturas-html";
98
import { DeclaracaoVariavel } from "../declaracoes/declaracao-variavel";
109
import { Declaracao } from "../declaracoes/declaracao";
@@ -19,7 +18,7 @@ import { SeletorModificador } from "../modificadores/superclasse";
1918
*/
2019
export class Serializador {
2120
serializarComAninhamentos: boolean;
22-
variaveis: {[key: string]: any};
21+
variaveis: { [key: string]: any };
2322

2423
constructor(serializarComAninhamentos: boolean = false) {
2524
this.serializarComAninhamentos = serializarComAninhamentos;
@@ -31,7 +30,7 @@ export class Serializador {
3130
indentacao: number = 0
3231
): string {
3332
// Caso 1: Número-Quantificador ou somente Número.
34-
if (Number(modificador.valor)) {
33+
if (Number(modificador.valor) || modificador.valor === '0') {
3534
return `${" ".repeat(indentacao)}${modificador.propriedadeCss}: ${modificador.valor
3635
}${modificador.quantificador || ""};\n`;
3736
}
@@ -159,9 +158,9 @@ export class Serializador {
159158
}
160159

161160
validarValoresVariaveis(declaracao: BlocoDeclaracao): void {
162-
const nomeFolEs = declaracao.modificadores[0].nomeFoles.length > 1
161+
const nomeFolEs = declaracao.modificadores[0].nomeFoles.length > 1
163162
&& typeof declaracao.modificadores[0].nomeFoles === 'object'
164-
? declaracao.modificadores[0].nomeFoles[0].toString()
163+
? declaracao.modificadores[0].nomeFoles[0].toString()
165164
: declaracao.modificadores[0].nomeFoles.toString();
166165

167166
const valorModificador = declaracao.modificadores[0].valor.toString();
@@ -170,26 +169,31 @@ export class Serializador {
170169
new SeletorModificador(
171170
nomeFolEs,
172171
valorModificador,
173-
declaracao.modificadores[0].quantificador ? declaracao.modificadores[0].quantificador : null,
172+
declaracao.modificadores[0].quantificador,
174173
declaracao.modificadores[0].pragmas,
175174
valorVariavel,
176-
)
175+
)
177176
}
178177

179-
serializarVariaveis(declaracaoVariavel: DeclaracaoVariavel, declaracoes: Declaracao[], indexVariavel: number): void {
178+
serializarDeclaracaoVariavel(declaracaoVariavel: DeclaracaoVariavel, declaracoes: Declaracao[], indexVariavel: number): void {
180179
let variavelInexistente: boolean = false;
181180

182181
declaracoes.forEach((declaracao, indexBlocoDeclaracao) => {
183182
if (declaracao instanceof BlocoDeclaracao) {
184183
declaracao.modificadores.forEach((modificador) => {
185184
if (modificador.valor === declaracaoVariavel.nome) {
186-
modificador.valor = declaracaoVariavel.valor;
185+
if (typeof declaracaoVariavel.valor === 'string') {
186+
modificador.valor = declaracaoVariavel.valor;
187+
188+
if (declaracaoVariavel.quantificador) modificador.quantificador = declaracaoVariavel.quantificador;
189+
this.validarValoresVariaveis(declaracao);
190+
} else if (declaracaoVariavel.valor instanceof Metodo) {
191+
modificador.valor = declaracaoVariavel.valor;
192+
}
187193

188194
if (indexVariavel > indexBlocoDeclaracao) {
189195
variavelInexistente = true;
190196
}
191-
192-
this.validarValoresVariaveis(declaracao);
193197
}
194198
})
195199
}
@@ -205,20 +209,20 @@ export class Serializador {
205209
* @param declaracoes As declaracoes.
206210
* @returns Uma string com o resultado da tradução.
207211
*/
208-
serializar(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) {
212+
serializar(declaracoes: Declaracao[], indentacao: number = 0, seletorAnterior: string = undefined) {
209213
let resultado = "";
210214
let textoSeletorAnterior = "";
211215
if (seletorAnterior !== undefined) {
212216
textoSeletorAnterior = seletorAnterior;
213217
}
214218

215-
for (const [index, declaracao] of declaracoes.entries()) {
219+
for (const [index, declaracao] of declaracoes.entries()) {
216220
switch (declaracao.constructor.name) {
217221
case 'BlocoDeclaracao':
218222
resultado += this.serializarBlocoDeclaracao(declaracao as BlocoDeclaracao, indentacao, textoSeletorAnterior);
219223
break;
220224
case 'DeclaracaoVariavel':
221-
this.serializarVariaveis(declaracao as DeclaracaoVariavel, declaracoes, index);
225+
this.serializarDeclaracaoVariavel(declaracao as DeclaracaoVariavel, declaracoes, index);
222226
break;
223227
}
224228
}

0 commit comments

Comments
 (0)