Ejemplo n.º 1
0
//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;
}
Ejemplo n.º 2
0
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;
    }
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
int cTYVEINF::cXXfirst( //==0:leidis;==POLE_SEDA,POLE_YLDSE:polnud
    const FSXSTRING *stem,
    int *index)
    {
    return cXXfirst((const FSxCHAR *)(*stem), stem->GetLength(), index);
    }