我试图理解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的文档,它通过一个例子解释了这一点(如下所示):
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
JavaLexer.g4,JavaParser.g4
我无法从上面的GitHub文档中获得太多关于如何构造模式字符串及其相应规则的信息。因此,我尝试了几个组合来获得匹配,但在work.For示例中,似乎没有一个组合:
ParseTreePattern p = parser.compileParseTreePattern("<variableDeclaratorId> = <variableInitializer>", parser.RULE_variableDeclarator);
ParseTreeMatch m = p.match(tree);
System.out.println(m);这意味着:
匹配失败;找到0标签
我知道我在我的字符串模式上肯定做错了什么。有谁能帮我解释一下这个模式匹配函数,并告诉我在这种情况下应该使用哪些正确的参数。此外,提供一些有用资源的链接将非常有帮助,在这些资源中,我可以了解更多这方面的知识,并研究复杂的模式(我在ANTLR4参考中找不到)。
发布于 2018-03-28 11:29:11
我认为你想要的是在XPath与树型匹配的结合中描述的。
也许是这样的:
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: 10https://stackoverflow.com/questions/49527919
复制相似问题