首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抗Tree 4树模式匹配

抗Tree 4树模式匹配
EN

Stack Overflow用户
提问于 2018-03-28 06:52:11
回答 1查看 1.6K关注 0票数 3

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

代码语言:javascript
复制
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的文档,它通过一个例子解释了这一点(如下所示):

代码语言:javascript
复制
ParseTree t = ...; // assume t is a statement
ParseTreePattern p = parser.compileParseTreePattern("<ID> = <expr>;", MyParser.RULE_statement);
ParseTreeMatch m = p.match(t);
if ( m.succeeded() ) {...}

通过阅读这个文档和很少的其他资源,我所理解的是:

代码语言:javascript
复制
ParseTreePattern p = parser.compileParseTreePattern("<ID> = <expr>;", MyParser.RULE_statement);

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

JavaLexer.g4,JavaParser.g4

我无法从上面的GitHub文档中获得太多关于如何构造模式字符串及其相应规则的信息。因此,我尝试了几个组合来获得匹配,但在work.For示例中,似乎没有一个组合:

代码语言:javascript
复制
ParseTreePattern p = parser.compileParseTreePattern("<variableDeclaratorId> = <variableInitializer>", parser.RULE_variableDeclarator);
ParseTreeMatch m = p.match(tree);
System.out.println(m);

这意味着:

匹配失败;找到0标签

我知道我在我的字符串模式上肯定做错了什么。有谁能帮我解释一下这个模式匹配函数,并告诉我在这种情况下应该使用哪些正确的参数。此外,提供一些有用资源的链接将非常有帮助,在这些资源中,我可以了解更多这方面的知识,并研究复杂的模式(我在ANTLR4参考中找不到)。

此代码的解析树的一部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 11:29:11

我认为你想要的是在XPath与树型匹配的结合中描述的。

也许是这样的:

代码语言:javascript
复制
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());
    }
  }
}

其结果如下:

代码语言:javascript
复制
MATCH:
 - IDENTIFIER: q
 - expression: 42

MATCH:
 - IDENTIFIER: a
 - expression: 10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49527919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档