/** * A {@link Parser} that tries 3 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3) { return alt(p1, p2, p3).cast(); }
/** * A {@link Parser} that tries 7 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4, Parser<? extends T> p5, Parser<? extends T> p6, Parser<? extends T> p7) { return alt(p1, p2, p3, p4, p5, p6, p7).cast(); }
/** * A {@link Parser} that tries 4 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4) { return alt(p1, p2, p3, p4).cast(); }
/** * A {@link Parser} that tries 6 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4, Parser<? extends T> p5, Parser<? extends T> p6) { return alt(p1, p2, p3, p4, p5, p6).cast(); }
/** * A {@link Parser} that tries 9 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4, Parser<? extends T> p5, Parser<? extends T> p6, Parser<? extends T> p7, Parser<? extends T> p8, Parser<? extends T> p9) { return alt(p1, p2, p3, p4, p5, p6, p7, p8, p9).cast(); }
/** * A {@link Parser} that tries 2 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or(Parser<? extends T> p1, Parser<? extends T> p2) { return alt(p1, p2).cast(); }
/** * A {@link Parser} that tries 5 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4, Parser<? extends T> p5) { return alt(p1, p2, p3, p4, p5).cast(); }
/** * A {@link Parser} that tries 8 alternative parser objects. * Fallback happens regardless of partial match. */ public static <T> Parser<T> or( Parser<? extends T> p1, Parser<? extends T> p2, Parser<? extends T> p3, Parser<? extends T> p4, Parser<? extends T> p5, Parser<? extends T> p6, Parser<? extends T> p7, Parser<? extends T> p8) { return alt(p1, p2, p3, p4, p5, p6, p7, p8).cast(); }
/** * A {@link Parser} that tries each alternative parser in {@code alternatives}. * * <p> Different than {@link #alt(Parser[])}, it requires all alternative parsers to have * type {@code T}. */ public static <T> Parser<T> or(final Parser<? extends T>... alternatives) { if (alternatives.length == 0) return never(); if (alternatives.length == 1) return alternatives[0].cast(); return new Parser<T>() { @Override boolean apply(ParseContext ctxt) { final Object result = ctxt.result; final int at = ctxt.at; final int step = ctxt.step; for(Parser<? extends T> p : alternatives) { if (p.apply(ctxt)) { return true; } ctxt.set(step, at, result); } return false; } @Override public String toString() { return "or"; } }; }
/** * A {@link Parser} that runs every element of {@code parsers} and selects the shortest match. * If two matches have the same length, the first one is favored. */ public static <T> Parser<T> shortest(Parser<? extends T>... parsers) { if (parsers.length == 0) return never(); if (parsers.length == 1) return parsers[0].cast(); return new BestParser<T>(parsers, IntOrder.LT); }
/** * A {@link Parser} that runs every element of {@code parsers} and selects the longest match. * If two matches have the same length, the first one is favored. */ public static <T> Parser<T> longest(Parser<? extends T>... parsers) { if (parsers.length == 0) return never(); if (parsers.length == 1) return parsers[0].cast(); return new BestParser<T>(parsers, IntOrder.GT); }
static Parser<LambdaExpression> lambdaExpression( Parser<Expression> expression, Parser<Statement> stmt) { Parser<LambdaExpression.Parameter> typedParam = Parsers.sequence( TypeLiteralParser.TYPE_LITERAL, Terminals.Identifier.PARSER, LambdaExpression.Parameter::new); Parser<LambdaExpression.Parameter> simpleParam = Terminals.Identifier.PARSER.map(LambdaExpression.Parameter::new); Parser<LambdaExpression.Parameter> lambdaParam = typedParam.or(simpleParam); Parser<List<LambdaExpression.Parameter>> params = paren(lambdaParam.sepBy(term(","))).or(lambdaParam.map(Collections::singletonList)); Parser<Statement> body = StatementParser.blockStatement(stmt).<Statement>cast() .or(expression.map(ExpressionStatement::new)); return Parsers.sequence(params, term("->").next(body), LambdaExpression::new); }