/// <summary> /// Crea una nova LiniaMarques aplicant un model a aquesta. /// </summary> /// <param name="cerca">Una expressió regular per cercar el que s'ha de canviar.</param> /// <param name="model">Una llista de parells original => transformat. /// Les cadenes d'index parell són els originals. Les d'índex senar, són les còpies.</param> /// <returns>Un nou objecte amb els canvis aplicats</returns> public LiniaMarques AplicaModel(Regex cerca, string[] model) { LiniaMarques lm = new LiniaMarques(); foreach (TrosMarques tros in cont) { string nou = cerca.Replace(tros.Str, delegate(Match match) { return match.Groups[1].Value + AplicaModel(match.Groups[2].Value, model); }); lm.Nou(nou, tros.Marques, tros.Excepte); } return lm; }
/// <summary> /// Interpreta una línia d'excepcions i crea una LiniaMarques. /// </summary> public static LiniaMarques LlegeixLiniaExc(string linia) { LiniaMarques lm = new LiniaMarques(); Marques mm = new Marques(false, Marca.grup1); Marques excepte = new Marques(false); int iniTros = 0; int midaTros; foreach (Match match in condicions.Matches(linia)) { midaTros = match.Index - iniTros; if (midaTros > 0) lm.Nou(linia.Substring(iniTros, midaTros), mm, excepte.Buit ? null : excepte); if (match.Groups[2].Value == "<<") { string grup = match.Groups[3].Value; if (grup == "EXT") { lm.PosaMarca(Marca.grup1); mm.Menys(Marca.grup1); mm.Mes(Marca.grup2); } else { if (grup.StartsWith("!")) excepte.Mes(Marca.Una(grup.Substring(1))); else mm.Mes(Marca.Una(grup)); } } else if (match.Groups[6].Value == ">>") { string grup = match.Groups[5].Value; if (grup == "EXT") { mm.Menys(Marca.grup2); mm.Mes(Marca.grup1); // PERFER: mirar si hi pot haver més de dos grups } else { if (grup.StartsWith("!")) excepte.Menys(Marca.Una(grup.Substring(1))); else mm.Menys(Marca.Una(grup)); } } iniTros = match.Index + match.Length; } return lm; }
private void test_02(GrupTest arrel) { GrupTest grup = arrel.NouGrup("Fitxer de regles"); Regles regles = null; grup.NouTest("Llegeix fitxer .txt", delegate(RTest resultat) { //regles = new Regles(DirEntrades("regles.txt"); regles = new Regles(DirEntrades("regles.txt")); }); grup.NouTest("Llegeix fitxer .aff", delegate(RTest resultat) { Regles regles2 = Regles.LlegeixAff(DirResultats("prova.aff")); }); grup.NouTest("Marca de dialecte", delegate(RTest resultat) { Marca marca = regles.Marques["000"]; resultat.Esperat("000: Sense condicions", marca.ToString()); }); grup.NouTest("Marques", delegate(RTest resultat) { Marques m1 = new Marques(false, "001", "002", "005", "013", "014", "101", "102", "103"); Marques m1bis = new Marques(false, "001", "002", "005", "013", "014", "101", "102", "103"); resultat.Esperat("001, 002, 005, 013, 014, 101, 102, 103", m1.ToString()); resultat.Assert(m1.Conte("005"), "Conté 005"); resultat.Assert(!m1.Conte("000"), "No conté 000"); resultat.Assert(m1.Conte(Marca.Una("001").Mascara), "Conté 001"); resultat.Assert(!m1.Conte(Marca.Una("000").Mascara), "No conté 000"); Marques m2 = new Marques(false, "101", "102", "103"); resultat.Assert(m1.Conte(m2), "m1 >= m2"); resultat.Assert(!m2.Conte(m1), "!(m2 >= m1)"); resultat.Assert(m1 == m1bis, "Són iguals!"); m1.Mes(Marca.Una("003")); resultat.Esperat("001, 002, 003, 005, 013, 014, 101, 102, 103", m1.ToString()); m1.Menys(Marca.Una("013")); resultat.Esperat("001, 002, 003, 005, 014, 101, 102, 103", m1.ToString()); }); grup.NouTest("Línia amb condicions I", delegate(RTest resultat) { // Suposam la cadena "abc <<001 def 001>> ghi" LiniaMarques lm = new LiniaMarques(); Marca.Crea("_1_", "Grup 1"); Marca.Crea("_2_", "Grup 2"); Marques m = new Marques(false, "_1_"); lm.Nou("abc ", m); m.Mes(Marca.Una("001")); lm.Nou(" def ", m); m.Menys(Marca.Una("001")); lm.Nou(" ghi", m); resultat.Esperat("abc def ghi", lm.Valor(new Marques(false, "_1_", "001"))); resultat.Esperat("abc ghi", lm.Valor(new Marques(false, "_1_"))); resultat.Esperat("", lm.Valor(new Marques(false))); }); grup.NouTest("Línia amb condicions II", delegate(RTest resultat) { regles = new Regles(DirEntrades("regles.txt")); LiniaMarques lm = IdentificadorDIEC.LlegeixLiniaExc("abc <<001 def 001>> ghi <<!002 jkl !002>>"); resultat.Esperat("abc def ghi jkl", lm.Valor(new Marques(false, "_1_", "001")).Trim()); resultat.Esperat("abc ghi jkl", lm.Valor(new Marques(false, "_1_")).Trim()); resultat.Esperat("abc ghi", lm.Valor(new Marques(false, "_1_", "002")).Trim()); resultat.Esperat("", lm.Valor(new Marques(false)).Trim()); }); grup.NouTest("Genera mots", delegate(RTest resultat) { Regla regla = regles.Llista["E"]; List<Mot> mots = regla.Genera("aigua", null, regles, Marques.totes, true); resultat.Esperat("aigües", Mot.LlistaPlana(mots, Cat.Cmp, false)); for (int i = 0; i < mots.Count; i++) resultat.Nota("{0}: {1}", i, mots[i]); }); grup.NouTest("Regles aplicables", delegate(RTest resultat) { Regla regla = regles.Llista["A"]; resultat.Assert(regla.EsAplicable("cantava"), "Es pot aplicar la regla A a 'cantava'"); resultat.Assert(!regla.EsAplicable("cantar"), "No es pot aplicar la regla A a 'cantar'"); }); }