private static Pattern getPattern( Map<String, NamedCondition> transitionConditions, PatternGroup patternGroup) { Pattern pattern = new Pattern(); for (Step step : patternGroup.steps) { Pattern next; if (step.isPattern()) { next = getPattern(transitionConditions, step.patternGroup); } else { NamedCondition condition = transitionConditions.get(step.ref); if (condition == null) throw new IllegalArgumentException("No such condition [" + step.ref + "]"); next = Pattern.match(condition); } if (step.repeat) next = next.repeat(); if (step.optional) next = next.optional(); next = Pattern.capture(next); pattern = patternGroup.type == GroupType.OR ? Pattern.branch(pattern, next) : Pattern.chain(pattern, next); } return pattern.minimize(); }