/// <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; }
/// <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; }
/// <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 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); }
public bool CasPertany(CasRegla cas) { return cas.MateixesMes(casos[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); }
/// <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);
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); }