//bool ETMRFAS::GeneTLDetailne( bool ETMRFAS::GeneTLDetailne( MRFTULEMUSED *pValja, const TYVE_INF *naidise_dptr, const int mitu_naidise_homon, const FSXSTRING *gPrf, // käib tüve ette const FSXSTRING *gTyvi, // algvormi tüvi morf analüüsijast (nt piksel)) const FSxCHAR sl, // sõnaliik, millesse kuuluvaid sõnu tahetakse TYVE_INF *tyveinf, // kõik gTyviga seotud info, mis sõnastikust on leitud const FSXSTRING *geneVormid, // genetavate vormide loend const FSXSTRING *pGeneKigi) { MKT1c *rec1; // siia pannakse gTyvi (nt piksel) lgNr ja tyMuut MKTc *rec; // {lgNr, tyMuut} massiiv, mis on seotud ühe sõnaga; nt tyvedele piksel, piksli, piksle int muutumatu; // muutumatu tüveosa (nt piks) int i, j; FSXSTRING vormityvi; if((rec1=tyveMuutused.Get(tyveinf->idx.tab_idx,tyveinf->idx.blk_idx))==NULL) { return false; } // leia muutumatu tüveosa if((muutumatu=gTyvi->GetLength()-rec1->tyMuut.GetLength()) < 0) { return false; } if((rec=tyveMuutused[tyveinf->idx.tab_idx])==NULL) { return false; } for(i=0; i < rec->n; i++) // vt selle sõna kõiki tüvesid { FSXSTRING tyvi= gTyvi->Left(muutumatu) + rec->mkt1c[i].tyMuut; FSXSTRING tyvi_leksikonis=tyvi; int slTabIdx; int sliike; if (tyvi_leksikonis.Find(FSxSTR(" "))!=-1) tyvi_leksikonis.Replace(FSxSTR(" "), FSxSTR("="), 1); if (cXXfirst(&tyvi_leksikonis, &slTabIdx)!=ALL_RIGHT) { return NULL; } sliike = sonaliik[slTabIdx]->GetLength(); // peab tsükeldama ja sõnaliike ja tab_idx kontrollima, // sest sõnastik on niimoodi tehtud: // homonüümsed tüved (s.h. mittevajalikud) on kuidagi üheskoos... for (j=0; j < sliike; j++) { int jj; for (jj=0; jj < mitu_naidise_homon; jj++) { // kas samas paradigmas on ka näidise tüvi ? if (dptr[j].idx.tab_idx == naidise_dptr[jj].idx.tab_idx) break; } if (mitu_naidise_homon > 0 && jj == mitu_naidise_homon) continue; // ei vasta nõutud paradigmale; nt. tahetakse palgi, aga see on palga if ((*sonaliik[slTabIdx])[j] == sl || // on sama sõnaliik ... ((*sonaliik[slTabIdx])[j] == (FSxCHAR)'B' && sl == (FSxCHAR)'A')) // või sobiv sõnalik { if (dptr[j].idx.tab_idx == tyveinf->idx.tab_idx) { // ... ja sama paradigma tüvi LisaKdptr(dptr, &vormityvi, &tyvi, j); if(GeneL(pValja, gPrf, &vormityvi, sl, dptr[j].lg_nr, geneVormid, pGeneKigi)==false) { return false; } } } } //----- } return true; }
int MORF0::arvans1(MRFTULEMUSED *tulemus, FSXSTRING *S6na, int S6naPikkus, VARIANTIDE_AHEL **variandid) { int res; int cnt, ty2pik; CVARIANTIDE_AHEL ctyvi2_variant, cvahe_variant, csobivad_variandid; KOMPONENT komp, *k_tyvi, *tyvi1; FSXSTRING ema = FSxSTR("ema"); FSXSTRING tyvi2; //int tugevus; int maxty2, minty; // et saaks ty2lp() kasutada tyvi1 = &komp; res = cXXfirst(ema, 3, &cnt); if (res == POLE_SEDA || res == POLE_YLDSE) // sellist tyve pole olemas return CRASH; // sellist asja ei saa olla nulli_1komp(tyvi1); lisa_min_info(tyvi1, &ema, 0, 3); lisa_psl_info(tyvi1, K_TYVI, 0); // leiame tyvi1 liitumis-liigid res = juht1(tyvi1, dptr, cnt, &cvahe_variant.ptr); if (res > ALL_RIGHT) return res; maxty2 = S6naPikkus > 20 ? 20 : S6naPikkus-3; if (TaheHulgad::OnSuur(S6na, 0)) // oletatavatele nimedele luban �sna pikki j�relkomponente minty = 5; else minty = 2; // vt ko'iki v�imalikke l�ppe for (VARIANTIDE_AHEL *variant=*variandid; variant; variant=variant->jargmine_variant) { k_tyvi = esimene_komp(variant); if (k_tyvi->komp_jargmine->k_tyyp != K_LOPP) continue; maxty2 = k_tyvi->k_pikkus > 20 ? 20 : k_tyvi->k_pikkus-3; for (ty2pik=maxty2; ty2pik >= minty; ty2pik--) { tyvi2 = k_tyvi->k_algus.Right(ty2pik); if (ty2pik < 4) { if (!oletajaDct.sobivad_tyved2.Get((const FSxCHAR *)tyvi2)) continue; // pole lyhike kuid sobiv } else { if (oletajaDct.pahad_tyved2.Get((const FSxCHAR *)tyvi2)) continue; // on paha } // leiame tyvi2 res = ty_lp(k_tyvi->komp_jargmine, k_tyvi->k_pikkus - ty2pik, ty2pik, &ctyvi2_variant.ptr, NULL, 0); if (res > ALL_RIGHT) return res; for (VARIANTIDE_AHEL *tmp=ctyvi2_variant.ptr; tmp; tmp=tmp->jargmine_variant) // leia tyvi2 tyybid { juht2(esimene_komp(tmp)); } for (VARIANTIDE_AHEL *tmp=cvahe_variant.ptr; tmp; tmp=tmp->jargmine_variant) // tyvi1 tyvepikkus paika { lisa_min_info(esimene_komp(tmp), S6na, 0, k_tyvi->k_pikkus - ty2pik); // tyvele uus pikkus esimene_komp(tmp)->sonastikust = 0; // tyvi1 pole s�nastikust HJK 17.05.2004 } // int tugevus = tyvi1tyvi2(&cvahe_variant.ptr, &ctyvi2_variant.ptr, &csobivad_variandid.ptr); // siin vo'iks kunagi veel kontrollida tugevus va'a'rtust, et mitte liiga kahtlasi lubada ... ahelad_vabaks(&ctyvi2_variant.ptr); if (csobivad_variandid.ptr) // mingi ty1-ga leidub sobiv kombinatsioon { ahelad_vabaks(&cvahe_variant.ptr); ahelad_vabaks(&ctyvi2_variant.ptr); break; // lyhemaid tyvesid selle lopu puhul ei vt } } } //ahelad_vabaks(&cvahe_variant.ptr); //destruktoris //ahelad_vabaks(&ctyvi2_variant.ptr); //destruktoris if (csobivad_variandid.ptr) { if (TaheHulgad::OnSuur(S6na, 0)) { variandid_tulemuseks(tulemus, LIIK_YLDNIMI, &csobivad_variandid.ptr); if (tulemus->on_tulem()) tulemus->TulemidNimeks(LIIK_KAANDSONA); } else variandid_tulemuseks(tulemus, KOIK_LIIGID, &csobivad_variandid.ptr); //ahelad_vabaks(&csobivad_variandid.ptr); //destruktoris } return ALL_RIGHT; }
bool ETMRFAS::GeneMTVDetailne( MRFTULEMUSED *pValja, FSXSTRING *gPrf, // käib tüve ette const FSXSTRING *gTyviAlgne, const FSXSTRING *pnaidis, const FSXSTRING *sl, // sonaliigid, millesse kuuluvaid sõnu tahetakse const FSXSTRING *geneVormid, // genetavate vormide loend const int algv_lopp, // 0, -ma voi -d const int algv_vorm, // sg_g, sg_n, ma või pl_n const FSXSTRING *pGeneKigi) { int i, idx, res, k1, k2, nSonaLiiki; //bool suur=false; FSXSTRING *sonaLiigid; FSXSTRING gTyviUus; FSXSTRING genetud_tyvi, gene_t1, gene_t2, ette, gTyvi; TYVE_INF tmp_dptr[SONAL_MAX_PIK]; TYVE_INF naidise_dptr[SONAL_MAX_PIK]; int naidise_idx=0, mitu_naidise_homon=0; // leia näidissõna muutumisviis if (pnaidis->GetLength() > 0) { res=cXXfirst((const FSxCHAR*) *pnaidis, pnaidis->GetLength(), &naidise_idx); if(res == 0) // s.t. leidis mis vaja { sonaLiigid = sonaliik[naidise_idx]; mitu_naidise_homon = sonaLiigid->GetLength(); memmove(naidise_dptr, dptr, SizeOfLg2(mitu_naidise_homon)); } } gTyvi = *gTyviAlgne; gene_t2 = *gTyviAlgne; if (gTyvi.Find(FSxSTR(" "))!=-1) gTyvi.Replace(FSxSTR(" "), FSxSTR("="), 1); res=cXXfirst(&gTyvi,&idx); if(res == POLE_SEDA || res == POLE_YLDSE) { // - ja / sisald. sonade jaoks HJK 20.05.98 k1 = gTyviAlgne->ReverseFind((FSxCHAR)'-')+1; k2 = gTyviAlgne->ReverseFind((FSxCHAR)'/')+1; if (k2 > k1) k1 = k2; if (k1 > 0) { // Võtame tagumise otsa järgi gene_t2 = gTyviAlgne->Mid(k1); ette = gTyviAlgne->Mid(0, k1); res=cXXfirst(((const FSxCHAR*)gene_t2), gene_t2.GetLength(), &idx); if(res == POLE_SEDA || res == POLE_YLDSE) { if (TaheHulgad::SuurAlgustaht(&gene_t2)) { // viimane sõna suurtäheline // teeme v?ikseks ja proovime uuesti gene_t2.MakeLower(); res = cXXfirst(&gene_t2, &idx); } } if(res == 0) { *gPrf += ette; gPrf->Remove((FSxCHAR)'+'); // eemaldame asjatud +_= gPrf->Remove((FSxCHAR)'_'); gPrf->Remove((FSxCHAR)'='); } } else // sellist tyve pole, ja sõnas polnud ka - ega / { // proovin jõuga analüüsida analoogiliselt sõnadega, millel on samasugune lõpp e sufiks return GeneSTV(pValja, gPrf, gTyviAlgne, sl, geneVormid, algv_lopp, algv_vorm, pGeneKigi); } } if(res == POLE_SEDA || res == POLE_YLDSE) // seda ei saa olla return true; sonaLiigid=sonaliik[idx]; nSonaLiiki=sonaLiigid->GetLength(); memmove(tmp_dptr, dptr, SizeOfLg2(nSonaLiiki)); // tõsta dptr kõrvale, sest ta soditakse mujal ära for(i=0; i < nSonaLiiki; i++) { // vaja kontrollida, kas on ikka vajaliku algvormi tüvi gTyviUus = gene_t2; if(OtsiTyvi(&(tmp_dptr[i].idx), algv_lopp, algv_vorm, &gTyviUus)==false) continue; //polnud sobiv tüvi if(gTyviUus == gene_t2) // õige algvormi tüvi { if((*sonaLiigid)[i]==W_SL) // nagunii on ka S liigiline sõna leitud continue; if((*sonaLiigid)[i]==(FSxCHAR)'B' && sl->Find((FSxCHAR)'A') >=0) { // kah õige sõnaliik, // tahad A-d saad B, // aga ütleme, et said A if(GeneTLDetailne(pValja, naidise_dptr, mitu_naidise_homon, gPrf, &gTyviUus, (FSxCHAR)'A', &(tmp_dptr[i]),geneVormid, pGeneKigi)==false) return false; // crash } else if(sl->Find((*sonaLiigid)[i]) >= 0) //if((*sl)[0]==(*(mrf->sonaliik[idx]))[i]) { if(GeneTLDetailne(pValja, naidise_dptr, mitu_naidise_homon, gPrf, &gTyviUus, (*sonaLiigid)[i], &(tmp_dptr[i]),geneVormid, pGeneKigi)==false) return false; // crash } } } return true; }
int cTYVEINF::cXXfirst( //==0:leidis;==POLE_SEDA,POLE_YLDSE:polnud const FSXSTRING *stem, int *index) { return cXXfirst((const FSxCHAR *)(*stem), stem->GetLength(), index); }