具体语法匹配中的插值
Interpolation in Concrete Syntax Matching
我正在使用 Java 8 语法,我想查找方法调用的出现,更具体地说 it.hasNext()
,当 it
是 Iterator
.
这个有效:
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 语法中确实是一个非终结符,并且是方法调用语法规则的一部分。
我正在使用 Java 8 语法,我想查找方法调用的出现,更具体地说 it.hasNext()
,当 it
是 Iterator
.
这个有效:
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 语法中确实是一个非终结符,并且是方法调用语法规则的一部分。