private List<Transition> parseTransitions() {
		List<Transition> transitions = new ArrayList<>();
		while (tokens.maybeEat(TokenKind.PIPE)) {
			Token transitionName = tokens.next();
			if (!transitionName.isKind(TokenKind.IDENTIFIER) && !transitionName.isKind(TokenKind.LITERAL_STRING)) {
				tokens.raiseException(transitionName.startpos, JobDSLMessage.EXPECTED_TRANSITION_NAME,
						tokenToString(transitionName));
			}
			Token nextToken = tokens.peek();
			if (nextToken == null) {
				// no equals after the transition name
				tokens.raiseException(transitionName.endpos - 1, JobDSLMessage.MISSING_EQUALS_AFTER_TRANSITION_NAME,
						tokenToString(transitionName));
			}
			if (!nextToken.isKind(TokenKind.EQUALS)) {
				tokens.raiseException(nextToken.startpos, JobDSLMessage.EXPECTED_EQUALS_AFTER_TRANSITION_NAME,
						tokenToString(nextToken));
			}
			else {
				tokens.next();
			}
			JobReference targetJobReference = parseJobReference(false);
			transitions.add(new Transition(transitionName, targetJobReference));
		}
		return transitions;
	}
Parse a job flow definition into an abstract syntax tree (AST).

@param jobSpecification the textual job specification
@return the AST for the parsed job
@throws JobSpecificationException if any problems occur during parsing
spring-xd-dirt/src/main/java/org/springframework/xd/dirt/job/dsl/JobParser.java