private static Tekst BlokFormat(Queue <string> ulaz) { List <string> linije = new List <string>(); string linija; for (linija = ulaz.Dequeue(); !linija.Trim().StartsWith("}"); linija = ulaz.Dequeue()) { linije.Add(linija); } int uvlacenje = int.Parse(linija.TrimStart().Remove(0, 1).Trim()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < linije.Count; i++) { if (uvlacenje > 0) { linije[i] = linije[i].Remove(0, uvlacenje); } sb.Append(linije[i]); sb.Append("\n"); } string tekst = sb.ToString(); List <Supstitucija> supstitucije = new List <Supstitucija>(); for (linija = ulaz.Dequeue(); !linija.Trim().EndsWith(";"); linija = ulaz.Dequeue()) { Queue <string> linijaQ = new Queue <string>(linija.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); string kljuc = linijaQ.Dequeue(); ITekst vrijednost = LinijskiFormat(linijaQ); for (int poz = tekst.IndexOf(kljuc); poz >= 0; poz = tekst.IndexOf(kljuc, poz + 1)) { supstitucije.Add(new Supstitucija(poz, vrijednost, kljuc.Length)); } } supstitucije.Sort((a, b) => a.pozicija.CompareTo(b.pozicija)); List <ITekst> elementi = new List <ITekst>(); int pocetak = 0; foreach (Supstitucija sups in supstitucije) { int duljinaLiterala = sups.pozicija - pocetak; if (duljinaLiterala > 0) { elementi.Add(new Elementi.Literal(tekst.Substring(pocetak, duljinaLiterala))); } elementi.Add(sups.element); pocetak = sups.kraj; } if (pocetak < tekst.Length) { elementi.Add(new Elementi.Literal(tekst.Substring(pocetak))); } return(new Tekst(elementi)); }
public static IEnumerable <KeyValuePair <string, ITekst> > IzStringa(Queue <string> ulaz) { List <KeyValuePair <string, ITekst> > rez = new List <KeyValuePair <string, ITekst> >(); while (ulaz.Count > 0) { Queue <string> linija = new Queue <string>(ulaz.Dequeue().Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); if (linija.Count == 0) { continue; } string kljuc = linija.Dequeue(); ITekst vrijedost = null; string format = linija.Dequeue(); if (format == "=") { vrijedost = JednostavanFormat(linija); } else if (format == ":=") { vrijedost = LinijskiFormat(linija); } else if (format == "{") { vrijedost = BlokFormat(ulaz); } else { throw new FormatException(); } rez.Add(new KeyValuePair <string, ITekst>(kljuc, vrijedost)); } return(rez); }
private UvjetniLiteral(Formula uvjet, ITekst izlaz) { this.izlaz = izlaz; this.uvjet = uvjet; }
public Supstitucija(int pozicija, ITekst element, int duljina) { this.kraj = pozicija + duljina; this.pozicija = pozicija; this.element = element; }