ParseTrees.
Patterns are strings of source input text with special tags representing token or rule references such as:
<ID> = <expr>;
Given a pattern start rule such as statement, this object constructs
a ParseTree with placeholders for the ID and expr
subtree. Then the match routines can compare an actual
ParseTree from a parse with this pattern. Tag <ID> matches
any ID token and tag <expr> references the result of the
expr rule (generally an instance of ExprContext.
Pattern x = 0; is a similar pattern that matches the same pattern
except that it requires the identifier to be x and the expression to
be 0.
The matches routines return true or false based
upon a match for the tree rooted at the parameter sent in. The
match routines return a ParseTreeMatch object that
contains the parse tree, the parse tree pattern, and a map from tag name to
matched nodes (more below). A subtree that fails to match, returns with
ParseTreeMatch#mismatchedNode set to the first tree node that did not
match.
For efficiency, you can compile a tree pattern in string form to a
ParseTreePattern object.
See TestParseTreeMatcher for lots of examples.
ParseTreePattern has two static helper methods:
ParseTreePattern#findAll and ParseTreePattern#match that
are easy to use but not super efficient because they create new
ParseTreePatternMatcher objects each time and have to compile the
pattern in string form before using it.
The lexer and parser that you pass into the ParseTreePatternMatcher
constructor are used to parse the pattern in string form. The lexer converts
the <ID> = <expr>; into a sequence of four tokens (assuming lexer
throws out whitespace or puts it on a hidden channel). Be aware that the
input stream is reset for the lexer (but not the parser; a
ParserInterpreter is created to parse the input.). Any user-defined
fields you have put into the lexer might get changed when this mechanism asks
it to scan the pattern string.
Normally a parser does not accept token <expr> as a valid
expr but, from the parser passed in, we create a special version of
the underlying grammar representation (an ATN) that allows imaginary
tokens representing rules (<expr>) to match entire rules. We call
these bypass alternatives.
Delimiters are < and >, with \ as the escape string
by default, but you can set them to whatever you want using
setDelimiters. You must escape both start and stop strings
\< and \>.
| Modifier and Type | Class and Description |
|---|---|
| public static class | |
| public static class |
| Modifier and Type | Field and Description |
|---|---|
| protected String | |
| private final Lexer | lexer
This is the backing field for |
| private final Parser | parser
This is the backing field for |
| protected String | |
| protected String |
| Access | Constructor and Description |
|---|---|
| public | ParseTreePatternMatcher(Lexer lexer, Parser parser)
Constructs a |
| Modifier and Type | Method and Description |
|---|---|
| public ParseTreePattern | compile(String pattern, int patternRuleIndex)
For repeated use of a tree pattern, compile it to a
|
| public Lexer | |
| public Parser | getParser()
Used to collect to the grammar file name, token names, rule names for used to parse the pattern into a parse tree. |
| protected RuleTagToken | |
| public ParseTreeMatch | match(ParseTree tree, String pattern, int patternRuleIndex)
Compare |
| public ParseTreeMatch | match(ParseTree tree, ParseTreePattern pattern)
Compare |
| public boolean | |
| public boolean | matches(ParseTree tree, ParseTreePattern pattern)
Does |
| protected ParseTree | Returns: the first node encountered intree which does not match
a corresponding node in patternTree, or null if the match
was successful. The specific node returned depends on the matching
algorithm used by the implementation, and may be overridden.Recursively walk |
| public void | setDelimiters(String
The start delimiter. start, String The stop delimiter. stop, String The escape sequence to use for escaping a start or stop delimiter. escapeLeft)Set the delimiters used for marking rule and token tags within concrete syntax used by the tree pattern parser. |
| public List | |
| public List |
| escape | back to summary |
|---|---|
| protected String escape | |
| lexer | back to summary |
|---|---|
| private final Lexer lexer This is the backing field for | |
| parser | back to summary |
|---|---|
| private final Parser parser This is the backing field for | |
| start | back to summary |
|---|---|
| protected String start | |
| stop | back to summary |
|---|---|
| protected String stop | |
| ParseTreePatternMatcher | back to summary |
|---|---|
| public ParseTreePatternMatcher(Lexer lexer, Parser parser) Constructs a | |
| compile | back to summary |
|---|---|
| public ParseTreePattern compile(String pattern, int patternRuleIndex) For repeated use of a tree pattern, compile it to a
| |
| getLexer | back to summary |
|---|---|
| public Lexer getLexer() Used to convert the tree pattern string into a series of tokens. The input stream is reset. | |
| getParser | back to summary |
|---|---|
| public Parser getParser() Used to collect to the grammar file name, token names, rule names for used to parse the pattern into a parse tree. | |
| getRuleTagToken | back to summary |
|---|---|
| protected RuleTagToken getRuleTagToken(ParseTree t) Is | |
| match | back to summary |
|---|---|
| public ParseTreeMatch match(ParseTree tree, String pattern, int patternRuleIndex) Compare | |
| match | back to summary |
|---|---|
| public ParseTreeMatch match(ParseTree tree, ParseTreePattern pattern) Compare | |
| matches | back to summary |
|---|---|
| public boolean matches(ParseTree tree, String pattern, int patternRuleIndex) Does | |
| matches | back to summary |
|---|---|
| public boolean matches(ParseTree tree, ParseTreePattern pattern) Does | |
| matchImpl | back to summary |
|---|---|
| protected ParseTree matchImpl(ParseTree tree, ParseTree patternTree, MultiMap<String, ParseTree> labels) Recursively walk
| |
| setDelimiters | back to summary |
|---|---|
| public void setDelimiters(String start, String stop, String escapeLeft) Set the delimiters used for marking rule and token tags within concrete syntax used by the tree pattern parser.
| |
| split | back to summary |
|---|---|
| public List Split | |
| tokenize | back to summary |
|---|---|
| public List | |
| Access | Constructor and Description |
|---|---|
| public |
| CannotInvokeStartRule | back to summary |
|---|---|
| public CannotInvokeStartRule(Throwable e) | |
| Access | Constructor and Description |
|---|---|
| public |
| StartRuleDoesNotConsumeFullPattern | back to summary |
|---|---|
| public StartRuleDoesNotConsumeFullPattern() | |