got optimized tree back with <expr> as single node
This commit is contained in:
parent
7ead36fb4b
commit
0df4411ea7
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue