package edu.stanford.nlp.sempre.test;
import edu.stanford.nlp.sempre.Grammar;
import edu.stanford.nlp.sempre.Rule;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.List;
/**
* Test that the grammar correctly parsers rules.
*/
public class GrammarTest {
public static Grammar makeTernaryGrammar() {
Grammar g = new Grammar();
g.addStatement("(rule $ROOT ($X) (IdentityFn))");
g.addStatement("(rule $X ($A $B $C) (IdentityFn))");
g.addStatement("(rule $A (a) (ConstantFn (string a)))");
g.addStatement("(rule $B (b) (ConstantFn (string b)))");
g.addStatement("(rule $C (c) (ConstantFn (string c)))");
return g;
}
/**
* Checks that each rule is one of the following:
* $Cat => token
* $Cat => $Cat
* $Cat => token token
* $Cat => token $Cat
* $Cat => $Cat token
* $Cat => $Cat $Cat
*/
public boolean isValidBinaryGrammar(Grammar g) {
for (Rule rule : g.getRules()) {
if (!Rule.isCat(rule.lhs)) return false;
if (rule.rhs.size() != 1 && rule.rhs.size() != 2) return false;
}
return true;
}
@Test
public void testBinarizationOfTernaryGrammar() {
Grammar g = makeTernaryGrammar();
List<Rule> rules = g.getRules();
Assert.assertEquals(6, rules.size());
Assert.assertTrue(isValidBinaryGrammar(g));
}
}