예제 #1
0
 public static List<ItemDic> GeneraItemsDic(IEnumerable<Entrada> entrades, Marques filtre,
     Speller speller, Comparison<string> comparador)
 {
     List<ItemDic> llista = new List<ItemDic>();
     Marques filtreExc = new Marques(filtre);
     Dictionary<string, string> dades;
     foreach (Entrada ent in entrades)
     {
         if (!filtre.Conte(ent.Marques))
             continue;
         List<ItemDic> ids = new List<ItemDic>();
         Paradigma par = null;
         if (ent.Excepcions == null)
         {
             par = ent.Identificador.IdentificaParadigma(ent.Dades, null);
             ids.AddRange(par.GeneraDic(ent.Dades, null, filtre, speller));
             llista.AddRange(ids);
         }
         else
         {
             for (int g = 1; g <= 2; g++)
             {
                 Marca grup = (g == 1) ? Marca.grup1 : Marca.grup2;
                 if (!ent.Excepcions.Contingut.Conte(grup))
                     continue;
                 filtreExc.Menys(Marca.grups12);
                 filtreExc.Mes(grup);
                 Dictionary<string, string> excepcions = ent.Excepcions.Contingut.Valors(filtreExc);
                 dades = new Dictionary<string, string>(ent.Dades);
                 if (excepcions.ContainsKey("MODEL"))
                 {
                     string[] model = excepcions["MODEL"].Split('/');
                     if (excepcions.Count == 1)
                         AplicaModel(dades, out excepcions, model, ent.Identificador.Excepcio(model[0]).Contingut, filtreExc);
                     else
                     {
                         // A part del model, hi ha més dades
                         Dictionary<string, string> excepcionsOriginals = new Dictionary<string,string>(excepcions);
                         AplicaModel(dades, out excepcions, model, ent.Identificador.Excepcio(model[0]).Contingut, filtreExc);
                         foreach (KeyValuePair<string, string> kv in excepcionsOriginals)
                             excepcions[kv.Key] = kv.Value;
                     }
                 }
                 if (excepcions.ContainsKey("IGNORA")) // sempre deu ser IGNORA=1
                     continue;
                 if (excepcions.ContainsKey("ALT"))
                     dades["arrel"] = excepcions["ALT"];
                 if (excepcions.ContainsKey("NOVACAT"))
                     dades["cat1"] = excepcions["NOVACAT"];
                 par = ent.Identificador.IdentificaParadigma(dades, excepcions);
                 ids.AddRange(par.GeneraDic(dades, excepcions, filtre, speller));
             }
             llista.AddRange(ids);
         }
         foreach (ItemDic id in ids)
         {
             id.Entrada = ent;
             if (id.Paradigma == null)
                 id.Paradigma = par;
         }
     }
     llista.Sort(delegate(ItemDic id1, ItemDic id2)
     {
         return comparador(id1.Arrel, id2.Arrel);
     });
     return llista;
 }
 /// <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;
 }
예제 #3
0
 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'");
     });
 }