1digraph {
2    fontname="Inconsolata, Consolas"
3    fontsize=10
4    margin="0,0"
5    penwidth=0.0
6
7    node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5]
8    edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5]
9
10    node [shape = doublecircle]; Start; Finish;
11    node [shape = box; style = "rounded, filled"; fillcolor=white ];
12
13    Start -> ArrayInitial [label=" ["];
14    Start -> ObjectInitial [label=" {"];
15
16    subgraph clusterArray {
17        margin="10,10"
18        style=filled
19        fillcolor=gray95
20        label = "Array"
21
22        ArrayInitial; Element; ElementDelimiter; ArrayFinish;
23    }
24
25    subgraph clusterObject {
26        margin="10,10"
27        style=filled
28        fillcolor=gray95
29        label = "Object"
30
31        ObjectInitial; MemberKey; KeyValueDelimiter; MemberValue; MemberDelimiter; ObjectFinish;
32    }
33
34    ArrayInitial -> ArrayInitial [label="["];
35    ArrayInitial -> ArrayFinish [label=" ]"];
36    ArrayInitial -> ObjectInitial [label="{", constraint=false];
37    ArrayInitial -> Element [label="string\nfalse\ntrue\nnull\nnumber"];
38
39    Element -> ArrayFinish [label="]"];
40    Element -> ElementDelimiter [label=","];
41
42    ElementDelimiter -> ArrayInitial [label=" ["];
43    ElementDelimiter -> ObjectInitial [label="{"];
44    ElementDelimiter -> Element [label="string\nfalse\ntrue\nnull\nnumber"];
45
46    ObjectInitial -> ObjectFinish [label=" }"];
47    ObjectInitial -> MemberKey [label=" string "];
48
49    MemberKey -> KeyValueDelimiter [label=":"];
50
51    KeyValueDelimiter -> ArrayInitial [label="["];
52    KeyValueDelimiter -> ObjectInitial [label=" {"];
53    KeyValueDelimiter -> MemberValue [label=" string\n false\n true\n null\n number"];
54
55    MemberValue -> ObjectFinish [label="}"];
56    MemberValue -> MemberDelimiter [label=","];
57
58    MemberDelimiter -> MemberKey [label=" string "];
59
60    ArrayFinish -> Finish;
61    ObjectFinish -> Finish;
62}
63