import lexer_example
@with_lexer(foo_lexer)
grammar foo_grammar {
    @main_rule main_rule <- list*(block)
    block <- or(
        | DefBlock("def" id "{" "}")
        | RegularBlock(id "{" "}")
    )
    id <- Identifier(@identifier)

}

@abstract class FooNode : Node {
}

class DefBlock : FooNode {
    @parse_field id : Identifier
}

class Identifier : FooNode implements TokenNode {
}

class RegularBlock : FooNode {
    @parse_field id : Identifier

    @export @lazy synth : SynthNode = SynthNode(id=node.id)
}

class SynthNode : FooNode {
    @parse_field id : Identifier
}
