Exemple #1
0
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;
}