具体语法匹配中的插值

时间:2016-11-04 19:02:46

标签: rascal

我正在使用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中所示),但我无法使用它。

这种匹配在流氓中是否可行?如果是的话,怎么办呢?

1 个答案:

答案 0 :(得分:1)

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

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

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

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