package edu.stanford.nlp.sempre;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Used to access rules efficiently by walking down their RHS.
* @author Percy Liang
*/
public class Trie {
public ArrayList<Rule> rules = new ArrayList<>();
Map<String, Trie> children = new LinkedHashMap<>();
// Set of LHS categories of all rules in this subtree
public Set<String> cats = new LinkedHashSet<>();
public Trie next(String item) { return children.get(item); }
public void add(Rule rule) { add(rule, 0); }
private void add(Rule rule, int i) {
cats.add(rule.lhs);
if (i == rule.rhs.size()) {
if (!rules.contains(rule)) // filter exact match
rules.add(rule);
return;
}
String item = rule.rhs.get(i);
Trie child = children.get(item);
if (child == null)
children.put(item, child = new Trie());
child.add(rule, i + 1);
}
}