如何获取数值的位置?

时间:2015-05-21 15:31:40

标签: rascal

假设我想打印具有硬编码值的所有位置,在上下文中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等)的正确方法是什么?

1 个答案:

答案 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已经在范围内。您应该能够为您提到的其他场景创建类似的模式。