TerminalParser { public static Parser<?> term(String name) { if (name.equals(">>")) { return adjacent(">>>").not().next(adjacent(">>")); } if (name.equals("<<") || name.equals(">>>")) { return adjacent(name); } return TERMS.token(name); }  static Parser<Token> adjacent(Parser<List<Token>> parser, final Parser<?> otherwise); static Parser<Token> adjacent(String operator); static Parser<?> term(String name); static Parser<?> phrase(String phrase);  }
@Test public void testTerm() { assertOperator(TerminalParser.term("<<"), "<<"); assertOperator(TerminalParser.term(">>"), ">>"); assertOperator(TerminalParser.term(">>>"), ">>>"); assertOperator(TerminalParser.term("||"), "||"); assertOperator(TerminalParser.term(">"), ">"); TerminalParser.parse(TerminalParser.term(">>").followedBy(TerminalParser.term(">")), ">> >"); assertFailure(TerminalParser.term(">>").followedBy(TerminalParser.term(">")), ">>>", 1, 1); try { TerminalParser.term("not exist"); fail(); } catch (IllegalArgumentException e) {} }