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; }
/// <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; }
/// <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(); }
/// <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); }
/// <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; }
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; }
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; }
/// <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; }