/// <summary> /// Match { parser } /// Notice this will handle all the scope. /// </summary> /// <typeparam name="V"></typeparam> /// <param name="parser"></param> /// <returns></returns> public static Parserc.Parser <T, V> BracelLR <V>(this Parserc.Parser <T, V> parser) { return(Match <T_PUNC_BRACEL>().Bind(_ => { Env.PushScope(); return parser; }).Bind(result => Match <T_PUNC_BRACER>().Bind(_ => { Env.PopScope(); return Result <T, V>(result); }))); }
/// <summary> /// Chain a binary expression with left associative opeartor. /// </summary> /// <param name="parser"> Basic element parser. </param> /// <param name="sep"> Match the operator. </param> /// <returns></returns> public static Parserc.Parser <T, Expr> ChainBinaryExpr( this Parserc.Parser <T, Expr> parser, Parserc.Parser <T, BiExpr.Op> sep ) { return(parser.ChainPlus(sep.Select(op => { Func <Expr, Expr, Expr> f = (lhs, rhs) => new BiExpr(lhs, rhs, op); return f; }))); }
/// <summary> /// Match [ parser ]. /// </summary> /// <typeparam name="V"></typeparam> /// <param name="parser"></param> /// <returns></returns> public static Parserc.Parser <T, V> SubLR <V>(this Parserc.Parser <T, V> parser) { return(parser.Bracket(Match <T_PUNC_SUBSCRIPTL>(), Match <T_PUNC_SUBSCRIPTR>())); }
/// <summary> /// Match ( parser ). /// </summary> /// <typeparam name="V"></typeparam> /// <param name="parser"></param> /// <returns></returns> public static Parserc.Parser <T, V> ParentLR <V>(this Parserc.Parser <T, V> parser) { return(parser.Bracket(Match <T_PUNC_PARENTL>(), Match <T_PUNC_PARENTR>())); }