具体语法匹配中的插值

Interpolation in Concrete Syntax Matching

我正在使用 Java 8 语法,我想查找方法调用的出现,更具体地说 it.hasNext(),当 itIterator .

这个有效:

visit(unit) {
    case (MethodInvocation)`it . <TypeArguments? ta> hasNext()`: {
        println("found");
    }
}

理想情况下,我想匹配任何标识符,而不仅仅是 it

所以我尝试使用字符串插值,它编译但不匹配:

str iteratorId = "it";
visit(unit) {
    case (MethodInvocation)`$iteratorId$ . <TypeArguments? ta> hasNext()`: {
        println("achei");
    }
}

我还尝试了其他几种方法,包括模式变量使用(如 docs 中所示),但我无法使它起作用。

流氓中可以进行这种匹配吗?如果是,如何实现?

答案具体取决于您使用的语法,我没有查找,但通常在具体语法片段中,此符号用于占位符:<NonTerminal variableName>

因此您的模式应如下所示:

str iteratorId = "it";
visit(unit) {
    case (MethodInvocation)`<MethodName name>.<TypeArguments? ta>hasNext()`: 
       if (iteratorId == "<name>") println("bingo!");
}

假设 MethodName 在您的 Java8 语法中确实是一个非终结符,并且是方法调用语法规则的一部分。