예제 #1
0
 /// <summary>
 /// Crea un mot amb una forma, amb el cas de la regla que l'ha generat i amb informació morfològica
 /// i gramatical. 
 /// La informació morfològica i gramatical del mot és la combinació de la informació provinent del
 /// cas de la regla (casRegla) i la d'info.
 /// </summary>
 /// <param name="forma">La forma del mot.</param>
 /// <param name="casRegla">El cas de la regla a partir del qual s'ha generat el mot.</param>
 /// <param name="extra">Informació morfològica i gramatical que s'afegeix a la del cas de la regla.</param>
 public Mot(string forma, CasRegla casRegla, MorfoGram extra)
 {
     this.forma = forma;
     this.casRegla = casRegla;
     this.extra = extra;
     this.info = null;
 }
 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;
 }
예제 #3
0
 /// <summary>
 /// Diu si aquest cas i un altre tenen les mateixes regles extra (MesRegles).
 /// </summary>
 public bool MateixesMes(CasRegla altre)
 {
     if (mesRegles == null || altre.mesRegles == null)
         return (mesRegles == null && altre.mesRegles == null);
     if (MesRegles.Count != altre.MesRegles.Count)
         return false;
     for (int i = 0; i < MesRegles.Count; i++)
         if (MesRegles[i] != altre.MesRegles[i])
             return false;
     return true;
 }
예제 #4
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;
 }
예제 #5
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;
 }
예제 #6
0
 public void NouCas(CasRegla cas)
 {
     if (casos.Count == 0)
     {
         afinador = getAfinador(reglaOriginal, cas);
         if (afinador != null)
             cas = afinador.ProcessaCas(this, cas);
         if (cas.MesRegles != null)
         {
             foreach (string id in cas.MesRegles)
             {
                 Regla mes = regles.Llista[id];
                 if (reglaOriginal.EsSufix == mes.EsSufix)
                     afixosIguals.Add(mes);
                 else
                     afixosContraris.Add(mes);
             }
         }
         casos.Add(cas);
     }
     else if (afinador != null)
         casos.Add(afinador.ProcessaCas(this, cas));
     else
         casos.Add(cas);
 }
예제 #7
0
 public bool CasPertany(CasRegla cas)
 {
     return cas.MateixesMes(casos[0]);
 }
예제 #8
0
 /// <summary>
 /// Afegeix un nou cas a la regla.
 /// </summary>
 /// <param name="cas">El cas que volem afegir.</param>
 public void NouCas(CasRegla cas)
 {
     casos.Add(cas);
 }
예제 #9
0
 /// <summary>
 /// Processa un cas abans que s'afegesqui al grup.
 /// </summary>
 /// <param name="cas">El cas que està a punt d'afegir-se al grup.</param>
 /// <returns>El cas, eventualment modificat.</returns>
 public abstract CasRegla ProcessaCas(ReglaMyspell grup, CasRegla cas);
예제 #10
0
 public CreaDicMyspellCas(CasRegla cas, Regles regles)
 {
     this.cas = cas;
     this.regles = regles;
 }
 public override CasRegla ProcessaCas(ReglaMyspell grup, CasRegla cas)
 {
     AfinaParticipiIR.grup = grup;
     if (cas.Info.Nbre == MorfoGram.eNbre.SG && cas.Info.Gen == MorfoGram.eGen.M)
         casosMascSg.Add(cas);
     string condicio = cas.Condicio.Substring(0, cas.Condicio.Length - 3) + cas.Afegir[0] + "t";
     return new CasRegla(grup.ReglaOriginal, cas.Afegir[0] + "t", cas.Afegir, condicio, grup.ReglaOriginal.EsSufix,
         cas.Marca, cas.Info, cas.MesRegles);
 }
 public override CasRegla ProcessaCas(ReglaMyspell grup, CasRegla cas)
 {
     return new CasRegla(grup.ReglaOriginal, "at", cas.Afegir, "at", grup.ReglaOriginal.EsSufix,
         cas.Marca, cas.Info, cas.MesRegles);
 }
 public override CasRegla ProcessaCas(ReglaMyspell grup, CasRegla cas)
 {
     return new CasRegla(grup.ReglaOriginal, "m", cas.Afegir.Substring(1), cas.Suprimir[0] + "m",
         grup.ReglaOriginal.EsSufix, cas.Marca, cas.Info, cas.MesRegles);
 }