protected void collectByParentSequence(E element, E container, Iterable<E> children, Set<E> result, Set<E> visited) { List<E> sequentialChildren = orderedList(children); int i = sequentialChildren.indexOf(element) + 1; while (i < sequentialChildren.size()) { E next = sequentialChildren.get(i); collectElement(next, result, visited); if (production.isOptional(next)) i++; else break; } if (i >= sequentialChildren.size()) { if (production.isMany(container)) collectElement(container, result, visited); collectByParent(container, result, visited); } }
protected void collectByParentSequence(E element, E container, Iterable<E> children, Set<E> result, Set<E> visited) { List<E> sequentialChildren = orderedList(children); int i = sequentialChildren.indexOf(element) + 1; while (i < sequentialChildren.size()) { E next = sequentialChildren.get(i); collectElement(next, result, visited); if (production.isOptional(next)) i++; else break; } if (i >= sequentialChildren.size()) { if (production.isMany(container)) collectElement(container, result, visited); collectByParent(container, result, visited); } }
protected void collectChildrenUnorderedAlt(E element, Iterable<E> alternativeChildren, Set<E> result, Set<E> visited) { boolean hasMandatory = false; for (E child : orderedIterable(alternativeChildren)) { hasMandatory |= !production.isOptional(child); collectElement(child, result, visited); } if (!hasMandatory || production.isOptional(element)) collectByParent(element, result, visited); }
protected void collectChildrenSequence(E element, Iterable<E> sequentialChildren, Set<E> result, Set<E> visited) { boolean reachedEnd = true; for (E child : orderedIterable(sequentialChildren)) { collectElement(child, result, visited); if (!production.isOptional(child)) { reachedEnd = false; break; } } if (reachedEnd || production.isOptional(element)) collectByParent(element, result, visited); }
protected void collectChildrenAlternative(E element, Iterable<E> alternativeChildren, Set<E> result, Set<E> visited) { boolean optional = production.isOptional(element); for (E child : orderedIterable(alternativeChildren)) { optional |= production.isOptional(child); collectElement(child, result, visited); } if (optional) collectByParent(element, result, visited); }
protected void collectChildrenAlternative(E element, Iterable<E> alternativeChildren, Set<E> result, Set<E> visited) { boolean optional = production.isOptional(element); for (E child : orderedIterable(alternativeChildren)) { optional |= production.isOptional(child); collectElement(child, result, visited); } if (optional) collectByParent(element, result, visited); }
protected void collectChildrenSequence(E element, Iterable<E> sequentialChildren, Set<E> result, Set<E> visited) { boolean reachedEnd = true; for (E child : orderedIterable(sequentialChildren)) { collectElement(child, result, visited); if (!production.isOptional(child)) { reachedEnd = false; break; } } if (reachedEnd || production.isOptional(element)) collectByParent(element, result, visited); }
protected void collectChildrenUnorderedAlt(E element, Iterable<E> alternativeChildren, Set<E> result, Set<E> visited) { boolean hasMandatory = false; for (E child : orderedIterable(alternativeChildren)) { hasMandatory |= !production.isOptional(child); collectElement(child, result, visited); } if (!hasMandatory || production.isOptional(element)) collectByParent(element, result, visited); }
protected void collectByParent(E element, Set<E> result, Set<E> visited) { E container = production.getParent(element); Iterable<E> children; if (container == null) result.add(null); else if ((children = production.getSequentialChildren(container)) != null) collectByParentSequence(element, container, children, result, visited); else if ((children = production.getUnorderedChildren(container)) != null) switch (unorderedStrategy) { case SEQUENCE: collectByParentSequence(element, container, children, result, visited); break; case MULIT_ALTERNATIVE: collectElement(container, result, visited); collectByParent(container, result, visited); break; } else { if (production.isMany(container)) collectElement(container, result, visited); collectByParent(container, result, visited); } }
protected void collectByParent(E element, Set<E> result, Set<E> visited) { E container = production.getParent(element); Iterable<E> children; if (container == null) result.add(null); else if ((children = production.getSequentialChildren(container)) != null) collectByParentSequence(element, container, children, result, visited); else if ((children = production.getUnorderedChildren(container)) != null) switch (unorderedStrategy) { case SEQUENCE: collectByParentSequence(element, container, children, result, visited); break; case MULIT_ALTERNATIVE: collectElement(container, result, visited); collectByParent(container, result, visited); break; } else { if (production.isMany(container)) collectElement(container, result, visited); collectByParent(container, result, visited); } }
protected void collectChildren(E element, Set<E> result, Set<E> visited) { Iterable<E> children; if ((children = production.getSequentialChildren(element)) != null) collectChildrenSequence(element, children, result, visited); else if ((children = production.getAlternativeChildren(element)) != null) collectChildrenAlternative(element, children, result, visited); else if ((children = production.getUnorderedChildren(element)) != null) switch (unorderedStrategy) { case SEQUENCE: collectChildrenSequence(element, children, result, visited); break; case MULIT_ALTERNATIVE: collectChildrenUnorderedAlt(element, children, result, visited); break; } else { if (production.isMany(element) /* && filter(element) */) collectElement(element, result, visited); collectByParent(element, result, visited); } }
protected void collectChildren(E element, Set<E> result, Set<E> visited) { Iterable<E> children; if ((children = production.getSequentialChildren(element)) != null) collectChildrenSequence(element, children, result, visited); else if ((children = production.getAlternativeChildren(element)) != null) collectChildrenAlternative(element, children, result, visited); else if ((children = production.getUnorderedChildren(element)) != null) switch (unorderedStrategy) { case SEQUENCE: collectChildrenSequence(element, children, result, visited); break; case MULIT_ALTERNATIVE: collectChildrenUnorderedAlt(element, children, result, visited); break; } else { if (production.isMany(element) /* && filter(element) */) collectElement(element, result, visited); collectByParent(element, result, visited); } }