Esempio n. 1
0
        Transcribe(MSyl syl)
        {
            string start, end = "";
            INIT   i = syl.Initial;
            TONE   t = syl.Tone;
            MED    m = syl.Medial;
            RIME   r = syl.Rime;


            //initial
            if (i == INIT.Void && m != MED._)           //y w yu
            {
                return(_m0Trans[new MRt(r, t)]);
            }
            else if (syl.InitialGroup == INITGROUP.GGRP && syl.IsPalatized)           //j q x
            {
                start = _specInit[i];
                if (m == MED.IU && syl.Final != FIN.ENG)                //ü -> u but not iong
                {
                    r = (RIME)((byte)MED.U | (byte)syl.Final);          //ju qu xu
                }
            }
            else if (syl.InitialGroup == INITGROUP.TZGRP && m == MED.I && syl.Final == FIN.ZERO)            //zyi cyi syi
            {
                start = _specInit[i];
            }
            else
            {
                start = _miTrans[i];
            }

            //final
            _mfTrans.TryGetValue(new MRt(r, t), out end);

            return(start + end);
        }
Esempio n. 2
0
 public MImt(INIT i, MED m = MED._, TONE t = TONE.NEUTRAL)
 {
     _syl = new MSyl(i, m, FIN.ZERO, t);
 }
Esempio n. 3
0
 public MImt(INIT i, MED m = MED._, TONE t = TONE.NEUTRAL)
 {
     _syl = new MSyl(i,m,FIN.ZERO,t);
 }
Esempio n. 4
0
 public MRt(FIN fin, MED med = MED._, TONE tone = TONE.NEUTRAL)
 {
     _syl = new MSyl(INIT.Void, med, fin, tone);
 }
Esempio n. 5
0
        MunchSyllable(string s, ref int idx)
        {
            MImt imt;
            MRt  rt;

            INIT init = 0;
            MED  med = 0;
            FIN  fin = 0;
            TONE t1 = TONE.NEUTRAL, t2 = TONE.NEUTRAL;

            bool match = _miDict.TryMatchStart(s, ref idx, out imt);

            do
            {
                if (match)
                {
                    init = imt.Initial;
                    med  = imt.Medial;
                    t1   = imt.Tone;
                }

                var iMark = idx;
                match = _mfDict.TryMatchStart(s, ref idx, out rt);

                if (match)
                {
                    t2 = rt.Tone;

                    if (t2 != TONE.NEUTRAL && t1 != TONE.NEUTRAL)
                    {
                        idx = iMark;
                        break;
                    }

                    if (rt.Medial == MED.U)                       //IU + ONG
                    {
                        if (rt.Final == FIN.ZERO && med == MED.I) //IU
                        {
                            fin = FIN.OU;
                        }
                        else if (rt.Final == FIN.ENG)                        //ONG
                        {
                            med = med | MED.U;
                            fin = rt.Final;
                        }
                        else
                        {
                            idx = iMark;
                        }
                    }
                    else
                    {
                        fin = rt.Final;
                        if (fin == FIN.Y && med == MED.U)                       //UI
                        {
                            fin = FIN.EI;
                        }
                        else if (fin == FIN.E && ((med & MED.I) == MED.I))                              //ie,üe
                        {
                            fin = FIN.È;
                        }
                    }
                }
            } while(false);

            if (init == 0 && med == 0 && fin == 0)
            {
                return(MSyl.Default);
            }

            return(new MSyl(init, med, fin, (t1 == TONE.NEUTRAL ? t2 : t1)));
        }
Esempio n. 6
0
 public MSyl(INIT init, MED med, FIN fin, TONE tone)
     : this((byte)((byte)init | (byte)tone), (byte)((byte)med | (byte)fin))
 {
 }
Esempio n. 7
0
 static public bool IsPalatized(this MED med)
 {
     return((med & MED.I) == MED.I);
 }