void DCTRD::open_d2(void) { register int i; readeel(); readends(); // teeb loppude mass. readgrs(); // teeb lgr mass. readfms(); // teeb vormide mass. readfgrs(); // teeb lgr mass. readsuf(); // teeb suf mass. readprf(); // teeb pref mass. // teeb loend[i] mass. for (i=0; i < LOENDEID-1; i++) // tegelik loendite arv <= LOENDEID-1 { readloe(i); } sg_g = vormnr(FSxSTR("sg g")); sg_n = vormnr(FSxSTR("sg n")); sg_p = vormnr(FSxSTR("sg p")); adt = vormnr(FSxSTR("adt")); pl_n = vormnr(FSxSTR("pl n")); pl_g = vormnr(FSxSTR("pl g")); pl_p = vormnr(FSxSTR("pl p")); da = vormnr(FSxSTR("da")); ma = vormnr(FSxSTR("ma")); suva_vrm = SUVA_VRM; if(sg_g == -1||sg_n == -1 ||ma == -1) // valikuline test { throw(VEAD(ERR_MORFI_PS6N,ERR_ROTTEN,__FILE__,__LINE__, "$Revision: 521 $")); } lopp_a = lpnr(FSxSTR("a")); lopp_d = lpnr(FSxSTR("d")); lopp_da = lpnr(FSxSTR("da")); lopp_dama = lpnr(FSxSTR("dama")); lopp_dav = lpnr(FSxSTR("dav")); lopp_des = lpnr(FSxSTR("des")); lopp_dud = lpnr(FSxSTR("dud")); lopp_es = lpnr(FSxSTR("es")); lopp_ma = lpnr(FSxSTR("ma")); lopp_mata = lpnr(FSxSTR("mata")); lopp_nud = lpnr(FSxSTR("nud")); lopp_t = lpnr(FSxSTR("t")); lopp_ta = lpnr(FSxSTR("ta")); lopp_tama = lpnr(FSxSTR("tama")); lopp_tav = lpnr(FSxSTR("tav")); lopp_te = lpnr(FSxSTR("te")); lopp_tes = lpnr(FSxSTR("tes")); lopp_tud = lpnr(FSxSTR("tud")); lopp_v = lpnr(FSxSTR("v")); lopp_0 = null_lopp; suva_lp = SUVA_LP; if((signed char)lopp_d == (signed char)-1 || (signed char)lopp_ma == (signed char)-1) // valikuline test { throw(VEAD(ERR_MORFI_PS6N,ERR_ROTTEN,__FILE__,__LINE__, "$Revision: 521 $")); } }
bool ETMRFAS::GeneL1( MRFTULEMUSED *pValja, const FSXSTRING *gPrf, // käib tüve ette const FSXSTRING *gTyvi, // tüvi morf analüüsijast const FSxCHAR sl, const int lgNr, const FSXSTRING *geneVorm, // genetav vorm const FSXSTRING *pGeneKigi) { int i,j,l6ppudeAlgusNihe,l6ppudeArv,vormideAlgusNihe,ffnr; int l6pujrknr; FSxCHAR tmp[2]=FSxSTR("\0"); FSXSTRING l6pp, tyvi, liik, kigi; FSxCHAR vi; tmp[0]=sl; liik=tmp; kigi = FSxSTR(""); // sõnastiku kettalt sisselugemisel tuleks kohe need2 baiti // intiks teisenda ja seda kasutadagi lõputu bitinikerdamise asemel l6ppudeAlgusNihe= (((groups[lgNr].gr_algus)&0xFF)<<8)| (groups[lgNr].gr_lopp&0xFF); l6ppudeArv=(unsigned char)(groups[lgNr].cnt); vormideAlgusNihe = homo_form * l6ppudeAlgusNihe; ffnr = vormnr((const FSxCHAR *)*geneVorm); assert( l6ppudeAlgusNihe >=0 && l6ppudeArv >=0 && vormideAlgusNihe >=0 ); if(ffnr <= 0) return false; // sellist vormi pole üldse olemaski for(i=0; i < l6ppudeArv; i++) { for(j=0; j < (int)homo_form; j++) { if( ffnr==(unsigned char)(fgr[vormideAlgusNihe+(i*homo_form) + j]) ) { // otsitav vorm leitud l6pujrknr=(unsigned char)(gr[l6ppudeAlgusNihe + i]); l6pp=l6ppudeLoend[l6pujrknr]; //if(adHocString.GetLength() > 0 && ffnr==vormideLoend[FSxSTR("sg n"])) //Kuidas see sai kompileeruda?! if(adHocString.GetLength() > 0 && ffnr==vormnr(FSxSTR("sg n"))) { l6pp += adHocString; } tyvi= *gPrf + *gTyvi; FSXSTRING geneVorm1 = *geneVorm; geneVorm1 += FSxSTR(", "); if (l6pp.GetLength() > 0) vi = l6pp[l6pp.GetLength()-1]; else vi = tyvi[tyvi.GetLength()-1]; if (pGeneKigi->GetLength()>0) { if (!TaheHulgad::OnHelitu(vi)) kigi = FSxSTR("gi"); else kigi = FSxSTR("ki"); } pValja->Add( (const FSxCHAR *)tyvi, (const FSxCHAR *)l6pp, (const FSxCHAR *)kigi, (const FSxCHAR *)liik, (const FSxCHAR *)geneVorm1); } } } return true; }
bool ETMRFAS::Gene2Detailne( // -1==siiber; 0==ok MRFTULEMUSED *pValja, MRFTULEMUSED *pMrfTul, const FSXSTRING *pnaidis, const FSXSTRING *pGeneLiik, const FSXSTRING *pGeneVormid, const FSXSTRING *pGeneKigi) { char algv_lopp; int algv_vorm; int viimne; FSXSTRING gene_liik = KOIK_LIIGID; // igaks juhuks FSXSTRING genetud_tyvi, gene_t1, gene_t2, ette, kigi; int i, sgn=0, k1, k2; bool r; FSxCHAR vi; if (pMrfTul->Get_vormid(FSxSTR("sg n,")) != -1) sgn = 1; // analyyside hulgas leidub sg n i = pMrfTul->Get_vormid(FSxSTR("ma,")); if (i != -1 && pMrfTul->Get_vormid(FSxSTR("tama,")) != i) sgn = 1; // analyyside hulgas leidub ma if (*pGeneLiik == FSxSTR("*")) gene_liik = KOIK_LIIGID; else gene_liik = (const FSxCHAR*)*pGeneLiik; // vt kõiki algvorme // kigi = FSxSTR(""); for (i=0; i < pMrfTul->idxLast; i++) { if (gene_liik.Find((*pMrfTul)[i]->sl) == -1) continue; // polnud sobiv sõnaliik if ((*pMrfTul)[i]->vormid.Find(FSxSTR("?")) != -1 || (*pMrfTul)[i]->vormid.Find(FSxSTR(",")) == -1) // muutumatu s�na { if (sgn == 0 || // analüüside hulgas polegi käänduvat sõna või ... pGeneVormid->GetLength() == 0 || // tahetaksegi muutumatut sõna pGeneVormid->Find(FSxSTR("sg n")) >=0 ) // käsitaksegi ainsuse nimetavat { // et enne //_*_ // et //_*_ // ja enne //_*_ sg n, // enne //_*_ sg g, // oleks kooskõlas genetud_tyvi = pMrfTul->rec[i]->tyvi; genetud_tyvi.Remove((FSxCHAR)'_'); genetud_tyvi.Remove((FSxCHAR)'='); genetud_tyvi.Remove((FSxCHAR)'+'); vi = genetud_tyvi[genetud_tyvi.GetLength()-1]; if (pGeneKigi->GetLength()>0) { if (!TaheHulgad::OnHelitu(vi)) kigi = FSxSTR("gi"); else kigi = FSxSTR("ki"); } pValja->Add( (const FSxCHAR *)genetud_tyvi, FSxSTR(""), // 0-l�pu puhul 0 ei lisa (const FSxCHAR *)kigi, // (*pMrfTul)[i]->sl, (*pMrfTul)[i]->vormid); continue; } } if ( (*pMrfTul)[i]->vormid.Find(FSxSTR("sg n,"))!= -1 ) { sgn=1; //* on leitud lihtsaim algvorm * algv_lopp = null_lopp; algv_vorm = sg_n; } else if ((*pMrfTul)[i]->vormid.Left(3) == FSxSTR("ma,")) { sgn=1; //* on leitud lihtsaim algvorm * algv_lopp = lopp_ma; algv_vorm = ma; } else if ( omastavanr(&((*pMrfTul)[i]->tyvi)) != -1 ) { sgn=1; //* on leitud lihtsaim algvorm * algv_lopp = null_lopp; algv_vorm = sg_g; } else if (!sgn && (*pMrfTul)[i]->vormid.Find(FSxSTR("pl n,"))!= -1) { algv_lopp = lopp_d; algv_vorm = pl_n; // HJK 2008: igaks juhuks (kui eelnenud analüüsil on tehtud tyve asemel lemma) if ( (*pMrfTul)[i]->tyvi.Right(1) == FSxSTR("d") ) // nt Madalmaad; votad lopust maha (*pMrfTul)[i]->tyvi = (*pMrfTul)[i]->tyvi.Left((*pMrfTul)[i]->tyvi.GetLength()-1); } else if (!sgn && // null-lopp !!! (*pMrfTul)[i]->sl == LIIK_VERB && ((*pMrfTul)[i]->tyvi == FSxSTR("ei") || (*pMrfTul)[i]->tyvi == FSxSTR("\x00E4ra"))) // ei, ära puhuks { algv_lopp = null_lopp; FSXSTRING tmpstr; tmpstr = (*pMrfTul)[i]->vormid; if (TaheHulgad::OnLopus(&tmpstr, FSxSTR(", "))) tmpstr = tmpstr.Left(tmpstr.GetLength()-2); algv_vorm = vormnr((const FSxCHAR *)tmpstr); } else { continue; // seda rohkem ei vt, sest pole algvorm } gene_t1 = (*pMrfTul)[i]->tyvi; // algul geneme terveid sõnu (lootes, et ka liitsõnad on sõnastikus sees) gene_t2 = gene_t1; gene_t2.Remove((FSxCHAR)'_'); gene_t2.Remove((FSxCHAR)'+'); gene_t2.Remove((FSxCHAR)'='); ette = FSxSTR(""); viimne = pValja->idxLast; r = GeneMTVDetailne(pValja, &ette, &gene_t2, pnaidis, &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi ); if (r == false) return false; if (pValja->idxLast > viimne) // midagi leitigi { pValja->eKustTulemused = eMRF_SP; // tulemused põhisõnastikust continue; } k1 = gene_t1.ReverseFind((FSxCHAR)'_')+1; k2 = gene_t1.ReverseFind((FSxCHAR)'=')+1; if (k1==k2) // pole ei _ ega =, seega oli lihtsõna continue; if (k2 < k1) // viimane komponent oli osasõna { if (mrfFlags->Chk(MF_EITULETALIIT)) // tuleb arvestada tervet sõna, koos _ continue; // ... aga see ei õnnestunud } //------ else // viimane komponent oli järelliide { gene_t2 = gene_t1.Mid(k2); ette = gene_t1.Mid(0, k2); ette.Remove((FSxCHAR)'_'); ette.Remove((FSxCHAR)'='); ette.Remove((FSxCHAR)'+'); r = GeneSTV(pValja, &ette, &gene_t2, /*&((*pMrfTul)[i]->sl),*/ &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi ); if (r == false) return false; if (pValja->idxLast > viimne) // midagi leitigi continue; } // viimane komponent oli osasõna for (k1=gene_t1.Find((FSxCHAR)'_'); k1!=-1; k1=gene_t1.Find((FSxCHAR)'_', k1+1)) // võta järjest eestpoolt osi ära, kuni midagi järel pole { k1 += 1; gene_t2 = gene_t1.Mid(k1); ette = gene_t1.Mid(0, k1); ette.Remove((FSxCHAR)'_'); ette.Remove((FSxCHAR)'='); ette.Remove((FSxCHAR)'+'); gene_t2.Remove((FSxCHAR)'_'); gene_t2.Remove((FSxCHAR)'='); gene_t2.Remove((FSxCHAR)'+'); r = GeneMTVDetailne(pValja, &ette, &gene_t2, pnaidis, &gene_liik, pGeneVormid, algv_lopp, algv_vorm, pGeneKigi ); if (r == false) return false; if (pValja->idxLast > viimne) // midagi leitigi { pValja->eKustTulemused = eMRF_SP; // tulemused põhisõnastikust break; } } } pValja->SortUniq(); return true; }