bool ETMRFAS::SyntDetailne( MRFTULEMUSED &valja, const FSXSTRING *pGeneSona, const FSXSTRING *pnaidis, const FSXSTRING *pGeneLiik, const FSXSTRING *pGeneVormid, const FSXSTRING *pGeneKigi) { assert(&valja!=NULL && pGeneSona!=NULL && pnaidis!=NULL && pGeneVormid!=NULL && pGeneKigi!=NULL); //MRFTULEMUSED *mrfTul; int n; valja.Stop(); valja.Start(5,5); valja.s6na = *pGeneSona; if (pnaidis->GetLength() > 0) { valja.s6na += FSxSTR(" ("); valja.s6na += *pnaidis; valja.s6na += FSxSTR(")"); } valja.s6na += FSxSTR(" //_"); valja.s6na += *pGeneLiik; valja.s6na += FSxSTR("_ "); valja.s6na += *pGeneVormid; valja.s6na += FSxSTR(" // "); valja.s6na += *pGeneKigi; adHocString=FSxSTR(""); valja.eKustTulemused = eMRF_XX; // see peaks tegelt olema pValja tekitamise kohas... HJK aprill 2005 // Ei. See ütleb, et vaikimisi me ei tea kust analüüs pärit. // Seal, kus me tulemuse saime, asendame selle // konstandiga, kust tulemus tegelikult tuli. // Nii et päeva lõpuks peaks olema eMRF_XX asemel // midagi muud. Aga igaks juhuks initsialiseerime // ta selliselt. MRF_FLAGS_BASE_TYPE geneLipud = mrfFlags->Get(); FSXSTRING mrfAnal; // vaja morfida, kusjuures liiga pikad oleksid valed ja lühendeid üldse ei oleta mrfFlags->On(MF_MRF|MF_PIKADVALED|MF_LYHREZH); mrfFlags->Off(MF_KR6NKSA); // tsükeldame üle tyhikuga eraldet sonade // (ei tea kas seda tegelikult kunagi juhtub ka?) int vasak=0, parem=0; FSXSTRING GeneSona1, tmp; n = 0; tmp = *pGeneSona; tmp.Trim(); for (; tmp.GetLength() > 0; tmp = tmp.Mid(vasak)) { parem = tmp.Find((FSxCHAR)' '); if (parem == -1) parem = tmp.GetLength(); // viimase lõpus polnud tyhikut GeneSona1=tmp.Left(parem); GeneSona1.Trim(); // igaks juhuks, kes kurat teab vasak=parem+1; ETMRFA::Set1(GeneSona1); // morfi magasini n++; } LYLI morfistLyli; if(ETMRFA::Flush(morfistLyli)==false) // morfi magasinist { ETMRFA::Clr(); mrfFlags->Set(geneLipud); // taastame endised lipud return false; } assert( morfistLyli.lipp & PRMS_MRF ); // mrfTul=morfistLyli.ptr.pMrfAnal; if(morfistLyli.ptr.pMrfAnal->on_tulem()) // õnnestus analüüsida { if(morfistLyli.ptr.pMrfAnal->mitmeS6naline != n) { // pole õige mitmesõnaline //delete pLyli; ETMRFA::Clr(); mrfFlags->Set(geneLipud); // taastame endised lipud return false; } } if (a.idxLast != 0) { // nt. taheti geneda mitmesõnalist, aga seda ei õnnestunud analüüsida //delete pLyli; ETMRFA::Clr(); mrfFlags->Set(geneLipud); // taastame endised lipud return false; } mrfFlags->Set(geneLipud); // taastame endised lipud if(morfistLyli.ptr.pMrfAnal->on_tulem()) // õnnestus analüüda { bool rs; //mrfTul=morfistLyli.ptr.pMrfAnal; FSXSTRING gv = *pGeneVormid; gv.Trim(); if(gv==FSWSTR("*,")) { gv= FSWSTR("adt, b, d, da, des, ge, gem, gu, ") FSWSTR("ks, ksid, ksime, ksin, ksite, ") FSWSTR("ma, maks, mas, mast, mata, me, ") FSWSTR("n, neg, neg ge, neg gem, neg gu, neg ks, neg nud, neg nuks, neg o, neg vat, ") FSWSTR("nud, nuks, nuksid, nuksime, nuksin, nuksite, nuvat, ") FSWSTR("o, pl ab, pl abl, pl ad, pl all, pl el, pl es, ") FSWSTR("pl g, pl ill, pl in, pl kom, pl n, pl p, pl ter, pl tr, ") FSWSTR("s, sg ab, sg abl, sg ad, sg all, sg el, sg es, sg g, sg ill, sg in, sg kom, ") FSWSTR("sg n, sg p, sg ter, sg tr, ") FSWSTR("sid, sime, sin, site, ") FSWSTR("ta, tagu, taks, takse, tama, tav, tavat, te, ti, tud, tuks, tuvat, v, vad, vat,"); } rs = Gene2Detailne(&valja, morfistLyli.ptr.pMrfAnal, pnaidis, pGeneLiik, &gv, pGeneKigi); if (rs == false) return false; if (valja.idxLast > 0) // õnnestus sünteesida return true; // ei suutnud sünteesida ... if (morfistLyli.ptr.pMrfAnal->eKustTulemused == eMRF_AP) // tulemus põhisõnastikust { // ilmselt oli sisendsõna mingi tuntud sõna mitte-algvorm if (morfistLyli.ptr.pMrfAnal->s6na.Right(3) == FSxSTR("nud") || morfistLyli.ptr.pMrfAnal->s6na.Right(3) == FSxSTR("tud") || morfistLyli.ptr.pMrfAnal->s6na.Right(3) == FSxSTR("dud")) return ArvaGene2(&valja, morfistLyli.ptr.pMrfAnal, pGeneLiik, &gv, pGeneKigi); else return false; } // analüüs oletatud või abisõnastikust if (mrfFlags->Chk(MF_OLETA)) { // oli nt blabla-sõna, s.t. et lõpus on tavaline tuntud sõna // või oli blablalik, s.t. lõpus on regulaarne sufiks return ArvaGene2(&valja, morfistLyli.ptr.pMrfAnal, pGeneLiik, &gv, pGeneKigi); } } // tundmatu sõna return false; }