public bool Eval(ref TokenStack <T> stack, ref RuleData data) { int originalIndex = data.Count; for (int i = 0; i < Branches.Count; i++) { List <Rule <T> > rules = Branches[i]; stack.Mark(); { if (EvalRules(ref stack, ref data, rules)) { data.Insert(originalIndex, i); stack.Unmark(); return(true); } } stack.Jump(); data.RemoveRange(originalIndex, data.Count - originalIndex); } stack.Next(); return(false); }