如何在treePatterns中使用正则表达式?

时间:2014-05-27 16:39:57

标签: antlr antlr4

我正在使用关于Parse Tree Matching和XPath的示例here。更具体地说,我试图理解以下代码的工作原理:

// assume we are parsing Java
ParserRuleContext tree = parser.compilationUnit();
String xpath = "//blockStatement/*"; // get children of blockStatement
String treePattern = "int <Identifier> = <expression>;";
ParseTreePattern p =
parser.compileParseTreePattern(treePattern,   
ExprParser.RULE_localVariableDeclarationStatement);
List<ParseTreeMatch> matches = p.findAll(tree, xpath);
System.out.println(matches);

我想问的是,我们是否可以在treePattern字符串中包含正则表达式?

例如,我想编写一个模式来识别for循环中的所有localVariableDeclarations。

我希望能够识别以下代码:

for (Object o : list) {
    int tempVariable=0;
    if (  o.id ==12) {
        System.out.println(t);
    }
} 

我编写模式(用于识别此代码)的方式如下:

    String pattern3 = " for  ( <className1:type> <localName1:Identifier> : <listName1:expression>  ) { <localVariables1:localVariableDeclarationStatement> "
            + "if (<parameter1:expression>.<identifier1:Identifier> == <value1:primary> ) <block1:statement> }";

但是,如果我有多个局部变量,则模式不匹配。我试着在语法文件中添加一个'*',但是我得到了一个 *标签错误无效。

  <localVariables1:localVariableDeclarationStatement>*

当然我也可以添加一个带有两个localVariableDeclarationStatement语句的模式,但这又意味着我必须为我想要识别的每个局部变量数创建许多不同的模式:

  <localVariables1:localVariableDeclarationStatement> <localVariables2:localVariableDeclarationStatement> and identify the pattern with 

1 个答案:

答案 0 :(得分:1)

目前,我们不支持模式中的重复元素。我想到了这一点,但它本质上意味着制作另一个解析器生成器,而像这样的静态模式相当容易匹配。可以构建其中的一个,因为ANTLR的最后一个版本具有树语法,您实际上可以指定子树的语法结构。在我们决定对我们可以制作的模式进行哪种增强之前,我建议您发挥创意。

在您的特定情况下,找到for循环中的所有localVariableDeclarations,然后使用一小段代码来遍历该列表以识别连续序列(它们都是兄弟姐妹)以及那些终止的序列特别是IF模式。那会有用吗?