JSON object
This diagram is composed directly from terminals, nonterminals, an optional branch, and a comma-separated repetition.
const value = alternatives(
terminal("null"), terminal("true"), terminal("false"),
nonterminal("number"), nonterminal("string"),
);
const member = sequence(nonterminal("string"), terminal(":"), value);
const object = sequence(
terminal("{"),
optional(zeroOrMore(member, terminal(","))),
terminal("}"),
);
renderSvg(object, {width: 520});