示例#1
0
 /// <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);
     })));
 }
示例#2
0
 /// <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;
     })));
 }
示例#3
0
 /// <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>()));
 }
示例#4
0
 /// <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>()));
 }