public override ItemDic Converteix(ItemDic itemVell) { string arrel = Arrel(itemVell); ItemDic nou = new ItemDic(arrel); foreach (string idRegla in nousFlags) if (regles.Llista[idRegla].EsAplicable(arrel)) nou.MesFlags(idRegla); return nou; }
/// <summary> /// Compacta una llista d'ítems. /// Torna una llista amb la longitud mínima i ordenada. /// Uneix els ítems que tenguin la mateixa arrel i siguin compatibles. /// El procés d'unió es repeteix fins que es pugui. /// La informació morfològica i gramatical dels ítems es perd. /// </summary> /// <param name="llista">La llista d'entrada, segurament amb repeticions i ítems que es poden unir.</param> /// <param name="regles">Les regles per interpretar els flags dels ítems.</param> /// <param name="comparador">Una funció per ordenar la llista resultant.</param> /// <returns>Una llista compactada.</returns> public static List<ItemDic> CompactaLlista(List<ItemDic> llista, Regles regles, Comparison<string> comparador) { Dictionary<string, List<ItemDic>> unics = new Dictionary<string, List<ItemDic>>(); foreach (ItemDic item in llista) { if (!unics.ContainsKey(item.Arrel)) unics.Add(item.Arrel, new List<ItemDic>()); ItemDic nou = new ItemDic(item.Arrel); nou.MesFlags(item); List<ItemDic> grup = unics[item.Arrel]; grup.Add(nou); while (grup.Count > 1) { bool canvis = false; for(int i=0; i<grup.Count - 1; i++) { for (int j = i + 1; j < grup.Count; j++) { ItemDic item1 = grup[i]; ItemDic item2 = grup[j]; if (item1.FlagsCompatibles(item2, regles)) { item1.MesFlags(item2); grup.Remove(item2); canvis = true; break; } } if (canvis) break; } break; } } List<ItemDic> llistaNova = new List<ItemDic>(unics.Count * 2); foreach (List<ItemDic> grup in unics.Values) llistaNova.AddRange(grup); llistaNova.Sort(delegate(ItemDic item1, ItemDic item2) { int cmp = comparador(item1.Arrel, item2.Arrel); return (cmp != 0) ? cmp : string.Compare(item1.FlagsComLletres, item2.FlagsComLletres); }); return llistaNova; }
public override ItemDic Converteix(ItemDic itemVell) { string arrel = Arrel(itemVell); if (!cas.EsAplicable(arrel)) return null; List<Mot> mots = new List<Mot>(); if (cas.Genera(arrel, ref mots, null, regles, Marques.totes, true) != 1) throw new Exception("S'esperava un mot"); ItemDic nou = new ItemDic(mots[0].Forma); foreach (string idRegla in nousFlags) if (regles.Llista[idRegla].EsAplicable(nou.Arrel)) nou.MesFlags(idRegla); return nou; }
/// <summary> /// Torna una llista d'ItemDic aplanada. /// Els ítems de la llista nova només contenen flags per a regles amb EsSufix = false. /// </summary> /// <param name="items">La llista d'ítems que volem aplanar.</param> /// <param name="regles">La llista de regles que emprarem.</param> /// <param name="filtre">Només es generen mots que tenen marques contingudes en aquest filtre.</param> /// <returns>La llista aplanada.</returns> public static List<ItemDic> Aplana(List<ItemDic> items, Regles regles, Marques filtre) { // PERFER: No desplegar els futurs i els condicionals, ja que són sempre regulars (?) List<ItemDic> llista = new List<ItemDic>(); foreach (ItemDic item in items) { string arrel = item.Arrel; List<Regla> aff = null; List<string> noAff = new List<string>(); foreach (string idRegla in item.LlistaFlags) { Regla regla = regles.Llista[idRegla]; if (regla.EsAfix) { if (aff == null) aff = new List<Regla>(); aff.Add(regla); } else { noAff.Add(idRegla); } } if (aff == null) { // PER_FER: mirar si no hem de posar totes les regles de noaff llista.Add(item); } else // (aff != null) { ItemDic nou = null; // Afegim l'arrel nua nou = new ItemDic(arrel, noAff.ToArray()); nou.MesMorfoGram(item.mgComuna, item.mgArrel); llista.Add(nou); // Afegim els mots generats per les regles d'aff foreach (Regla regla in aff) { List<Mot> mots = new List<Mot>(); foreach (CasRegla cas in regla.Casos) { mots.Clear(); int generats = cas.Genera(arrel, ref mots, item.mgComuna, regles, filtre, true); if (generats == 0) continue; if (generats > 1) throw new Exception("S'esperava un sol mot per al cas"); Mot mot = mots[0]; nou = new ItemDic(mot.Forma); if (regla.EsCombinable) foreach (string id in noAff) { Regla reglaNoAff = regles.Llista[id]; if (reglaNoAff.EsCombinable && reglaNoAff.EsAplicable(nou.Arrel)) nou.MesFlags(id); } if (cas.MesRegles != null) { foreach (string id in cas.MesRegles) { Regla reglaExtra = regles.Llista[id]; if (reglaExtra.EsAplicable(nou.Arrel)) nou.MesFlags(id); } } nou.MesMorfoGram(item.mgComuna, mot.Info); llista.Add(nou); } } } } return llista; }
private void test_01(GrupTest arrel) { GrupTest grup = arrel.NouGrup("ItemDic"); ItemDic id1 = null, id2 = null; grup.NouTest("Crea amb arrel i flags (string)", delegate(RTest resultat) { id2 = new ItemDic("xyz", "C", "Z", "z"); resultat.Esperat("xyz/CZz", id2.ToString()); }); grup.NouTest("Flags admissibles", delegate(RTest resultat) { try { ItemDic id = new ItemDic("xyz", "ab"); resultat.Error("No s'ha impedit l'ús d'un flag il·legal"); } catch (ItemDicException) { resultat.Nota("S'ha impedit l'ús d'un flag il·legal"); } }); grup.NouTest("Crea amb arrel i flags (string)", delegate(RTest resultat) { id1 = new ItemDic("xyz", "C"); resultat.Esperat("xyz/C", id1.ToString()); id1.MesFlags("D"); resultat.Esperat("xyz/CD", id1.ToString()); id2 = new ItemDic("xyz", "E"); id1.MesFlags(id2); resultat.Esperat("xyz/CDE", id1.ToString()); }); }
public override void Genera(Dictionary<string, string> dades, Dictionary<string, string> excepcions, Marques filtre, List<ItemDic> items) { ItemDic item = new ItemDic(forma); if (admetD) item.MesFlags("Y"); if (admetL) item.MesFlags("V"); items.Add(item); }
public override void Genera(Dictionary<string, string> dades, Dictionary<string, string> excepcions, Marques filtre, List<ItemDic> items) { string arrel0, arrel1; arrel0 = Arrel0(dades["arrel"], out arrel1); int numArrel = (mgComuna.Gen == MorfoGram.eGen.F) ? 1 : 0; ItemDic item = new ItemDic((numArrel == 1) ? arrel1 : arrel0, regla); item.MesMorfoGram(mgComuna, mgArrel); if (admetD) item.MesFlags("Y"); if (admetL) { if (numArrel == 0) item.MesFlags("V"); else { Paraula paraula = new Paraula(arrel1); if (paraula.PotApostrofar(true)) item.MesFlags("V"); } } items.Add(item); }
public override void Genera(Dictionary<string, string> dades, Dictionary<string, string> excepcions, Marques filtre, List<ItemDic> items) { ItemDic item = new ItemDic(dades["arrel"]); item.MesMorfoGram(mgComuna, null); if (admetD) item.MesFlags("Y"); if (admetL) item.MesFlags("V"); if (admetN) item.MesFlags("W"); items.Add(item); }