digraph reachability { /* grammar versions as marked */ /* regExp -> branch -> piece; piece -> atom; piece -> quantifier -> quantity; quantity -> quantRange -> quantExact; quantity -> quantMin -> quantExact; quantity -> quantExact; Char [label = "[Normal]Char"]; atom -> Char; atom -> charClass; atom -> regExp; */ /* coloring: old(v2) v3 1E coral #70 DA 00 vs others steelblue4 DA 53 00 PER crimson 00 DA 08 vs others rosybrown4 DA 86 00 (strictly speaking all but W) Others forestgreen 3F 00 DA vs W darkorchid AE 60 DA */ charClass -> charClassEsc; charClass -> charClassExpr; edge [label="not 1E", color="#DA5300", fontcolor="#DA5300"]; charClass -> WildcardEsc; edge [label="", color=black, fontcolor=black]; charClassExpr -> charGroup; charGroup -> posCharGroup; charGroup -> negCharGroup; XmlChar; singleCharEsc; edge [label="1E - D8", fontcolor="#3F00DA", color="#3F00DA"]; charGroup -> charClassSub; posCharGroup -> charRange; posCharGroup -> charClassEsc; charClassSub -> posCharGroup; charClassSub -> negCharGroup; charClassSub -> charClassExpr; charRange -> seRange; seRange -> charOrEsc; charOrEsc -> XmlChar; charOrEsc -> singleCharEsc; // 1E only edge [label="1E", color="#70DA00", fontcolor="#70DA00"]; XmlCharRef [color="#70DA00", fontcolor="#70DA00"]; charRange -> XmlCharRef; // PER only edge [label="PER", color="#00DA08", fontcolor="#00DA08"]; charRange -> XmlChar; // 1E, 2E-D8 edge [label="1E, 2E - D8", color="#DA8600", fontcolor="#DA8600"]; XmlCharIncDash [color="#DA8600", fontcolor="#DA8600"]; charRange -> XmlCharIncDash; // W only edge [label="W", color="#AE60DA", fontcolor="#AE60DA"]; node [color="#AE60DA", fontcolor="#AE60DA"]; charGroup -> charClassExpr; posCharGroup -> charGroupPart; charGroupPart -> singleChar; charGroupPart -> charRange; singleChar -> singleCharEsc; singleChar -> singleCharNoEsc; charRange -> singleChar; // all again edge [label="", color=black]; node[color=black, fontcolor=black]; negCharGroup -> posCharGroup; charClassEsc -> SingleCharEsc; charClassEsc -> MultiCharEsc; charClassEsc -> catEsc -> charProp; charClassEsc -> complEsc -> charProp; charProp -> IsCategory; charProp -> IsBlock; }