private static IReadOnlyList<Element> ExpressionList(SlimChainParser cp, bool isBlock) { var child = new List<Element>(); InsideParser cond; if (isBlock) { cp = cp.Type(TokenType.LeftBrace); cond = icp => icp.Not.Type(TokenType.RightBrace); } else { cond = icp => icp.Readable(); } cp.Opt.Call(ExpressionSeparators) .Any( iicp => iicp.Transfer(e => child.Add(e), Expression), iicp => iicp.AddError() ) .Loop(cond, icp => { icp.Opt.Call(ExpressionSeparators) .Opt.Any( iicp => iicp.Transfer(e => child.Add(e), Expression), iicp => iicp.AddError() ); }) .Opt.Call(ExpressionSeparators); return child; }
private static void ExpressionSeparators(SlimChainParser cp) { cp.Type(TokenType.EndExpression, TokenType.LineTerminator) .Ignore(TokenType.EndExpression, TokenType.LineTerminator); }