【发布时间】:2018-10-17 04:16:51
【问题描述】:
我正在开发一个遍历 AST 的 scalac 插件。现在我在unit.body 上使用for each 循环,它是从传递的Global 值中获得的。我面临的问题是,由于每个遍历的递归性质,我访问每个Tree 及其子代,尽管我不想遍历后者,因为我使用模式匹配来匹配函数调用。
例如,如果我要遍历语句:
x.do(arg1)(arg2)(arg3)
我的遍历会得到以下东西:
1. x.do(arg1)(arg2)(arg3)
2. x.do(arg1)(arg2)
3. x.do(arg1)
4. x.do
5. x
6. do
7. arg1
8. arg2
9. arg3
在这里,我按遍历顺序缩进了 Tree 对象。现在,如果我使用Apply case 类来匹配每一个,我会得到 1,2 和 3 的匹配,而我真的只想要 1。我考虑过使用上下文相关的解决方案(比如检查与之前遍历的Tree) 相比,但这对于我的目的来说不够一致。我也不是在寻找使匹配更容易的特定方法,而是寻找一般的方法,但我不能让这些孩子被计算在内。
在编写 scalac 插件时,有没有更好的模式可以匹配函数调用,或者有更好的遍历方式,这样我就不会遇到这个递归问题?
【问题讨论】:
标签: scala pattern-matching abstract-syntax-tree scalac