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; charClass -> charClassEsc; charClass -> charClassExpr; edge [label="not 1E", color=steelblue4, fontcolor=steelblue4xs]; charClass -> WildcardEsc; edge [label="", color=black, fontcolor=black]; charClassExpr -> charGroup; charGroup -> posCharGroup; charGroup -> negCharGroup; XmlChar; singleCharEsc; edge [label="1E - D8", fontcolor=lightslategray, color=lightslategray]; 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=coral, fontcolor=coral]; XmlCharRef [color=coral, fontcolor=coral]; charRange -> XmlCharRef; // PER only edge [label="PER", color=crimson, fontcolor=crimson]; charRange -> XmlChar; // 1E, 2E-D8 edge [label="1E, 2E - D8", color=rosybrown4, fontcolor=rosybrown4]; XmlCharIncDash [color=rosybrown4, fontcolor=rosybrown4]; charRange -> XmlCharIncDash; // W only edge [label="W", color=darkorchid, fontcolor=darkorchid]; node [color=darkorchid, fontcolor=darkorchid]; 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; }