From 4c52a103e1830a2b47a79d7fbf748b333f851bfc Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Fri, 22 Nov 2013 11:31:59 -0800 Subject: [PATCH] cleanup --- .../runtime/tree/pattern/ParseTreeMatch.java | 4 ++ .../tree/pattern/ParseTreePattern.java | 2 +- .../tree/pattern/ParseTreePatternMatcher.java | 70 +++++++++++-------- .../antlr/v4/test/TestParseTreeMatcher.java | 6 +- 4 files changed, 47 insertions(+), 35 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.java b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.java index 80b2791b8..3c3596cb8 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.java @@ -126,4 +126,8 @@ public class ParseTreeMatch { public ParseTree getTree() { return tree; } + + public String toString() { + return tree.getText(); + } } diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePattern.java b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePattern.java index 9c950ed54..431144ac9 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePattern.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePattern.java @@ -65,7 +65,7 @@ public class ParseTreePattern { ParseTreePatternMatcher p = new ParseTreePatternMatcher(lexer, parser); for (ParseTree t : subtrees) { ParseTreeMatch match = p.match(t, pattern, patternRuleName); - if ( !match.succeeded() ) { + if ( match.succeeded() ) { matches.add(match); } } diff --git a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java index 2f08b45c8..81426e512 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java +++ b/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java @@ -162,7 +162,7 @@ public class ParseTreePatternMatcher { /** Does pattern matched as a patternRuleName match tree? */ public boolean matches(ParseTree tree, String pattern, String patternRuleName) { - ParseTreePattern p = compile(patternRuleName, pattern); + ParseTreePattern p = compile(pattern, patternRuleName); return matches(tree, p); } @@ -180,7 +180,7 @@ public class ParseTreePatternMatcher { * or the node at which the match failed. */ public ParseTreeMatch match(ParseTree tree, String pattern, String patternRuleName) { - ParseTreePattern p = compile(patternRuleName, pattern); + ParseTreePattern p = compile(pattern, patternRuleName); return match(tree, p); } @@ -195,6 +195,32 @@ public class ParseTreePatternMatcher { return match; } + /** For repeated use of a tree pattern, compile it to a ParseTreePattern + * using this method. + */ + public ParseTreePattern compile(String pattern, String patternRuleName) { + List tokenList = tokenize(pattern); + ListTokenSource tokenSrc = new ListTokenSource(tokenList); + CommonTokenStream tokens = new CommonTokenStream(tokenSrc); + + ParserInterpreter parserInterp = new ParserInterpreter(parser.getGrammarFileName(), + Arrays.asList(parser.getTokenNames()), + Arrays.asList(parser.getRuleNames()), + atnWithBypassAlts, + tokens); + + ParseTree tree = null; + try { + Integer ruleIndex = ruleToIndex.get(patternRuleName); + tree = parserInterp.parse(ruleIndex); +// System.out.println("pattern tree = "+tree.toStringTree(parserInterp)); + } + catch (Exception e) { + throw new CannotInvokeStartRule(e); + } + + return new ParseTreePattern(patternRuleName, pattern, tree); + } public Lexer getLexer() { return lexer; @@ -284,7 +310,7 @@ public class ParseTreePatternMatcher { 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)); +// System.out.println("rule tag subtree "+t.toStringTree(parser)); return (RuleTagToken)c.getSymbol(); } } @@ -292,30 +318,6 @@ public class ParseTreePatternMatcher { return null; } - public ParseTreePattern compile(String patternRuleName, String pattern) { - List tokenList = tokenize(pattern); - ListTokenSource tokenSrc = new ListTokenSource(tokenList); - CommonTokenStream tokens = new CommonTokenStream(tokenSrc); - - ParserInterpreter parserInterp = new ParserInterpreter(parser.getGrammarFileName(), - Arrays.asList(parser.getTokenNames()), - Arrays.asList(parser.getRuleNames()), - atnWithBypassAlts, - tokens); - - ParseTree tree = null; - try { - Integer ruleIndex = ruleToIndex.get(patternRuleName); - tree = parserInterp.parse(ruleIndex); - System.out.println("pattern tree = "+tree.toStringTree(parserInterp)); - } - catch (Exception e) { - throw new CannotInvokeStartRule(e); - } - - return new ParseTreePattern(patternRuleName, pattern, tree); - } - public List tokenize(String pattern) { // make maps for quick look up Map tokenNameToType = Utils.toMap(parser.getTokenNames()); @@ -332,16 +334,22 @@ public class ParseTreePatternMatcher { // add special rule token or conjure up new token from name if ( Character.isUpperCase(tagChunk.tag.charAt(0)) ) { Integer ttype = tokenNameToType.get(tagChunk.tag); + if ( ttype==null ) { + throw new IllegalArgumentException("Unknown token "+tagChunk.tag+" in pattern: "+pattern); + } TokenTagToken t = new TokenTagToken(tagChunk.tag, ttype, tagChunk.label); tokens.add(t); } else if ( Character.isLowerCase(tagChunk.tag.charAt(0)) ) { - int ruleIndex = ruleNameToIndex.get(tagChunk.tag); + Integer ruleIndex = ruleNameToIndex.get(tagChunk.tag); + if ( ruleIndex==null ) { + throw new IllegalArgumentException("Unknown rule "+tagChunk.tag+" in pattern: "+pattern); + } int ruleImaginaryTokenType = atnWithBypassAlts.ruleToTokenType[ruleIndex]; tokens.add(new RuleTagToken(tagChunk.tag, ruleImaginaryTokenType, tagChunk.label)); } else { - System.err.println("invalid tag: "+tagChunk.tag); + throw new IllegalArgumentException("invalid tag: "+tagChunk.tag+" in pattern: "+pattern); } } else { @@ -357,12 +365,12 @@ public class ParseTreePatternMatcher { } catch (IOException ioe) { // ----------------- - System.err.println("what?-----------------"); + throw new IllegalArgumentException("IOException lexing pattern: "+pattern, ioe); } } } - System.out.println("tokens="+tokens); +// System.out.println("tokens="+tokens); return tokens; } diff --git a/tool/test/org/antlr/v4/test/TestParseTreeMatcher.java b/tool/test/org/antlr/v4/test/TestParseTreeMatcher.java index ea17f8708..70a897012 100644 --- a/tool/test/org/antlr/v4/test/TestParseTreeMatcher.java +++ b/tool/test/org/antlr/v4/test/TestParseTreeMatcher.java @@ -112,7 +112,7 @@ public class TestParseTreeMatcher extends BaseTest { ParseTreePatternMatcher p = getMatcher("X2"); - ParseTreePattern t = p.compile("s", " = ;"); + ParseTreePattern t = p.compile(" = ;", "s"); String results = t.patternTree.toStringTree(p.getParser()); String expected = "(s = (expr ) ;)"; assertEquals(expected, results); @@ -133,7 +133,7 @@ public class TestParseTreeMatcher extends BaseTest { ParseTreePatternMatcher p = getMatcher("X2"); - ParseTreePattern t = p.compile("s", " = ;"); + ParseTreePattern t = p.compile(" = ;", "s"); String results = t.patternTree.toStringTree(p.getParser()); String expected = "(s = (expr ) ;)"; assertEquals(expected, results); @@ -152,7 +152,7 @@ public class TestParseTreeMatcher extends BaseTest { ParseTreePatternMatcher p = getMatcher("X2"); - ParseTreePattern t = p.compile("s", " = ;"); + ParseTreePattern t = p.compile(" = ;", "s"); String results = t.patternTree.toStringTree(p.getParser()); String expected = "(s = ;)"; assertEquals(expected, results);