/// <summary> /// Crea sumant els valors de dos objectes MorfoGram. /// Per als objectes inexistents, se suposa el valor NOCAT, NOTEMPS, etc. /// Si els valors són incompatibles, es provoca una excepció. /// </summary> /// <param name="mf1">El primer MorfoGram</param> /// <param name="mf2">El segon MorfoGram</param> public MorfoGram(MorfoGram mf1, MorfoGram mf2) { if (mf1 == null && mf2 == null) return; if (mf1 == null || mf2 == null) { MorfoGram mfx = (mf1 != null) ? mf1 : mf2; cat = mfx.Cat; temps = mfx.Temps; pers = mfx.Pers; gen = mfx.Gen; nbre = mfx.Nbre; return; } if (Unificables(mf1, mf2)) { cat = (mf1.Cat != eCat.NOCAT) ? mf1.Cat : mf2.Cat; temps = (mf1.Temps != eTemps.NOTEMPS) ? mf1.Temps : mf2.Temps; pers = (mf1.Pers != ePers.NOPERS) ? mf1.Pers : mf2.Pers; gen = (mf1.Gen != eGen.NOGEN) ? mf1.Gen : mf2.Gen; nbre = (mf1.Nbre != eNbre.NONBRE) ? mf1.Nbre : mf2.Nbre; } else { if ((mf1.Cat != eCat.NOCAT) && (mf2.Cat != eCat.NOCAT) && (mf1.Cat != mf2.Cat)) throw new Exception(String.Format("Categories incompatibles ({0}, {1})", mf1.ToString(), mf2.ToString())); if ((mf1.Temps != eTemps.NOTEMPS) && (mf2.Temps != eTemps.NOTEMPS) && (mf1.Temps != mf2.Temps)) throw new Exception(String.Format("Temps incompatibles ({0}, {1})", mf1.ToString(), mf2.ToString())); if ((mf1.Pers != ePers.NOPERS) && (mf2.Pers != ePers.NOPERS) && (mf1.Pers != mf2.Pers)) throw new Exception(String.Format("Persones incompatibles ({0}, {1})", mf1.ToString(), mf2.ToString())); if ((mf1.Gen != eGen.NOGEN) && (mf2.Gen != eGen.NOGEN) && (mf1.Gen != mf2.Gen)) throw new Exception(String.Format("Gèneres incompatibles ({0}, {1})", mf1.ToString(), mf2.ToString())); if ((mf1.Nbre != eNbre.NONBRE) && (mf2.Nbre != eNbre.NONBRE) && (mf1.Nbre != mf2.Nbre)) throw new Exception(String.Format("Categories incompatibles ({0}, {1})", mf1.ToString(), mf2.ToString())); } }
private void test_04(GrupTest arrel) { GrupTest grup = arrel.NouGrup("Entrades i mots"); Regles regles = CarregaRegles(true); Identificador idDIEC = new IdentificadorDIEC("*** buit ***", regles, null); grup.NouTest("Entrades ignorades", delegate(RTest resultat) { Entrada entrada; Regex trosseja = new Regex(@"\|\|"); string entrades = "ent=-adelf -adelfa||ent=ab-"; foreach (string tros in trosseja.Split(entrades)) { entrada = idDIEC.IdentificaEntrada(tros); resultat.Assert(entrada == null, "S'hauria d'ignorar \"{0}\"", tros); } }); grup.NouTest("Neteja d'entrades", delegate(RTest resultat) { Entrada entrada; entrada = idDIEC.IdentificaEntrada("ent=a1^cat1=f.^com1=pl. as"); resultat.Esperat("a", entrada.Arrel); entrada = idDIEC.IdentificaEntrada("ent=abaltir-se^cat1=v. pron."); resultat.Esperat("abaltir", entrada.Arrel); entrada = idDIEC.IdentificaEntrada("ent=abastador2 abastadora^cat1=m. i f."); resultat.Esperat("abastador abastadora", entrada.Arrel); }); grup.NouTest("Informació morfològica i gramatical", delegate(RTest resultat) { MorfoGram mf1 = new MorfoGram(); resultat.Esperat("ND", mf1.ToString()); MorfoGram mf2 = new MorfoGram(MorfoGram.eCat.NOM); resultat.Esperat("NOM", mf2.ToString()); MorfoGram mf12 = new MorfoGram(mf1, mf2); resultat.Esperat("NOM", mf12.ToString()); MorfoGram mf3 = new MorfoGram(MorfoGram.eCat.VERB); try { MorfoGram mf23 = new MorfoGram(mf2, mf3); resultat.Error("Error indetectat unint {0} i {1}", mf2, mf3); } catch (Exception exc) { resultat.Nota("Error esperat intentant unir {0} i {1} ({2})", mf2, mf3, exc.Message); } MorfoGram mf4 = new MorfoGram(MorfoGram.eCat.NOCAT, MorfoGram.eTemps.IPR, MorfoGram.ePers.P3); resultat.Esperat("IPR.P3", mf4.ToString()); MorfoGram mf34 = new MorfoGram(mf3, mf4); resultat.Esperat("VERB.IPR.P3", mf34.ToString()); }); }
/// <summary> /// Crea amb informació morfogramatical. /// No admet a cap tros. /// </summary> /// <param name="mgComuna">Informació morfològica i gramatical comuna a totes les formes.</param> public PC_trossos(MorfoGram mgComuna) : base(mgComuna.ToString() + ", D-, L-") { this.mgComuna = mgComuna; admetD = false; admetL = false; esLlista = false; mgArrel = null; }
/// <summary> /// Crea amb informació morfogramatical. /// </summary> /// <param name="mgComuna">Informació morfològica i gramatical comuna a totes les formes.</param> /// <param name="admetD">Admet "d'".</param> /// <param name="admetL">Admet "l'".</param> /// <param name="esLlista">Si els trossos són una llista. Si és true, admetD i admetL /// afecten tots els trossos. Si és false, només afecten el primer tros.</param> public PC_trossos(MorfoGram mgComuna, bool admetD, bool admetL, bool esLlista) : base(mgComuna.ToString() + (admetD ? ", D+" : ", D-")) { this.mgComuna = mgComuna; this.admetD = admetD; this.admetL = admetL; this.esLlista = esLlista; mgArrel = null; }
/// <summary> /// Crea a partir del plural i amb informació d'apostrofació. /// </summary> /// <param name="mgComuna">Informació morfològica i gramatical comuna a totes les formes.</param> /// <param name="singular">Paraula en singular</param> /// <param name="plural">Plural precalculat.</param> /// <param name="admetD">Totes les formes admeten la preposició "de" apostrofada.</param> /// <param name="admetL">El singular admet l'article apostrofat.</param> public PC_plural_precalc(MorfoGram mgComuna, Paraula singular, string plural, bool admetD, bool admetL) : base(mgComuna.ToString() + " " /*+ singular + "/" + plural*/ + (admetD ? ", d'" : "") + (admetL ? ", l'" : "")) { this.mgComuna = mgComuna; mgArrel = null; this.singular = singular.Forma; this.plural = plural; // Interpretam la notació "abacà -às" if (plural.StartsWith("-")) this.plural = singular.PreTonica + plural.Substring(1); // PERFER: mirar si és aplicable la regla 'E' this.admetD = admetD; this.admetL = admetL; }