public static FTL.AST.MemberList Parse(CharStream cs) { // starts with a newline and optional newline NewLine.Parse(cs); WhiteSpace.Parse(cs); FTL.AST.MemberList memberList = new FTL.AST.MemberList(); // parse first required member, as we always need at least 1 memberList.AddMember(Member.Parse(cs)); char next; int bufferPos; do { next = cs.PeekNext(); if (CharStream.IsEOF(next) || !CharStream.IsNL(next)) { break; } bufferPos = cs.Position; NewLine.Parse(cs); WhiteSpace.Parse(cs); if (!Member.Peek(cs)) { cs.Rewind(bufferPos); break; } memberList.AddMember(Member.Parse(cs)); } while(true); return(memberList); }