protected <T> boolean collectMergeableOptions(boolean root, AbstractElementAlias<T> alt, List<AbstractElementAlias<T>> result) { boolean optional = alt.optional; if ((root || !alt.isMany()) && alt instanceof AlternativeAlias<?>) { for (AbstractElementAlias<T> child : ((AlternativeAlias<T>) alt).getChildren()) optional |= collectMergeableOptions(false, child, result); } else { result.add(alt); alt.optional = false; } return optional; }
protected <T> void mergeAlternativeMultiples(StateAlias<T> first, StateAlias<T> second) { first.element.many = false; second.element.many = false; AlternativeAlias<T> alternative = new AlternativeAlias<T>(); alternative.many = true; if (first.element instanceof AlternativeAlias<?>) { alternative.getChildren().addAll(((AlternativeAlias<T>) first.element).children); } else { alternative.addChild(first.getElement()); } if (second.element instanceof AlternativeAlias<?>) { alternative.getChildren().addAll(((AlternativeAlias<T>) second.element).children); } else { alternative.addChild(second.element); } if (first.element.optional || second.element.optional) { alternative.optional = true; } first.element = alternative; for (StateAlias<T> out : second.getOutgoing()) { out.getIncoming().remove(second); } for (StateAlias<T> in : second.getIncoming()) { in.getOutgoing().remove(second); } }
@Override public Iterable<AbstractElementAlias<TOKEN>> getAlternativeChildren(AbstractElementAlias<TOKEN> ele) { return ele instanceof AlternativeAlias ? ((AlternativeAlias<TOKEN>) ele).getChildren() : null; }
public Iterable<AbstractElementAlias<TOKEN>> getAlternativeChildren(AbstractElementAlias<TOKEN> ele) { return ele instanceof AlternativeAlias ? ((AlternativeAlias<TOKEN>) ele).getChildren() : null; }