void applyLexicalRules(Chart chart, List<String> tokens, int start, int end) { for(Rule rule: grammar.getLexicalRules(tokens.subList(start, end))) { chart.addDerivation(start, end, new Derivation(rule, null)); } }
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)); } } }
@Test void parseSyntactic() { Rule r1 = new Rule("$A", "a"); Rule r2 = new Rule("$B", "b"); Rule r3 = new Rule("$C", "$A $B"); Grammar grammar = new Grammar(Arrays.asList(r1, r2, r3), "$C"); Parser p = new Parser(grammar, s -> Arrays.asList(s.split(" ")), Collections.emptyList()); Derivation dc1 = new Derivation(r1, null); Derivation dc2 = new Derivation(r2, null); Derivation expected = new Derivation(r3, Arrays.asList(dc1, dc2)); Derivation actual = p.parseSyntactic("a b").get(0); assertEquals(expected.rule, actual.rule); assertEquals(expected.children.get(0).rule, actual.children.get(0).rule); assertEquals(expected.children.get(1).rule, actual.children.get(1).rule); }
@Test void applySemantics() { Rule r1 = new Rule("$A", "a"); Rule r2 = new Rule("$B", "$A $A", "{b:@1}"); Derivation dc1 = new Derivation(r1, null); Derivation dc2 = new Derivation(r1, null); Derivation d = new Derivation(r2, Arrays.asList(dc1, dc2)); Map<String, Object> expected = new HashMap<String, Object>(){{ put("b", "a"); }}; Parser p = new Parser(null, null, null); assertEquals(expected, p.applySemantics(d).get(0)); }
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))); } } } } } }
@Test void getRuleFeatures() { Rule r1 = new Rule("$A", "a"); Rule r2 = new Rule("$B", "$A $A"); Derivation dc1 = new Derivation(r1, Collections.emptyList()); Derivation dc2 = new Derivation(r1, Collections.emptyList()); Derivation d = new Derivation(r2, Arrays.asList(dc1, dc2)); Map<String, Integer> expected = new HashMap<String, Integer>(){{ put(r1.toString(), 2); put(r2.toString(), 1); }}; assertEquals(expected, d.getRuleFeatures()); } }
@Test void applyBinaryRules() { List<Rule> rules = Collections.singletonList( new Rule("$C", "$A $B")); Grammar grammar = new Grammar(rules, "$ROOT"); Parser p = new Parser(grammar, null, null); Parser.Chart chart = p.new Chart(10); chart.addDerivation(0, 1, new Derivation(new Rule("$A", "A"), null)); chart.addDerivation(1, 2, new Derivation(new Rule("$B", "B"), null)); p.applyBinaryRules(chart, 0, 2); assertEquals(rules.get(0), chart.getDerivations(0, 2).get(0).rule); } }
@Test void chartRetrieval(){ Parser p = new Parser(null, null, null); Parser.Chart chart = p.new Chart(10); assertEquals(32, chart.mapSpan(2, 3)); Derivation d = new Derivation(null, null); chart.addDerivation(3, 5, d); assertEquals(1, chart.getDerivations(3, 5).size()); assertEquals(d, chart.getDerivations(3, 5).get(0)); }
@Test void applyUnaryRules() { List<Rule> rules = Arrays.asList( new Rule("$F", "$E"), new Rule("$E", "$D")); Grammar grammar = new Grammar(rules, "$ROOT"); Parser p = new Parser(grammar, null, null); Parser.Chart chart = p.new Chart(10); chart.addDerivation(1, 3, new Derivation(new Rule("$D", "$B $C"), null)); p.applyUnaryRules(chart, 1, 3); assertEquals(3, chart.getDerivations(1, 3).size()); assertEquals(rules.get(0), chart.getDerivations(1, 3).get(2).rule); assertEquals(rules.get(1), chart.getDerivations(1, 3).get(1).rule); }