コード例 #1
0
 public static AfinaReglaMyspell GetAfinaMyspell(Regla reglaBase, CasRegla cas)
 {
     if (reglaBase.Id == "A" && cas.Info.Temps == MorfoGram.eTemps.PAR)
         return new AfinaParticipiAR();
     if (reglaBase.Id == "M" && cas.Info.Temps == MorfoGram.eTemps.PAR)
         return new AfinaParticipiIR();
     if (reglaBase.Id == "R" && cas.Info.Temps == MorfoGram.eTemps.IPR)
         return new AfinaGerundiER();
     return null;
 }
コード例 #2
0
 /// <summary>
 /// Crea un cas per a una regla.
 /// </summary>
 /// <param name="regla">La regla a la qual pertany aquest cas.</param>
 /// <param name="suprimir">Els caràcters que s'han de suprimir. S'eliminen del principi
 /// o del final, segons si és prefix o sufix. Si és "0", no se suprimeix res.</param>
 /// <param name="afegir">El que s'ha d'afegir a l'arrel després de suprimir-ne caràcters, si cal.
 /// Se suprimeix del principi o del final, segons si és prefix o sufix.</param>
 /// <param name="condicio">La condició que ha de complir l'arrel perquè aquest cas sigui aplicable.</param>
 /// <param name="sufix">Si és true, es modifica el començament de l'arrel. Si és false, es
 /// modifica el final de l'arrel.</param>
 /// <param name="marca">La marca dialectal associada a aquest cas.</param>
 /// <param name="info">Informació morfològica i gramatical.</param>
 /// <param name="mesRegles">Regles que es poden aplicar després d'haver aplicat aquest cas.
 /// Correspon al "twofold" introduït per Hunspell.</param>
 public CasRegla(Regla regla, string suprimir, string afegir, string condicio, bool sufix, Marca marca, MorfoGram info, List<string> mesRegles)
 {
     this.regla = regla;
     this.sSuprimir = suprimir;
     this.suprimir = (suprimir == "0") ? 0 : suprimir.Length;
     this.afegir = afegir;
     sCondicio = condicio;
     if (condicio == ".")
         this.condicio = null;
     else if (sufix)
         this.condicio = new Regex(condicio + "$");
     else
         this.condicio = new Regex("^" + condicio);
     this.sufix = sufix;
     this.marca = marca;
     this.info = info;
     if (mesRegles != null)
     {
         this.mesRegles = new List<string>(mesRegles);
         this.mesRegles.Sort(string.Compare);
     }
     else
         this.mesRegles = null;
 }
コード例 #3
0
 /// <summary>
 /// Genera la línia corresponent a aquest cas per al fitxer .aff.
 /// </summary>
 /// <param name="regla">La regla de la qual forma part aquest cas.</param>
 /// <param name="nouId">L'identificador que farem servir per als casos.</param>
 /// <param name="regles">Les regles en vigor (per als flags "twofold")</param>
 /// <returns>Una línia per al fitxer .aff.</returns>
 public string GeneraAff(Regla regla, string nouId, Regles regles)
 {
     StringBuilder sb = new StringBuilder();
     sb.AppendFormat("{0}FX {1} {2} {3}", sufix ? "S" : "P", nouId, sSuprimir, afegir);
     if (mesRegles != null)
     {
         sb.Append("/");
         foreach (string id in mesRegles)
             sb.Append(regles.Llista[id].IdCombinable);
     }
     sb.AppendFormat(" {0}", sCondicio);
     return sb.ToString();
 }
コード例 #4
0
 /// <summary>
 /// Genera la línia corresponent a aquest cas per al fitxer .aff.
 /// </summary>
 /// <param name="regla">La regla de la qual forma part aquest cas.</param>
 /// <param name="regles">Les regles en vigor (per als flags "twofold")</param>
 /// <returns>Una línia per al fitxer .aff.</returns>
 public string GeneraAff(Regla regla, Regles regles)
 {
     return GeneraAff(regla, regla.Id, regles);
 }
コード例 #5
0
 /// <summary>
 /// Crea un cas a partir d'una línia del fitxer de regles.
 /// </summary>
 /// <param name="linia">Les dades del cas.
 /// Exemple: "000     ua     ües         [gq]ua           # aigües, siliqües".</param>
 /// <param name="regla">La regla a la qual pertany aquest cas.</param>
 /// <param name="marques">La llista de marques disponibles. Se'n selecciona una a partir de la línia.</param>
 /// <returns>El cas tot just creat.</returns>
 public static CasRegla Crea(string linia, Regla regla, Dictionary<string, Marca> marques)
 {
     Match match = rePartsCas.Match(linia);
     if (!match.Success)
         throw new Exception("Error de format: " + linia);
     Marca marca = marques[match.Groups[1].Value];
     string suprimir = match.Groups[2].Value;
     string afegir = match.Groups[3].Value;
     string condicio = match.Groups[4].Value;
     MorfoGram.eCat cat = MorfoGram.eCat.NOCAT;
     MorfoGram.eTemps temps = MorfoGram.eTemps.NOTEMPS;
     MorfoGram.ePers pers = MorfoGram.ePers.NOPERS;
     MorfoGram.eGen gen = MorfoGram.eGen.NOGEN;
     MorfoGram.eNbre nbre = MorfoGram.eNbre.NONBRE;
     List<CasRegla> anteriors = regla.Casos;
     if (anteriors.Count > 0) {
         CasRegla anterior = anteriors[anteriors.Count - 1];
         MorfoGram info = anterior.Info;
         if (info != null)
         {
             cat = info.Cat;
             temps = info.Temps;
             pers = info.Pers;
             gen = info.Gen;
             nbre = info.Nbre;
         }
     }
     string nota = match.Groups[5].Value;
     AgafaInfo(ref cat, ref temps, ref gen, ref nbre, nota);
     #region Tenim un verb
             if (cat == MorfoGram.eCat.VERB)
     {
         // Els verbs tenen un segon nivell d'informació, amb un nombre d'1 a 6
         match = rePers.Match(nota);
         if (match.Success)
         {
             int p = int.Parse(match.Groups[1].Value);
             // PERFER: posar el nombre a les formes temporals?
             switch (p)
             {
                 case 1:
                     if (temps != MorfoGram.eTemps.PAR)
                     {
                         pers = MorfoGram.ePers.P1;
                         gen = MorfoGram.eGen.NOGEN;
                         nbre = MorfoGram.eNbre.NONBRE;
                     }
                     else
                     {
                         pers = MorfoGram.ePers.NOPERS;
                         gen = MorfoGram.eGen.M;
                         nbre = MorfoGram.eNbre.SG;
                     }
                     break;
                 case 2:
                     if (temps != MorfoGram.eTemps.PAR)
                     {
                         pers = MorfoGram.ePers.P2;
                         gen = MorfoGram.eGen.NOGEN;
                         nbre = MorfoGram.eNbre.NONBRE;
                     }
                     else
                     {
                         pers = MorfoGram.ePers.NOPERS;
                         gen = MorfoGram.eGen.M;
                         nbre = MorfoGram.eNbre.PL;
                     }
                     break;
                 case 3:
                     if (temps != MorfoGram.eTemps.PAR)
                     {
                         pers = MorfoGram.ePers.P3;
                         gen = MorfoGram.eGen.NOGEN;
                         nbre = MorfoGram.eNbre.NONBRE;
                     }
                     else
                     {
                         pers = MorfoGram.ePers.NOPERS;
                         gen = MorfoGram.eGen.F;
                         nbre = MorfoGram.eNbre.SG;
                     }
                     break;
                 case 4:
                     if (temps != MorfoGram.eTemps.PAR)
                     {
                         pers = MorfoGram.ePers.P4;
                         gen = MorfoGram.eGen.NOGEN;
                         nbre = MorfoGram.eNbre.NONBRE;
                     }
                     else
                     {
                         pers = MorfoGram.ePers.NOPERS;
                         gen = MorfoGram.eGen.F;
                         nbre = MorfoGram.eNbre.PL;
                     }
                     break;
                 case 5:
                     pers = MorfoGram.ePers.P5;
                     gen = MorfoGram.eGen.NOGEN;
                     nbre = MorfoGram.eNbre.NONBRE;
                     break;
                 case 6:
                     pers = MorfoGram.ePers.P6;
                     gen = MorfoGram.eGen.NOGEN;
                     nbre = MorfoGram.eNbre.NONBRE;
                     break;
             }
         } // Havíem trobat una persona
     } // Teníem un verb
     #endregion
     List<string> mesRegles = null;
     match = reMesRegles.Match(afegir);
     if (match.Success)
     {
         afegir = match.Groups[1].Value;
         string idRegles = match.Groups[2].Value;
         mesRegles = new List<string>();
         foreach (char idRegla in idRegles)
             mesRegles.Add(idRegla.ToString());
     }
     CasRegla cas = new CasRegla(regla, suprimir, afegir, condicio, regla.EsSufix, marca,
         new MorfoGram(cat, temps, pers, gen, nbre), mesRegles);
     return cas;
 }
コード例 #6
0
 private Regla Crea()
 {
     regla = new Regla(Id, Descripcio, reglaOriginal.EsSufix, reglaOriginal.EsCombinable);
     regla.EsAfix = reglaOriginal.EsAfix;
     foreach (CasRegla cas in casos)
     {
         CasRegla nou = new CasRegla(regla, cas.Suprimir, cas.Afegir, cas.Condicio,
             reglaOriginal.EsSufix, cas.Marca, cas.Info, null);
         regla.NouCas(nou);
     }
     return regla;
 }
コード例 #7
0
 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;
 }
コード例 #8
0
 /// <summary>
 /// Torna una llista de regles que només conté els casos que surten a gros però no a petit.
 /// </summary>
 /// <param name="gros">La llista de regles més grossa.</param>
 /// <param name="petit">La llista de regles més petita.</param>
 /// <returns>La llista de regles diferència.</returns>
 public static Regles Diferencia(Regles gros, Regles petit)
 {
     //PER_FER: donar un error si un cas surt a petit però no a gros?
     Regles regles = new Regles();
     Dictionary<string, bool> dinsPetit = new Dictionary<string, bool>();
     foreach (Regla regla in petit.regles.Values)
         foreach (CasRegla cas in regla.Casos)
             dinsPetit[cas.ToString()] = true;
     foreach (Regla regla in gros.regles.Values)
     {
         Regla reglaNova = null;
         foreach (CasRegla cas in regla.Casos)
             if (!dinsPetit.ContainsKey(cas.ToString()))
             {
                 if (reglaNova == null)
                 {
                     reglaNova = new Regla(regla.Id, regla.Descripcio, regla.EsSufix, regla.EsCombinable);
                     regles.regles.Add(reglaNova.Id, reglaNova);
                 }
                 reglaNova.NouCas(cas);
             }
     }
     return regles;
 }