public ReglaMyspell(Regla reglaOriginal, Regles regles, GetAfinaReglaMyspell getAfinaGrup)
 {
     this.reglaOriginal = reglaOriginal;
     this.regles = regles;
     casos = new List<CasRegla>();
     afixosContraris = new List<Regla>();
     afixosIguals = new List<Regla>();
     getAfinador = getAfinaGrup;
     afinador = null;
     regla = null;
 }
 private Regles AMyspell(string nomFitxer, List<ItemDic> itemsVells, Marques filtre,
     Comparison<string> comparador, GetAfinaReglaMyspell afinaRegla)
 {
     Regles novesRegles = new Regles();
     novesRegles.regles = new Dictionary<string, Regla>();
     novesRegles.marques = new Dictionary<string, Marca>(marques);
     novesRegles.descripcio = new List<string>(descripcio);
     novesRegles.set = set;
     novesRegles.caracters = caracters;
     novesRegles.rep = rep;
     char nomNou = '1';
     char nomNouInv = 'a';
     Dictionary<string, List<ReglaMyspell>> vellANou = new Dictionary<string, List<ReglaMyspell>>();
     foreach (KeyValuePair<string, Regla> kvReglaVella in regles)
     {
         string idReglaVella = kvReglaVella.Key;
         Regla reglaVella = kvReglaVella.Value;
         vellANou.Add(idReglaVella, new List<ReglaMyspell>());
         List<ReglaMyspell> reglesMyspell = reglaVella.GrupsMyspell(this, filtre, afinaRegla);
         int maxCasos = 0;
         ReglaMyspell millorRegla = null;
         foreach (ReglaMyspell regla in reglesMyspell)
             if (regla.EsRegla && regla.NCasos > maxCasos)
             {
                 maxCasos = regla.NCasos;
                 millorRegla = regla;
             }
         foreach (ReglaMyspell regla in reglesMyspell)
         {
             string id;
             string desc;
             if (regla == millorRegla)
             {
                 id = reglaVella.Id;
                 desc = reglaVella.Descripcio;
             }
             else
             {
                 desc = string.Format("Part de la regla {0} ({1})", reglaVella.Id,
                     reglaVella.Descripcio);
                 if (regla.EsRegla)
                 {
                     id = nomNou.ToString();
                     ++nomNou;
                 }
                 else
                 {
                     id = nomNouInv.ToString();
                     ++nomNouInv;
                 }
             }
             regla.Descripcio = desc;
             regla.Id = id;
             vellANou[idReglaVella].Add(regla);
             if (regla.EsRegla)
                 novesRegles.regles[id] = regla.Regla;
         }
     }
     List<ItemDic> itemsNous = new List<ItemDic>();
     Dictionary<string, List<CreaDicMyspell>> creadors = new Dictionary<string, List<CreaDicMyspell>>();
     foreach (ItemDic itemVell in itemsVells)
     {
         string flags = itemVell.FlagsComLletres;
         if (!creadors.ContainsKey(flags))
             creadors.Add(flags, CreaDicMyspell.GeneraCreadors(itemVell, vellANou, novesRegles));
         foreach (CreaDicMyspell creador in creadors[flags])
         {
             ItemDic itemNou = creador.Converteix(itemVell);
             if (itemNou != null)
                 itemsNous.Add(itemNou);
         }
     }
     // Unim tots els ítems que comparteixen la mateixa arrel
     // Ho feim per una limitació de MySpell, que no permet arrels repetides,
     // a diferència d'Hunspell.
     itemsNous = ItemDic.CompactaLlista(itemsNous, comparador);
     StreamWriter sw = new StreamWriter(nomFitxer + ".dic", false, Encoding.Default);
     sw.WriteLine(itemsNous.Count);
     foreach (ItemDic item in itemsNous)
         sw.WriteLine(item.ToString());
     sw.Close();
     return novesRegles;
 }
 /// <summary>
 /// Genera una llista de GrupMyspell
 /// </summary>
 public List<ReglaMyspell> GrupsMyspell(Regles regles, Marques filtre, GetAfinaReglaMyspell getAfina)
 {
     List<ReglaMyspell> grups = new List<ReglaMyspell>();
     foreach (CasRegla cas in casos)
     {
         if (!filtre.Conte(cas.Marca))
             continue;
         ReglaMyspell grup = grups.Find(delegate(ReglaMyspell g) { return g.CasPertany(cas); });
         if (grup == null)
         {
             grup = new ReglaMyspell(this, regles, getAfina);
             grups.Add(grup);
         }
         grup.NouCas(cas);
     }
     return grups;
 }
 public void GeneraAffDicMyspell(string nomFitxer, List<Entrada> entrades, Marques filtre, 
     Comparison<string> comparador, GetAfinaReglaMyspell afinaRegla)
 {
     List<ItemDic> itemsVells = Entrada.GeneraItemsDic(entrades, filtre, Entrada.Speller.HUNSPELL, comparador);
     Regles reglesMyspell = AMyspell(nomFitxer, itemsVells, filtre, comparador, afinaRegla);
     reglesMyspell.CreaFitxerAff(nomFitxer, filtre);
 }