import lexer_example
@with_lexer(foo_lexer)
grammar foo_grammar {
    @main_rule main_rule <- list+(decl)
    decl <- Decl(Name(@identifier) "(" list*(ref) ")")
    ref <- Ref(Name(@identifier))

}

@abstract class FooNode : Node {

    fun resolve_ref (): FooNode = match node {
        case r : Ref => r.parent.parent.node_env().get(r.name)?(0)
        case _ => null
    }
}

class Decl : FooNode {
    @parse_field name : Name
    @parse_field refs : ASTList[Ref]
}

class Name : FooNode implements TokenNode {
}

class Ref : FooNode {
    @parse_field name : Name

    @export fun resolve (): FooNode = node.node_env().get(node.name)?(0)
}
