/// <summary> /// Tries to parse a consequent number of specified syntactic items. /// </summary> private bool ParseAllInternal(SyntacticState state, params SyntacticItem[] parts) { int innerIndex = state.InnerPosition; int outerIndex = state.OuterPosition; bool parsed = true; foreach (SyntacticItem part in parts) { if (!part.Parse(state)) { parsed = false; break; } } if (!parsed) { state.Reset(innerIndex, outerIndex); return(false); } state.AddBack(Key, innerIndex, outerIndex); return(true); }
/// <summary> /// Tries to parse a batch of similar syntactic items with specified delimiter. /// </summary> private bool ParseManyInternal(SyntacticState state, SyntacticItem part, SyntacticItem delimiter) { int innerIndex = state.InnerPosition; int outerIndex = state.OuterPosition; if (!part.Parse(state)) { return(false); } while (true) { int lastInnerIndex = state.InnerPosition; int lastOuterIndex = state.OuterPosition; if (delimiter != null) { if (!delimiter.Parse(state)) { break; } } if (!part.Parse(state)) { state.Reset(lastInnerIndex, lastOuterIndex); break; } } state.AddBack(Key, innerIndex, outerIndex); return(true); }
/// <summary> /// Tries to parse any of specified syntactic items. /// </summary> private bool ParseAnyInternal(SyntacticState state, params SyntacticItem[] parts) { int innerIndex = state.InnerPosition; int outerIndex = state.OuterPosition; foreach (SyntacticItem part in parts) { if (part.Parse(state)) { state.AddBack(Key, innerIndex, outerIndex); return(true); } } return(false); }