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); }
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); }
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); }
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); }