假设我想打印具有硬编码值的所有位置,在上下文中d是M3声明:
top-down visit(d) {
case \number(str numberValue) :
println("hardcode value <numberValue> encountered at <d@\src>");
}
问题是位置&lt; d @ \ src&gt;太通用了,它产生了整个声明(就像整个过程一样)。表达式&lt; numberValue @ \ src&gt;似乎更合适,但这是不允许的,可能是因为我们在解析树中太低了。
所以,问题是如何获得&lt; numberValue&gt;的父E(最接近的父,如表达本身)。这样&lt; E @ \ src&gt;定义了吗?
一种选择是在自上而下的遍历中添加额外的级别:
top-down visit(d) {
case \expressionStatement(Expression stmt): {
case \number(str numberValue) :
println("hardcode value <numberValue> encountered at <stmt@\src>");
}
}
这有效,但有一些缺点:
那么,获取numberValue(以及类似的低级结构,如stringValue&#39; s等)的正确方法是什么?
答案 0 :(得分:1)
您应该能够执行以下操作:
top-down visit(d) {
case n:\number(str numberValue) :
println("hardcode value <numberValue> encountered at <n@\src>");
}
说n:\number(str numberValue)
会将名称n
绑定到案例匹配的\number
节点。然后,您可以在邮件中使用此功能获取n
的位置。只需确保n
已经在范围内。您应该能够为您提到的其他场景创建类似的模式。