ANTLR 4 - 树模式匹配

2024-03-28

我试图理解 ANTLR 4 中的解析树匹配,所以为此 我有以下java代码:

package sampleCodes;

public class fruits {
  public static void main(String[] args){
    int a = 10;
    System.out.println(a);
  }
}

我正在使用 ANTLR 4 创建此代码的解析树。现在,我想使用树模式匹配函数来查找“int a = 10;”。 GitHub 上有一个文档:https://github.com/antlr/antlr4/blob/master/doc/tree-matching.md https://github.com/antlr/antlr4/blob/master/doc/tree-matching.md它通过一个例子解释了这一点(类似这样):

ParseTree t = ...; // assume t is a statement
ParseTreePattern p = parser.compileParseTreePattern("<ID> = <expr>;", MyParser.RULE_statement);
ParseTreeMatch m = p.match(t);
if ( m.succeeded() ) {...}

通过阅读本文档和其他一些资源,我了解到:

ParseTreePattern p = parser.compileParseTreePattern("<ID> = <expr>;", MyParser.RULE_statement);

作为第二个参数传递的规则必须能够正确解析作为第一个参数提供的模式。 现在我使用的语法是这里给出的java:https://github.com/antlr/grammars-v4/tree/master/java https://github.com/antlr/grammars-v4/tree/master/java

JavaLexer.g4, JavaParser.g4

我无法从上面的 GitHub 文档中获得有关如何构建模式字符串及其相应规则的太多信息。所以我尝试了几种组合来获得匹配,但它们似乎都不起作用。例如:

ParseTreePattern p = parser.compileParseTreePattern("<variableDeclaratorId> = <variableInitializer>", parser.RULE_variableDeclarator);
ParseTreeMatch m = p.match(tree);
System.out.println(m);

这给出:

匹配失败;找到 0 个标签

我知道我的字符串模式肯定做错了什么。任何人都可以帮我解释这个模式匹配函数,并告诉我在这种情况下使用的正确参数应该是什么。另外,提供一些有用资源的链接将非常有帮助,我可以在其中了解更多信息并处理复杂的模式。(我在 ANTLR4 参考中找不到它)

此代码的解析树的一部分 https://i.stack.imgur.com/4WWvc.png


我认为你想要的描述在结合 XPath 和树模式匹配 https://github.com/antlr/antlr4/blob/master/doc/tree-matching.md#combining-xpath-and-tree-pattern-matching.

也许是这样的:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.pattern.ParseTreeMatch;
import org.antlr.v4.runtime.tree.pattern.ParseTreePattern;

import java.util.List;

public class Main {

  public static void main(String[] args) {

    String source = "package sampleCodes;\n" +
            "\n" +
            "public class fruits {\n" +
            "\n" +
            "  static { int q = 42; }\n" +
            "\n" +
            "  public static void main(String[] args){\n" +
            "    int a = 10;\n" +
            "    System.out.println(a);\n" +
            "  }\n" +
            "}\n";

    JavaLexer lexer = new JavaLexer(CharStreams.fromString(source));
    JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.compilationUnit();

    ParseTreePattern p = parser.compileParseTreePattern("<IDENTIFIER> = <expression>", JavaParser.RULE_variableDeclarator);
    List<ParseTreeMatch> matches = p.findAll(tree, "//variableDeclarator");

    for (ParseTreeMatch match : matches) {
      System.out.println("\nMATCH:");
      System.out.printf(" - IDENTIFIER: %s\n", match.get("IDENTIFIER").getText());
      System.out.printf(" - expression: %s\n", match.get("expression").getText());
    }
  }
}

产生以下输出:

MATCH:
 - IDENTIFIER: q
 - expression: 42

MATCH:
 - IDENTIFIER: a
 - expression: 10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANTLR 4 - 树模式匹配 的相关文章

随机推荐