Very interesting. I am actually working for a few days now on something very related: Generate syntax tree data structures (in Swift) from a grammar (which is the actual grammar used for parsing). What I found very useful is to distinguish between hidden, auxiliary and visible symbols. Hidden symbols don't appear in the tree, visible symbols appear as normal, and for auxiliary symbols only their children appear in the syntax tree. Seems to work very nicely so far. This way, left oder right recursion for example doesn't matter if your recursion symbol is auxiliary, because it will just be flattened into a list anyway. Therefore I can use regular expressions in a grammar by desugaring them via auxiliary symbols in the usual way via context-free rules, and have a sensible syntax tree generated for that.
Yes, grammars can be used for both string matching and string generation. You could generate strings from an ungrammar, but you would need a way to generate valid tokens too.
Cool project, really weird and offputting branding.
I'd call this a "concrete grammar", calling something that's a grammar an "ungrammar" is cutesy. It feels lazy, like they stopped at the first idea they had.