digraph { fontname="Inconsolata, Consolas" fontsize=10 margin="0,0" penwidth=0.0 node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] node [shape = doublecircle]; Start; Finish; node [shape = box; style = "rounded, filled"; fillcolor=white ]; Start -> ArrayInitial [label=" ["]; Start -> ObjectInitial [label=" {"]; subgraph clusterArray { margin="10,10" style=filled fillcolor=gray95 label = "Array" ArrayInitial; Element; ElementDelimiter; ArrayFinish; } subgraph clusterObject { margin="10,10" style=filled fillcolor=gray95 label = "Object" ObjectInitial; MemberKey; KeyValueDelimiter; MemberValue; MemberDelimiter; ObjectFinish; } ArrayInitial -> ArrayInitial [label="["]; ArrayInitial -> ArrayFinish [label=" ]"]; ArrayInitial -> ObjectInitial [label="{", constraint=false]; ArrayInitial -> Element [label="string\nfalse\ntrue\nnull\nnumber"]; Element -> ArrayFinish [label="]"]; Element -> ElementDelimiter [label=","]; ElementDelimiter -> ArrayInitial [label=" ["]; ElementDelimiter -> ObjectInitial [label="{"]; ElementDelimiter -> Element [label="string\nfalse\ntrue\nnull\nnumber"]; ObjectInitial -> ObjectFinish [label=" }"]; ObjectInitial -> MemberKey [label=" string "]; MemberKey -> KeyValueDelimiter [label=":"]; KeyValueDelimiter -> ArrayInitial [label="["]; KeyValueDelimiter -> ObjectInitial [label=" {"]; KeyValueDelimiter -> MemberValue [label=" string\n false\n true\n null\n number"]; MemberValue -> ObjectFinish [label="}"]; MemberValue -> MemberDelimiter [label=","]; MemberDelimiter -> MemberKey [label=" string "]; ArrayFinish -> Finish; ObjectFinish -> Finish; }