protected <T> boolean createOptional(StateAliasNfa<T> states) { List<StateAlias<T>> opt = Lists.newArrayList(); L: for (StateAlias<T> cand : new NfaUtil().collect(states)) { if (cand.getIncoming().isEmpty() || cand.getOutgoing().isEmpty()) continue L; for (StateAlias<T> in : cand.getIncoming()) if (!in.getOutgoing().containsAll(cand.getOutgoing())) continue L; opt.add(cand); } for (StateAlias<T> o : opt) { o.getElement().setOptional(true); for (StateAlias<T> in : Lists.newArrayList(o.getIncoming())) if (in != o) for (StateAlias<T> out : Lists.newArrayList(o.getOutgoing())) if (out != o) { out.getIncoming().remove(in); in.getOutgoing().remove(out); } } return !opt.isEmpty(); }
protected <T> boolean createOptional(StateAliasNfa<T> states) { List<StateAlias<T>> opt = Lists.newArrayList(); L: for (StateAlias<T> cand : new NfaUtil().collect(states)) { if (cand.getIncoming().isEmpty() || cand.getOutgoing().isEmpty()) continue L; for (StateAlias<T> in : cand.getIncoming()) if (!in.getOutgoing().containsAll(cand.getOutgoing())) continue L; opt.add(cand); } for (StateAlias<T> o : opt) { o.getElement().setOptional(true); for (StateAlias<T> in : Lists.newArrayList(o.getIncoming())) if (in != o) for (StateAlias<T> out : Lists.newArrayList(o.getOutgoing())) if (out != o) { out.getIncoming().remove(in); in.getOutgoing().remove(out); } } return !opt.isEmpty(); }
protected <T> void mergeOptionalIntoMany(StateAlias<T> first, StateAlias<T> second) { StateAlias<T> many = first.element.isMany() ? first : second; StateAlias<T> optional = many == first ? second : first; if (optional.getOutgoing().contains(optional)) { optional.element.setMany(true); } many.element.setMany(false); optional.element.setOptional(true); for (StateAlias<T> out : optional.getOutgoing()) { out.getIncoming().remove(optional); } for (StateAlias<T> in : optional.getIncoming()) { in.getOutgoing().remove(optional); } GroupAlias<T> group = new GroupAlias<T>(); group.setMany(true); if (first.element instanceof GroupAlias<?> && !first.element.many && !first.element.optional) { group.children.addAll(((GroupAlias<T>) first.element).children); } else { group.addChild(first.getElement()); } if (second.element instanceof GroupAlias<?> && !second.element.many && !second.element.optional) { group.children.addAll(((GroupAlias<T>) second.element).children); } else { group.addChild(second.element); } many.element = group; }