void applyUnaryRules(Chart chart, int start, int end) { LinkedList<Derivation> queue = new LinkedList<>(chart.getDerivations(start, end)); while(!queue.isEmpty()) { Derivation d = queue.removeFirst(); for(Rule rule: grammar.getUnaryRules(d.rule.getLHS())) { if(chart.isSpanFull(start, end)) return; //System.out.println(rule); Derivation parent = new Derivation(rule, Collections.singletonList(d)); queue.addLast(parent); chart.addDerivation(start, end, parent); } } }
void applyAnnotators(Chart chart, List<String> tokens, int start, int end) { for(Annotator annotator: annotators) { for(Rule rule: annotator.annotate(tokens.subList(start, end))) { if(chart.isSpanFull(start, end)) return; chart.addDerivation(start, end, new Derivation(rule, null)); } } }
void applyBinaryRules(Chart chart, int start, int end) { if(end > start + 1) { for(int mid = start + 1; mid < end; mid++) { List<Derivation> left = chart.getDerivations(start, mid); List<Derivation> right = chart.getDerivations(mid, end); for(Derivation l:left) { for(Derivation r: right) { for(Rule rule: grammar.getBinaryRules(l.rule.getLHS(), r.rule.getLHS())) { if(chart.isSpanFull(start, end)) return; //System.out.println(rule); chart.addDerivation(start, end, new Derivation(rule, Arrays.asList(l, r))); } } } } } }