-
Notifications
You must be signed in to change notification settings - Fork 2
/
foles.ts
99 lines (86 loc) · 4.27 KB
/
foles.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { AvaliadorSintatico } from "./avaliador-sintatico";
import { AvaliadorSintaticoReverso } from './avaliador-sintatico/avaliador-sintatico-reverso';
import { Lexador } from "./lexador";
import { LexadorReverso } from './lexador/lexador-reverso';
import { Serializador } from "./serializadores";
import { SerializadorReverso } from './serializadores/serializador-reverso';
import { Importador } from './importador';
import { ResultadoLexadorInterface, SimboloInterface } from './interfaces';
import { Tradutor } from "./tradutores/tradutor";
import { TradutorReverso } from "./tradutores/tradutor-reverso";
import { Base64 } from "./utilidades/base64";
/**
* O núcleo da linguagem FolEs.
*/
export class FolEs {
lexador: Lexador;
lexadorReverso: LexadorReverso;
avaliadorSintatico: AvaliadorSintatico;
avaliadorSintaticoReverso: AvaliadorSintaticoReverso;
importador: Importador;
importadorReverso: Importador;
serializador: Serializador;
serializadorReverso: SerializadorReverso;
tradutor: Tradutor;
tradutorReverso: TradutorReverso;
constructor(traduzirComAninhamentos: boolean) {
this.lexador = new Lexador();
this.lexadorReverso = new LexadorReverso();
this.importador = new Importador(this.lexador);
this.importadorReverso = new Importador(this.lexadorReverso);
this.importadorReverso.extensaoPadrao = ".css";
this.avaliadorSintatico = new AvaliadorSintatico(this.importador);
this.avaliadorSintaticoReverso = new AvaliadorSintaticoReverso(this.importadorReverso);
this.serializador = new Serializador(traduzirComAninhamentos);
this.serializadorReverso = new SerializadorReverso(traduzirComAninhamentos);
this.tradutor = new Tradutor();
this.tradutorReverso = new TradutorReverso();
}
/**
* Método comum de conversão de texto FolEs para CSS.
* @param conteudo O conteúdo em FolEs.
* @returns O resultado da tradução em CSS.
*/
private converterParaCssInterno(simbolos: SimboloInterface[]): string {
const resultadoAvaliadorSintatico = this.avaliadorSintatico.analisar(simbolos);
const traducao = this.serializador.serializar(resultadoAvaliadorSintatico);
return traducao;
}
private converterParaFolEsInterno(simbolos: SimboloInterface[]): string {
const resultadoAvaliadorSintaticoReverso = this.avaliadorSintaticoReverso.analisar(simbolos);
const traducaoReversa = this.serializadorReverso.serializar(resultadoAvaliadorSintaticoReverso);
return traducaoReversa;
}
converterParaCss(nomeArquivo: string): string {
const resultadoLexador: [string[], ResultadoLexadorInterface] =
this.importador.importar(nomeArquivo, true);
return this.converterParaCssInterno(resultadoLexador[1].simbolos);
}
converterParaCssComMapas(nomeArquivo: string): [string, string] {
const resultadoLexador: [string[], ResultadoLexadorInterface] =
this.importador.importar(nomeArquivo, true);
const resultadoAvaliadorSintatico = this.avaliadorSintatico.analisar(resultadoLexador[1].simbolos);
const traducao = this.serializador.serializar(resultadoAvaliadorSintatico);
const resultadoTraducao = this.tradutor.traduzir(resultadoAvaliadorSintatico);
const mapa = this.tradutor.gerarMapaFontes(resultadoTraducao, resultadoLexador[0].join('\n'));
return [
traducao,
new Base64().encode(JSON.stringify(mapa))
];
}
converterParaFolEs(nomeArquivo: string): string {
const resultadoLexador: [string[], ResultadoLexadorInterface] =
this.importadorReverso.importar(nomeArquivo);
return this.converterParaFolEsInterno(resultadoLexador[1].simbolos);
}
converterTextoParaCss(texto: string): string {
const resultadoLexador = this.lexador.mapear(texto.split('\n'));
return this.converterParaCssInterno(resultadoLexador.simbolos);
}
converterTextoParaFolEs(texto: string): string {
const resultadoLexadorReverso = this.lexadorReverso.mapear(texto.split('\n'));
return this.converterParaFolEsInterno(resultadoLexadorReverso.simbolos);
}
}
// const a = new FolEs(false);
// console.log(a.converterParaCss('../exemplos/exemplo3.foles'));