/** * A {@link Parser} that sequentially executes {@code this} and then {@code parser}, whose return value is ignored. */ public final Parser<T> followedBy(Parser<?> parser) { return Parsers.sequence(this, parser, InternalFunctors.<T, Object>firstOfTwo()); }
/** A {@link Parser} that runs 5 parser objects sequentially. */ public static <T> Parser<T> sequence( Parser<?> p1, Parser<?> p2, Parser<?> p3, Parser<?> p4, Parser<T> p5) { return sequence(p1, p2, p3, p4, p5, InternalFunctors.<Object, Object, Object, Object, T>lastOfFive()); }
/** A {@link Parser} that runs 4 parser objects sequentially. */ public static <T> Parser<T> sequence( Parser<?> p1, Parser<?> p2, Parser<?> p3, Parser<T> p4) { return sequence(p1, p2, p3, p4, InternalFunctors.<Object, Object, Object, T>lastOfFour()); }
private static Parser<Token> token(Object value) { return Parsers.token(InternalFunctors.tokenWithSameValue(value)); }
/** * A {@link Parser} that runs 2 parser objects sequentially. {@code p1} is executed, * if it succeeds, {@code p2} is executed. */ public static <T> Parser<T> sequence(Parser<?> p1, Parser<T> p2) { return sequence(p1, p2, InternalFunctors.<Object, T>lastOfTwo()); }
/** A {@link Parser} that runs 3 parser objects sequentially. */ public static <T> Parser<T> sequence(Parser<?> p1, Parser<?> p2, Parser<T> p3) { return sequence(p1, p2, p3, InternalFunctors.<Object, Object, T>lastOfThree()); }
/** A {@link Parser} that recognizes the token identified by {@code tokenName}. */ public Parser<Token> token(String tokenName) { return Parsers.token(InternalFunctors.tokenWithSameValue(word(tokenName))); }
/** A {@link Parser} that recognizes a token identified by any of {@code tokenNames}. */ public Parser<Token> token(String... tokenNames) { if (tokenNames.length == 0) return Parsers.never(); @SuppressWarnings("unchecked") Parser<Token>[] ps = new Parser[tokenNames.length]; for(int i = 0; i < tokenNames.length; i++) { ps[i] = Parsers.token(InternalFunctors.tokenWithSameValue(word(tokenNames[i]))); } return Parsers.or(ps); }