public InfoExcepcio(LiniaMarques contingut, FitxerFont fitxerFont, int liniaFitxerFont)
 {
     this.contingut = contingut;
     this.fitxerFont = fitxerFont;
     this.liniaFitxerFont = liniaFitxerFont;
     emprada = false;
 }
 /// <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 static void AplicaModel(Dictionary<string, string> dades, out Dictionary<string, string> excepcions,
     string[] model, LiniaMarques lmExcepcions, Marques filtre)
 {
     dades["ent"] = AplicaModel(dades["ent"], model);
     dades["arrel"] = AplicaModel(dades["arrel"], model);
     List<string> originals = new List<string>();
     for (int i = 1; i < model.Length; i += 2)
         originals.Add(model[i]);
     string oo = String.Join("|", originals.ToArray());
     Regex cerca = new Regex(string.Format("(^|[=/ ])({0})", oo));
     lmExcepcions = lmExcepcions.AplicaModel(cerca, model);
     excepcions = lmExcepcions.Valors(filtre);
 }
 public override void NovaExcepcio(string ent, LiniaMarques contingut, FitxerFont fitxerFont, int liniaFitxerFont)
 {
     if (excepcions.ContainsKey(ent))
         throw new Exception("Excepció repetida: " + ent);
     excepcions[ent] = new InfoExcepcio(contingut, fitxerFont, liniaFitxerFont);
 }
 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'");
     });
 }
 public abstract void NovaExcepcio(string ent, LiniaMarques contingut, FitxerFont fitxerFont, int liniaFitxerFont);