got optimized tree back with <expr> as single node

This commit is contained in:
Terence Parr 2013-09-09 13:50:33 -07:00
parent 7ead36fb4b
commit 0df4411ea7
3 changed files with 35 additions and 1 deletions

View File

@ -71,6 +71,8 @@ public class ParseTreePatternErrorStrategy extends DefaultErrorStrategy {
public void recover(Parser recognizer, RecognitionException e) {
if (e.getOffendingToken() instanceof RuleTagToken) {
recognizer.consume(); // match <tag> as if it matches rule, continue
// leaves <expr> as (expr <expr>) tree; can shrink later. this
// is simplest mechanism to get <expr> into tree.
}
else {
super.recover(recognizer, e);

View File

@ -191,9 +191,41 @@ public class ParseTreePatternMatcher {
catch (Exception e) {
throw new CannotInvokeStartRule(e);
}
shrinkRuleTagSubtreesToSingleNode(tree);
System.out.println("after optimize pattern tree = " + tree.toStringTree(parser));
return new ParseTreePattern(patternRuleName, pattern, tree);
}
// replace (expr <expr>) where <expr> is a TerminalNode with RuleTagToken
// symbol to a single RuleSubtreeNode for <expr>
protected void shrinkRuleTagSubtreesToSingleNode(ParseTree t) {
if ( t instanceof RuleNode ) {
RuleNode r = (RuleNode)t;
if ( r.getChildCount()==1 && r.getChild(0) instanceof TerminalNode ) {
TerminalNode c = (TerminalNode)r.getChild(0);
if ( c.getSymbol() instanceof RuleTagToken ) {
System.out.println("rule tag subtree "+t.toStringTree(parser));
ParserRuleContext parent = (ParserRuleContext)r.getParent();
int i = parent.children.indexOf(r);
if ( i==-1 ) {
System.out.printf("eh?-------------------");
}
RuleSubtreeNode sub = new RuleSubtreeNode((ParserRuleContext)r.getRuleContext());
parent.children.set(i, sub);
}
}
}
if ( t instanceof RuleNode) {
RuleNode r = (RuleNode)t;
int n = r.getChildCount();
for (int i = 0; i<n; i++) {
shrinkRuleTagSubtreesToSingleNode(r.getChild(i));
}
}
}
public List<? extends Token> tokenize(String pattern) {
lazyInit();
// make maps for quick look up

View File

@ -109,7 +109,7 @@ public class TestParseTreeMatcher extends BaseTest {
ParseTreePattern t = p.compile("s", "<ID> = <expr> ;");
String results = t.patternTree.toStringTree(p.getParser());
String expected = "(s <ID> = (expr <expr>) ;)";
String expected = "(s <ID> = expr ;)";
assertEquals(expected, results);
}