public T Parse <T>(SpecificParseRule <T> rule) where T : class { int ruleId = BeginRule(); var result = rule() as T; if (result == null) { FailRule(ruleId); return(null); } SucceedRule(ruleId, result); return(result); }
protected List <T> SeparatedList <T> (SpecificParseRule <T> mainRule, ParseRule separatorRule) where T : class { T firstElement = Parse(mainRule); if (firstElement == null) { return(null); } var allElements = new List <T> (); allElements.Add(firstElement); do { int nextElementRuleId = BeginRule(); var sep = separatorRule(); if (sep == null) { FailRule(nextElementRuleId); break; } var nextElement = Parse(mainRule); if (nextElement == null) { FailRule(nextElementRuleId); break; } SucceedRule(nextElementRuleId); allElements.Add(nextElement); } while (true); return(allElements); }