自定义访问函数遍历 AST 对象示例
定义访问变量声明节点的行为:继承 Visitor 并重写访问函数,找到未定义变量,将其变量词法单元存起来。
import std.ast.*
class MyVisitor <: Visitor {
public var unitializedVars = Tokens() // 存储变量词法单元
override public func visit(varDecl: VarDecl) {
try {
varDecl.expr
} catch (e: ASTException) {
unitializedVars.append(varDecl.identifier)
}
breakTraverse() // 不会继续遍历 varDecl 的子节点
return
}
}
main(): Int64 {
let input = quote(
var a : Int64
)
let varDecl = parseDecl(input)
let visitor = MyVisitor() // MyVisitor中定义了对 varDecl 节点的处理
varDecl.traverse(visitor) // 实现对 varDecl 节点的处理
println("Unitialized VarDecl size is ${visitor.unitializedVars.size}")
0
}
运行结果:
Unitialized VarDecl size is 1