Java 类org.antlr.v4.runtime.tree.pattern.ParseTreePattern 实例源码

项目:hl7-mapping-validator    文件:JavascriptCodeGenerator.java   
private String translateToAssertionsPushCalls(SingleExpressionContext assertionStatementLeftHandSide, RuleContext ctx) {
    String translatedText = ctx.getText();
    String xpath = "//singleExpression";
    ParseTree parseTree = (ParseTree) ctx;

    translatedText = translateAssertionFunctionShortcuts(ctx, false);

    ParseTreePattern assertionExpressionPattern = this.parser.compileParseTreePattern(
            "<assertionOperator> <singleExpression>",
            HL7MappingValidatorParser.RULE_singleExpression);
    List<ParseTreeMatch> assertionExpressionMatches = assertionExpressionPattern.findAll(parseTree, xpath);
    for (ParseTreeMatch match : assertionExpressionMatches) {
        AssertionOperatorContext operator = (AssertionOperatorContext) match.get("assertionOperator");
        SingleExpressionContext assertionStatementRightHandSide = (SingleExpressionContext) match.get("singleExpression");
        String translatedFunctionCall = translateToAssertionsPushCall(assertionStatementLeftHandSide, operator, assertionStatementRightHandSide);
        String matchTextTranslated = translateAssertionFunctionShortcuts((RuleContext) match.getTree(), false);
        translatedText = translatedText.replace(matchTextTranslated, translatedFunctionCall);
    }

    return translatedText;
}
项目:hl7-mapping-validator    文件:JavascriptCodeGenerator.java   
private void detectAssertionShortcuts(RuleContext ctx) {
    String xpath = "//singleExpression";
    ParseTree parseTree = (ParseTree) ctx;
    ParseTreePattern p = this.parser.compileParseTreePattern(
            "@ <arguments>",
            HL7MappingValidatorParser.RULE_singleExpression);
    List<ParseTreeMatch> matches = p.findAll(parseTree, xpath);
    for (ParseTreeMatch match : matches) {
        System.out.println(match.getTree().getText());
    }

}
项目:Scratch-ApuC    文件:Parser.java   
/**
 * The same as {@link #compileParseTreePattern(String, int)} but specify a
 * {@link Lexer} rather than trying to deduce it from this parser.
 */
public ParseTreePattern compileParseTreePattern(String pattern, int patternRuleIndex,
                                                Lexer lexer)
{
    ParseTreePatternMatcher m = new ParseTreePatternMatcher(lexer, this);
    return m.compile(pattern, patternRuleIndex);
}
项目:intellij-plugin-v4    文件:GenerateLexerRulesForLiteralsAction.java   
@Override
    public void actionPerformed(AnActionEvent e) {
        LOG.info("actionPerformed GenerateLexerRulesForLiteralsAction");
        final Project project = e.getProject();

        final PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
        if (psiFile == null) {
            return;
        }
        String inputText = psiFile.getText();
        ParsingResult results = ParsingUtils.parseANTLRGrammar(inputText);

        final Parser parser = results.parser;
        final ParseTree tree = results.tree;
        Collection<ParseTree> literalNodes = XPath.findAll(tree, "//ruleBlock//STRING_LITERAL", parser);
        LinkedHashMap<String, String> lexerRules = new LinkedHashMap<String, String>();
        for (ParseTree node : literalNodes) {
            String literal = node.getText();
            String ruleText = String.format("%s : %s ;",
                                            RefactorUtils.getLexerRuleNameFromLiteral(literal), literal);
            lexerRules.put(literal, ruleText);
        }

        // remove those already defined
        String lexerRulesXPath = "//lexerRule";
        String treePattern = "<TOKEN_REF> : <STRING_LITERAL>;";
        ParseTreePattern p = parser.compileParseTreePattern(treePattern, ANTLRv4Parser.RULE_lexerRule);
        List<ParseTreeMatch> matches = p.findAll(tree, lexerRulesXPath);

        for (ParseTreeMatch match : matches) {
            ParseTree lit = match.get("STRING_LITERAL");
            if (lexerRules.containsKey(lit.getText())) { // we have rule for this literal already
                lexerRules.remove(lit.getText());
            }
        }

        final LiteralChooser chooser =
            new LiteralChooser(project, new ArrayList<String>(lexerRules.values()));
        chooser.show();
        List<String> selectedElements = chooser.getSelectedElements();
        // chooser disposed automatically.

        final Editor editor = e.getData(PlatformDataKeys.EDITOR);
        final Document doc = editor.getDocument();
        final CommonTokenStream tokens = (CommonTokenStream) parser.getTokenStream();
//      System.out.println(selectedElements);
        if (selectedElements != null) {
            String text = doc.getText();
            int cursorOffset = editor.getCaretModel().getOffset();
            // make sure it's not in middle of rule; put between.
//                  System.out.println("offset "+cursorOffset);
            Collection<ParseTree> allRuleNodes = XPath.findAll(tree, "//ruleSpec", parser);
            for (ParseTree r : allRuleNodes) {
                Interval extent = r.getSourceInterval(); // token indexes
                int start = tokens.get(extent.a).getStartIndex();
                int stop = tokens.get(extent.b).getStopIndex();
//                      System.out.println("rule "+r.getChild(0).getText()+": "+start+".."+stop);
                if (cursorOffset < start) {
                    // before this rule, so must be between previous and this one
                    cursorOffset = start; // put right before this rule
                    break;
                }
                else if (cursorOffset >= start && cursorOffset <= stop) {
                    // cursor in this rule
                    cursorOffset = stop + 2; // put right before this rule (after newline)
                    if (cursorOffset >= text.length()) {
                        cursorOffset = text.length();
                    }
                    break;
                }
            }

            String allRules = Utils.join(selectedElements.iterator(), "\n");
            text =
                text.substring(0, cursorOffset) +
                    "\n" + allRules + "\n" +
                    text.substring(cursorOffset, text.length());
            MyPsiUtils.replacePsiFileFromText(project, psiFile, text);
        }
    }
项目:Scratch-ApuC    文件:Parser.java   
/**
 * The preferred method of getting a tree pattern. For example, here's a
 * sample use:
 *
 * <pre>
 * ParseTree t = parser.expr();
 * ParseTreePattern p = parser.compileParseTreePattern("&lt;ID&gt;+0", MyParser.RULE_expr);
 * ParseTreeMatch m = p.match(t);
 * String id = m.get("ID");
 * </pre>
 */
public ParseTreePattern compileParseTreePattern(String pattern, int patternRuleIndex) {
    if ( getTokenStream()!=null ) {
        TokenSource tokenSource = getTokenStream().getTokenSource();
        if ( tokenSource instanceof Lexer ) {
            Lexer lexer = (Lexer)tokenSource;
            return compileParseTreePattern(pattern, patternRuleIndex, lexer);
        }
    }
    throw new UnsupportedOperationException("Parser can't discover a lexer to use");
}
项目:SwiftAnalyzer    文件:PatternMatching.java   
/**
 * Searches for subtrees that adhere to the given XPath expression
 * and applies pattern matching on each subtree.
 *
 * @param pattern the parse tree pattern, refer to https://github.com/antlr/antlr4/blob/master/doc/faq/parse-trees.md
 * @param rule the production rule in the parser that the pattern adheres to
 * @param xPath the XPath expression that will be used to find subtrees
 * @return a list of matches
 */
List<ParseTreeMatch> match(String pattern, int rule, String xPath) {
    ParseTreePattern p = ast.getParser().compileParseTreePattern(pattern, rule);
    return p.findAll(ast.getTree(), xPath);
}