コード例 #1
0
ファイル: Nfa.cs プロジェクト: sucaba/IronTextLibrary
        public static NfaFragment ZeroOrOne(NfaFragment fragment)
        {
            NfaFragment result = new NfaFragment();

            result.Start = new NfaState(NfaStateKind.Split);
            result.Outs.Add(result.Start.Out);
            result.Start.Out.Add(fragment.Start);
            result.Outs.AddRange(fragment.Outs);
            return(result);
        }
コード例 #2
0
ファイル: Nfa.cs プロジェクト: sucaba/IronTextLibrary
        public static NfaFragment Or(IEnumerable <NfaFragment> children)
        {
            var result = new NfaFragment();

            result.Start = new NfaState(NfaStateKind.Split);
            var output = new List <List <NfaState> >();

            foreach (var fragment in children)
            {
                result.Start.Out.Add(fragment.Start);
                result.Outs.Add(fragment.Start.Out);
            }

            return(result);
        }
コード例 #3
0
ファイル: Nfa.cs プロジェクト: sucaba/IronTextLibrary
        public static NfaFragment ZeroOrMore(NfaFragment inner)
        {
            var s = new NfaState(NfaStateKind.Split);

            s.Out.Add(inner.Start);
            foreach (var danglingInnerOut in inner.Outs)
            {
                danglingInnerOut.Add(s);
            }

            var result = new NfaFragment();

            result.Start = s;
            result.Outs.Add(s.Out);
            return(result);
        }
コード例 #4
0
ファイル: Nfa.cs プロジェクト: sucaba/IronTextLibrary
        public static NfaFragment Cat(IEnumerable <NfaFragment> children)
        {
            var result = new NfaFragment();

            NfaFragment lastFragment = null;

            if (children.Count() == 0)
            {
                result.Start = new NfaState(NfaStateKind.Split);
                result.Outs.Add(result.Start.Out);
            }
            else
            {
                foreach (var fragment in children)
                {
                    if (lastFragment == null)
                    {
                        result.Start = fragment.Start;
                    }
                    else
                    {
                        foreach (var dangling in lastFragment.Outs)
                        {
                            dangling.Add(fragment.Start);
                        }
                    }

                    lastFragment = fragment;
                }

                if (lastFragment == null)
                {
                    result.Outs = new List <List <NfaState> >();
                }
                else
                {
                    result.Outs = new List <List <NfaState> >(lastFragment.Outs);
                }
            }

            return(result);
        }