import lexer_example
@with_lexer(foo_lexer)
grammar foo_grammar {
    @main_rule main_rule <- list+(def_rule)
    name <- Name(@identifier)
    def_rule <- Def(
        "def" name ?pick("(" list+(name, ",") ")") "=" expr
    )
    expr <- or(
        | Plus(expr "+" expr)
        | ParentExpr("(" expr ")")
        | Ref(name)
        | Literal(@number)
    )

}

@abstract class FooNode : Node {
}

class Def : FooNode {
    @parse_field name : Name
    @parse_field args : ASTList[Name]
    @parse_field expr : Expr
}

@abstract class Expr : FooNode {
}

class Literal : Expr implements TokenNode {
}

class ParentExpr : Expr {
    @parse_field expr : Expr
}

class Plus : Expr {
    @parse_field lhs : Expr
    @parse_field rhs : Expr
}

class Ref : Expr {
    @parse_field name : Name
}

class Name : FooNode implements TokenNode {
}
