in antlr-based-bootstrap/peg/GraphHelper.java [157:201]
private Map<Tree, Cardinality> joinMaps(int type, List<Map<Tree, Cardinality>> list) {
if (list.isEmpty()) return Collections.emptyMap();
if (type == OPT || type == ONEMORE || type == ZEROMORE) {
HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
assert list.size() == 1;
Map<Tree, Cardinality> m = list.get(0);
for (Tree t : m.keySet()) {
map.put(t, fromNodeType(type).and(m.get(t)));
}
return map;
}
else if (type == SEQ) {
if (list.size() == 1) return list.get(0);
HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
for (Map<Tree, Cardinality> m : list) {
for (Tree t : m.keySet()) {
map.put(t, m.get(t).or(map.get(t)));
}
}
return map;
}
else if (type == CHOICE) {
HashMap<Tree, Cardinality> map = new HashMap<Tree, Cardinality>();
Map<Tree, Cardinality> m0 = list.get(0);
map.putAll(m0);
for (Map<Tree, Cardinality> m : list) {
map.keySet().retainAll(m.keySet());
}
for (Tree t : map.keySet()) {
map.put(t, REQUIRED.and(m0.get(t)));
for (Map<Tree, Cardinality> m : list) {
if (m == list.get(0)) continue;
map.put(t, map.get(t).and(m.get(t)));
}
}
for (Map<Tree, Cardinality> m : list) {
for (Tree t : m.keySet()) {
if (map.containsKey(t)) continue;
map.put(t, OPTIONAL.and(m.get(t)));
}
}
return map;
}
else throw new AssertionError(GrammarParser.tokenNames[type]);
}