comment
╭────────────────────────────────────────╮
│ │
╭────╮ │ ┌──────────────────────────────┐ │ ╭────╮
├┼────│ /* │───╯─╭──│ anything but * followed by / │──╮─╰───│ */ │────┼┤
╰────╯ │ └──────────────────────────────┘ │ ╰────╯
╰────────────────────────────────────╯
newline
╭────╮
├┼──╮───│ \n │───╭──┼┤
│ ╰────╯ │
│ │
│ ╭──────╮ │
╰──│ \r\n │──╯
│ ╰──────╯ │
│ │
│ ╭────╮ │
╰───│ \r │───╯
│ ╰────╯ │
│ │
│ ╭────╮ │
╰───│ \f │───╯
╰────╯
whitespace
╭───────╮
├┼──╮───│ space │───╭──┼┤
│ ╰───────╯ │
│ │
│ ╭────╮ │
╰────│ \t │─────╯
│ ╰────╯ │
│ │
│ ┌─────────┐ │
╰──│ newline │──╯
└─────────┘
hex digit
┌────────────────┐
├┼────│ 0-9 a-f or A-F │────┼┤
└────────────────┘
escape
╭───╮ ┌──────────────────────────┐
├┼────│ \ │───╮────────│ not newline or hex digit │─────────╭──┼┤
╰───╯ │ └──────────────────────────┘ │
│ │
│ ┌───────────┐ │
╰───╭──│ hex digit │──╮──╮──────────────────╭─╯
│ └───────────┘ │ │ │
╰─1-6 times───────╯ │ ┌────────────┐ │
╰──│ whitespace │──╯
└────────────┘
<whitespace-token>
┌────────────┐
├┼───╭──│ whitespace │──╮───┼┤
│ └────────────┘ │
╰──────────────────╯
ws*
╭──────────────────────────────╮
│ │
│ ┌────────────────────┐ │
├┼──╯─╭──│ <whitespace-token> │──╮─╰──┼┤
│ └────────────────────┘ │
╰──────────────────────────╯
<ident-token>
╭────────────────────────────────────────────╮
│ │
┌────────────────────────┐ │ ┌──────────────────────────────┐ │
├┼──╮─────────╭─╮──│ a-z A-Z _ or non-ASCII │──╭─╯─╭─╮──│ a-z A-Z 0-9 _ - or non-ASCII │──╭─╮─╰──┼┤
│ │ │ └────────────────────────┘ │ │ │ └──────────────────────────────┘ │ │
│ ╭───╮ │ │ │ │ │ │ │
╰──│ - │──╯ │ ┌────────┐ │ │ │ ┌────────┐ │ │
╰───╯ ╰──────────│ escape │──────────╯ │ ╰─────────────│ escape │─────────────╯ │
└────────┘ │ └────────┘ │
╰────────────────────────────────────────╯
<function-token>
┌───────────────┐ ╭───╮
├┼────│ <ident-token> │─────│ ( │────┼┤
└───────────────┘ ╰───╯
<at-keyword-token>
╭───╮ ┌───────────────┐
├┼────│ @ │─────│ <ident-token> │────┼┤
╰───╯ └───────────────┘
<hash-token>
╭───╮ ┌──────────────────────────────┐
├┼────│ # │────╭─╮──│ a-z A-Z 0-9 _ - or non-ASCII │──╭─╮───┼┤
╰───╯ │ │ └──────────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────┐ │ │
│ ╰─────────────│ escape │─────────────╯ │
│ └────────┘ │
╰────────────────────────────────────────╯
<string-token>
╭────────────────────────────────────╮
│ │
╭───╮ │ ┌────────────────────┐ │ ╭───╮
├┼──╮────│ " │───╯─╭─╮───│ not " \ or newline │───╭─╮─╰───│ " │───╭──┼┤
│ ╰───╯ │ │ └────────────────────┘ │ │ ╰───╯ │
│ │ │ │ │ │
│ │ │ ┌────────┐ │ │ │
│ │ ╰─────────│ escape │─────────╯ │ │
│ │ │ └────────┘ │ │ │
│ │ │ │ │ │
│ │ │ ╭───╮ ┌─────────┐ │ │ │
│ │ ╰────│ \ │─────│ newline │───╯ │ │
│ │ ╰───╯ └─────────┘ │ │
│ ╰────────────────────────────────╯ │
│ │
│ ╭────────────────────────────────────╮ │
│ │ │ │
│ ╭───╮ │ ┌────────────────────┐ │ ╭───╮ │
╰────│ ' │───╯─╭─╮───│ not ' \ or newline │───╭─╮─╰───│ ' │───╯
╰───╯ │ │ └────────────────────┘ │ │ ╰───╯
│ │ │ │
│ │ ┌────────┐ │ │
│ ╰─────────│ escape │─────────╯ │
│ │ └────────┘ │ │
│ │ │ │
│ │ ╭───╮ ┌─────────┐ │ │
│ ╰────│ \ │─────│ newline │───╯ │
│ ╰───╯ └─────────┘ │
╰────────────────────────────────╯
<url-token>
╭─────────────────────────────────────╮
│ │
┌─────────────────────┐ ╭───╮ ┌─────┐ │ ┌──────────────┐ ┌─────┐ │ ╭───╮
├┼────│ <ident-token "url"> │─────│ ( │─────│ ws* │───╯──╮──│ url-unquoted │──╭───│ ws* │───╰───│ ) │────┼┤
└─────────────────────┘ ╰───╯ └─────┘ │ └──────────────┘ │ └─────┘ ╰───╯
│ │
│ ┌────────┐ │
╰─────│ STRING │─────╯
└────────┘
url-unquoted
┌───────────────────────────────────────────┐
├┼───╭─╮──│ not " ' ( ) \ whitespace or non-printable │──╭─╮───┼┤
│ │ └───────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────┐ │ │
│ ╰───────────────────│ escape │────────────────────╯ │
│ └────────┘ │
╰─────────────────────────────────────────────────────╯
<number-token>
╭───╮
╭──│ + │──╮
│ ╰───╯ │
│ │ ┌───────┐ ╭───╮ ┌───────┐
├┼──┼─────────┼─╮───╭──│ digit │──╮────│ . │────╭──│ digit │──╮──╭─╮────────────────────────────────────────────╭──┼┤
│ │ │ │ └───────┘ │ ╰───╯ │ └───────┘ │ │ │ │
│ ╭───╮ │ │ ╰─────────────╯ ╰─────────────╯ │ │ ╭───╮ │
╰──│ - │──╯ │ │ │ ╭──│ + │──╮ │
╰───╯ │ ┌───────┐ │ │ │ ╰───╯ │ │
╰────────────────╭──│ digit │──╮─────────────────╯ │ ╭───╮ │ │ ┌───────┐ │
│ │ └───────┘ │ │ ╰──╮──│ e │──╭─┼─────────┼──╭──│ digit │──╮──╯
│ ╰─────────────╯ │ │ ╰───╯ │ │ │ │ └───────┘ │
│ │ │ │ │ ╭───╮ │ ╰─────────────╯
│ ╭───╮ ┌───────┐ │ │ ╭───╮ │ ╰──│ - │──╯
╰─────────────│ . │────╭──│ digit │──╮───────────╯ ╰──│ E │──╯ ╰───╯
╰───╯ │ └───────┘ │ ╰───╯
╰─────────────╯
<dimension-token>
┌────────────────┐ ┌───────────────┐
├┼────│ <number-token> │─────│ <ident-token> │────┼┤
└────────────────┘ └───────────────┘
<percentage-token>
┌────────────────┐ ╭───╮
├┼────│ <number-token> │─────│ % │────┼┤
└────────────────┘ ╰───╯
<unicode-range-token>
╭───╮ ╭───╮ ┌───────────┐
├┼──╮──│ U │──╭───│ + │───╮───────────────────╭──│ hex digit │──╮──────────────────╭──┼┤
│ ╰───╯ │ ╰───╯ │ │ └───────────┘ │ │
│ │ │ ╰─1-6 times───────╯ │
│ ╭───╮ │ │ │
╰──│ u │──╯ │ ╭─────────────────────╮ │
╰───╯ │ │ │ │
│ │ ┌───────────┐ │ ╭───╮ │
╰──╯─╭──│ hex digit │──╮─╰──╭──│ ? │──────────────────╮──╯
│ │ └───────────┘ │ │ ╰───╯ │ │
│ ╰─1-5 times───────╯ ╰─1 to (6 - digits) times─╯ │
│ │
│ ┌───────────┐ ╭───╮ ┌───────────┐ │
╰───╭──│ hex digit │──╮────│ - │────╭──│ hex digit │──╮──╯
│ └───────────┘ │ ╰───╯ │ └───────────┘ │
╰─1-6 times───────╯ ╰─1-6 times───────╯
Stylesheet
╭──────────────────────────────────╮
│ │
│ ┌─────────────┐ │
│ ╭─────│ <CDO-token> │──────╮ │
│ │ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ │ │
│ ╭─────│ <CDC-token> │──────╮ │
│ │ └─────────────┘ │ │
│ │ │ │
│ │ ┌────────────────────┐ │ │
│ ╭──│ <whitespace-token> │──╮ │
│ │ └────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────┐ │ │
├┼──╯─╭─┼────│ Qualified rule │────┼─╮─╰──┼┤
│ │ └────────────────┘ │ │
│ │ │ │
│ │ ┌─────────┐ │ │
│ ╰───────│ At-rule │────────╯ │
│ └─────────┘ │
╰──────────────────────────────╯
Rule list
╭──────────────────────────────────╮
│ │
│ ┌────────────────────┐ │
│ ╭──│ <whitespace-token> │──╮ │
│ │ └────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────┐ │ │
├┼──╯─╭─┼────│ Qualified rule │────┼─╮─╰──┼┤
│ │ └────────────────┘ │ │
│ │ │ │
│ │ ┌─────────┐ │ │
│ ╰───────│ At-rule │────────╯ │
│ └─────────┘ │
╰──────────────────────────────╯
At-rule
╭───────────────────────────╮
│ │
┌────────────────────┐ │ ┌─────────────────┐ │ ┌──────────┐
├┼────│ <at-keyword-token> │───╯─╭──│ Component value │──╮─╰─╮──│ {} block │──╭──┼┤
└────────────────────┘ │ └─────────────────┘ │ │ └──────────┘ │
╰───────────────────────╯ │ │
│ ╭───╮ │
╰─────│ ; │──────╯
╰───╯
Qualified rule
╭───────────────────────────╮
│ │
│ ┌─────────────────┐ │ ┌──────────┐
├┼──╯─╭──│ Component value │──╮─╰───│ {} block │────┼┤
│ └─────────────────┘ │ └──────────┘
╰───────────────────────╯
Declaration list
╭───────────────────╮ ╭─────────────────────────────────────╮
│ │ │ │
┌─────┐ │ ┌─────────────┐ │ │ ╭───╮ ┌──────────────────┐ │
├┼────│ ws* │───╮──╯──│ Declaration │──╰─╯────│ ; │─────│ Declaration list │───╰─╭──┼┤
└─────┘ │ └─────────────┘ ╰───╯ └──────────────────┘ │
│ │
│ ┌─────────┐ ┌──────────────────┐ │
╰──────────────│ At-rule │─────│ Declaration list │──────────────╯
└─────────┘ └──────────────────┘
Declaration
╭───────────────────────────╮ ╭──────────────────╮
│ │ │ │
┌───────────────┐ ┌─────┐ ╭───╮ │ ┌─────────────────┐ │ │ ┌────────────┐ │
├┼────│ <ident-token> │─────│ ws* │─────│ : │───╯─╭──│ Component value │──╮─╰─╯──│ !important │──╰──┼┤
└───────────────┘ └─────┘ ╰───╯ │ └─────────────────┘ │ └────────────┘
╰───────────────────────╯
!important
╭───╮ ┌─────┐ ┌───────────────────────────┐ ┌─────┐
├┼────│ ! │─────│ ws* │─────│ <ident-token "important"> │─────│ ws* │────┼┤
╰───╯ └─────┘ └───────────────────────────┘ └─────┘
Component value
┌─────────────────┐
├┼──╮──│ Preserved token │──╭──┼┤
│ └─────────────────┘ │
│ │
│ ┌──────────┐ │
╰─────│ {} block │──────╯
│ └──────────┘ │
│ │
│ ┌──────────┐ │
╰─────│ () block │──────╯
│ └──────────┘ │
│ │
│ ┌──────────┐ │
╰─────│ [] block │──────╯
│ └──────────┘ │
│ │
│ ┌────────────────┐ │
╰──│ Function block │───╯
└────────────────┘
{} block
╭───────────────────────────╮
│ │
╭───╮ │ ┌─────────────────┐ │ ╭───╮
├┼────│ { │───╯─╭──│ Component value │──╮─╰───│ } │────┼┤
╰───╯ │ └─────────────────┘ │ ╰───╯
╰───────────────────────╯
() block
╭───────────────────────────╮
│ │
╭───╮ │ ┌─────────────────┐ │ ╭───╮
├┼────│ ( │───╯─╭──│ Component value │──╮─╰───│ ) │────┼┤
╰───╯ │ └─────────────────┘ │ ╰───╯
╰───────────────────────╯
[] block
╭───────────────────────────╮
│ │
╭───╮ │ ┌─────────────────┐ │ ╭───╮
├┼────│ [ │───╯─╭──│ Component value │──╮─╰───│ ] │────┼┤
╰───╯ │ └─────────────────┘ │ ╰───╯
╰───────────────────────╯
Function block
╭───────────────────────────╮
│ │
┌──────────────────┐ │ ┌─────────────────┐ │ ╭───╮
├┼────│ <function-token> │───╯─╭──│ Component value │──╮─╰───│ ) │────┼┤
└──────────────────┘ │ └─────────────────┘ │ ╰───╯
╰───────────────────────╯
glob pattern
┌───────┐
╭──│ ident │──╮
│ └───────┘ │
╭╰─────╮ ╭─────╯╮
├┼──┤ ╳ ├──┼┤
╰╭─────╯ ╰─────╮╯
│ ╭───╮ │
╰────│ * │────╯
╰───╯
SQL
╭──────────────────────────────────╮
│ │
╭────────╮ ╭───╮ ╭──────╮ ┌───────────┐ │ ╭───────╮ ┌───────────┐ │
├┼────────│ SELECT │───╮────────────────╭─╮────────────────────────────│ * │────────────────────────────╭───│ FROM │────╭──│ from_item │──╮──╯────│ WHERE │─────│ condition │───╰─┐
╰────────╯ │ │ │ ╰───╯ │ ╰──────╯ │ └───────────┘ │ ╰───────╯ └───────────┘ │
│ ╭──────────╮ │ │ │ │ ╭───╮ │ │
╰──│ DISTINCT │──╯ │ ╭─────────────────────────────────╮ │ ╰──│ , │──────────╯ │
╰──────────╯ │ │ │ │ ╰───╯ │
│ ┌────────────┐ │ ╭────╮ ┌─────────────┐ │ │ │
╰─╭────│ expression │───╯────│ AS │─────│ output_name │───╰─╮─╯ │
│ └────────────┘ ╰────╯ └─────────────┘ │ │
│ ╭───╮ │ │
╰──│ , │──────────────────────────────────────────────────╯ │
╰───╯ │
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
│ ╭───────────────────────────────────────────────────╮
│ │ │
│ ╭──────────────────────────────────────╮ ╭───────────────────────────────────╮ │ ╭───────────╮ │
│ │ │ │ │ │ │ │ │
│ │ ╭──────────╮ ┌────────────┐ │ │ ╭────────╮ ┌───────────┐ │ │ ╭───────╮ │ ╭─────╮ │ ┌────────┐ │
└────────────────────╯────│ GROUP BY │─────│ expression │───╰─╯────│ HAVING │─────│ condition │───╰─╯──╮────│ UNION │────╭─╯──│ ALL │──╰───│ select │───╰────────────────────┐
╰──────────╯ └────────────┘ ╰────────╯ └───────────┘ │ ╰───────╯ │ ╰─────╯ └────────┘ │
│ │ │
│ ╭───────────╮ │ │
╰──│ INTERSECT │──╯ │
│ ╰───────────╯ │ │
│ │ │
│ ╭────────╮ │ │
╰───│ EXCEPT │────╯ │
╰────────╯ │
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
│ ╭──────────────────────────────────────────────╮
│ │ │
│ ╭────────────────────────────────────────────────────────────╮ ╭────────────────────────────────╮ │ ╭────────────╮ │
│ │ │ │ │ │ │ │ │
│ │ ╭──────────╮ ┌────────────┐ │ │ ╭───────╮ ┌───────┐ │ │ ╭────────╮ ┌───────┐ │ ╭──────╮ │ │
└─────────────╯────│ ORDER BY │────╭────│ expression │───╮────────────╭─╮──╰─╯────│ LIMIT │───╮──│ count │──╭─╰─╯────│ OFFSET │─────│ start │───╯──│ ROWS │──╰─╰─────────────────┼┤
╰──────────╯ │ └────────────┘ │ │ │ ╰───────╯ │ └───────┘ │ ╰────────╯ └───────┘ ╰──────╯
│ │ ╭─────╮ │ │ │ │
│ ╰──│ ASC │───╯ │ │ ╭─────╮ │
│ │ ╰─────╯ │ │ ╰───│ ALL │───╯
│ │ │ │ ╰─────╯
│ │ ╭──────╮ │ │
│ ╰──│ DESC │──╯ │
│ ╰──────╯ │
│ ╭───╮ │
╰──│ , │─────────────────────────────╯
╰───╯
Group example
╭─────────────────────────╮
│ │
│ │
│ label │
│ ╭┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╮ │
╭─────╮ │ ┆ ╭─────╮ ┆ │
├┼────│ foo │───╯─╭──┼────│ foo │──┐ ┆ │
╰─────╯ │ ┆ ╰─────╯ │ ┆ │
│ ┆ ┌───────────┘ ┆ │
│ ┆ │ ╭─────╮ ┆ │ ╭─────╮
│ ┆ └──│ bar │────┼──╮─╰───│ bar │────┼┤
│ ┆ ╰─────╯ ┆ │ ╰─────╯
│ ╰┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╯ │
╰─────────────────────╯
Class example
╭─────╮ ╭──────╮ ┌──────┐
├┼────│ foo │─────│ blue │─────│ blue │────blue───┼┤
╰─────╯ ╰──────╯ └──────┘
rr-alternatingsequence
╭─────╮
╭──│ foo │──╮
│ ╰─────╯ │
╭╰────╮ ╭────╯╮
├┼──┤ ╳ ├──┼┤
╰╭────╯ ╰────╮╯
│ ╭─────╮ │
╰──│ bar │──╯
╰─────╯
rr-choice
╭───╮
╭──│ 1 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
├┼──┼──│ 2 │──┼──┼┤
│ ╰───╯ │
│ │
│ ╭───╮ │
╰──│ 3 │──╯
╰───╯
rr-group
╭┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╮
╭─────╮ ┆ ┌──────────┐ ┆ ╭─────╮
├┼────│ foo │─────┼─╮──│ option 1 │──╭─┼─────│ bar │────┼┤
╰─────╯ ┆ │ └──────────┘ │ ┆ ╰─────╯
┆ │ │ ┆
┆ │ ┌────────┐ │ ┆
┆ ╰───│ or two │───╯ ┆
┆ └────────┘ ┆
╰┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╯
rr-horizontalchoice
╭──────────────╮──────────────╮
│ ╭───╮ │ ╭───╮ │ ╭───╮
│ ╭──│ 0 │──╮ │ ╭──│ 5 │──╮ │ ╭──│ a │──╮
│ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │
│ │ │ │ │ │ │ │ │
│ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │
│ ╭──│ 1 │──╮ │ ╭──│ 6 │──╮ │ ╭──│ b │──╮
│ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │
│ │ │ │ │ │ │ │ │
│ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │
├┼──╯─┼──│ 2 │──┼─╮╰─┼──│ 7 │──┼─╮╰─┼──│ c │──┼─╭──┼┤
│ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │
│ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │
╰──│ 3 │──╯ │ ╰──│ 8 │──╯ │ ╰──│ d │──╯ │
│ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │
│ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │
╰──│ 4 │──╯ │ ╰──│ 9 │──╯ │ ╰──│ e │──╯ │
╰───╯ │ ╰───╯ │ ╰───╯ │
╰──────────────╰──────────────╯
rr-multchoice
╭───╮
╭──│ 1 │──╮
│ ╰───╯ │
│ │
┌─────┐ │ ╭───╮ │ ┌───┐
├┼────│ all │─┼──│ 2 │──┼─│ ↺ │────┼┤
└─────┘ │ ╰───╯ │ └───┘
│ │
│ ╭───╮ │
╰──│ 3 │──╯
╰───╯
rr-oneormore
╭─────╮
├┼───╭──│ foo │──╮───┼┤
│ ╰─────╯ │
│ ╭─────╮ │
╰──│ bar │──╯
╰─────╯
rr-optional
╭───────────╮
│ │
│ ╭─────╮ │
├┼──╯──│ foo │──╰─╮───────────╭──┼┤
╰─────╯ │ │
│ ╭─────╮ │
╰──│ bar │──╯
╰─────╯
rr-optionalsequence
╭───────────╮─────────────╮
│ ╭───╮ │ ╭───╮ │ ╭───╮
├┼──╯──│ 1 │──╮─╰──│ 2 │──╭─╮─╰──│ 3 │──╭──┼┤
╰───╯ │ ╰───╯ │ │ ╰───╯ │
╰───────────╯ ╰───────────╯
rr-sequence
╭───╮ ╭───╮ ╭───╮
├┼──────│ 1 │─────│ 2 │─────│ 3 │─────┼┤
╰───╯ ╰───╯ ╰───╯
rr-stack
╭───╮
├┼──────│ 1 │──┐
╰───╯ │
┌─────────┘
│ ╭───╮
└──│ 2 │──┐
╰───╯ │
┌─────────┘
│ ╭───╮
└──│ 3 │──────┼┤
╰───╯
rr-title
╭──────────╮
├┼──────│ Generate │──┐
╰──────────╯ │
┌────────────────┘
│ ╭──────╮ ┌───────────────────┐
└────│ some │────────╭──│ railroad diagrams │──╮───┼┤
╰──────╯ │ └───────────────────┘ │
╰─and more────────────────╯
rr-zeroormore-1
╭───────────────╮
│ │
│ ╭─────╮ │
├┼──╯─╭──│ foo │──╮─╰──┼┤
│ ╰─────╯ │
╰─bar───────╯
rr-zeroormore-2
╭───────────────╮
│ │
│ ╭─────╮ │
├┼──╯─╭──│ foo │──╮─╰─╮───────────────╭──┼┤
│ ╰─────╯ │ │ │
╰─bar───────╯ │ ╭─────╮ │
╰─╭──│ foo │──╮─╯
│ ╰─────╯ │
╰─bar───────╯
complicated-horizontalchoice-1
╭──────────────╮──────────────╮──────────────╮──────────────╮
│ │ ╭───╮ │ │ │
│ │ ╭──│ 1 │──╮ │ │ │
│ │ │ ╰───╯ │ │ │ │
│ │ │ │ │ │ │
│ │ │ ╭───╮ │ │ │ ╭───╮ │
│ │ ╭──│ 2 │──╮ │ │ ╭──│ 1 │──╮ │
│ │ │ ╰───╯ │ │ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │
│ │ │ ╭───╮ │ │ ╭───╮ │ │ ╭───╮ │ │
│ │ ╭──│ 3 │──╮ │ ╭──│ 1 │──╮ │ ╭──│ 2 │──╮ │
│ │ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │ │ │
│ │ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │ ╭───╮
│ │ ╭──│ 4 │──╮ │ ╭──│ 2 │──╮ │ ╭──│ 3 │──╮ │ ╭──│ 1 │──╮
│ │ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │
│ │ │ │ │ │ │ │ │ │ │ │ │ ╭──────────╮──────────╮──────────╮──────────╮
│ ╭───╮ │ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │ ╭───╮ │ ╭───╮ │ ╭───╮ │ ╭───╮ │ ╭───╮
├┼──╯─╮──│ 1 │──╭─╮╰─╯──│ 5 │──╰─╮╰─┼──│ 3 │──┼─╮╰─┼──│ 4 │──┼─╮╰─┼──│ 2 │──┼─╭─╯──│ 1 │──╮╰──│ 2 │──╮╰──│ 3 │──╮╰──│ 4 │──╮╰──│ 5 │──╭──┼┤
│ ╰───╯ │ │ ╰───╯ │ │ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │ ╰───╯ │ ╰───╯ │ ╰───╯ │ ╰───╯ │ ╰───╯ │
│ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────╰──────────╰──────────╰──────────╯
│ ╭───╮ │ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │ │ ╭───╮ │ │
╰──│ 2 │──╯ │ │ ╰──│ 4 │──╯ │ ╰──│ 5 │──╯ │ ╰──│ 3 │──╯ │
│ ╰───╯ │ │ │ │ ╰───╯ │ │ ╰───╯ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │ │ │
│ ╭───╮ │ │ │ │ ╭───╮ │ │ │ │ ╭───╮ │ │
╰──│ 3 │──╯ │ │ ╰──│ 5 │──╯ │ │ ╰──│ 4 │──╯ │
│ ╰───╯ │ │ │ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ │ │ │ │ │
│ ╭───╮ │ │ │ │ │ │ ╭───╮ │ │
╰──│ 4 │──╯ │ │ │ │ ╰──│ 5 │──╯ │
│ ╰───╯ │ │ │ │ │ ╰───╯ │
│ │ ╰──────────────╰──────────────╰──────────────╰──────────────╯
│ ╭───╮ │
╰──│ 5 │──╯
╰───╯
complicated-horizontalchoice-2
╭───╮
╭──│ 1 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 2 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 3 │──╮
│ ╰───╯ │
╭──────────────╮──────────╮ │ │
│ ╭───╮ │ ╭───╮ │ │ ╭───╮ │
├┼──╯─╮──│ 1 │──╭─╮╰──│ 4 │──╮╰─╯──│ 4 │──╰─╭──┼┤
│ ╰───╯ │ │ ╰───╯ │ ╰───╯ │
│ │ ╰──────────╰──────────────╯
│ ╭───╮ │
╰──│ 2 │──╯
│ ╰───╯ │
│ │
│ ╭───╮ │
╰──│ 3 │──╯
│ ╰───╯ │
│ │
│ ╭───╮ │
╰──│ 4 │──╯
╰───╯
complicated-horizontalchoice-3
╭───╮
╭──│ 1 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 2 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 3 │──╮
│ ╰───╯ │
╭──────────────╮──────────────╮ │ │
│ ╭───╮ │ ╭───╮ │ │ ╭───╮ │
├┼──╯─╮──│ 1 │──╭─╮╰────│ 1 │──┐ ╰─╯──│ 4 │──╰─╭──┼┤
│ ╰───╯ │ │ ╰───╯ │ ╰───╯ │
│ │ │ ┌─────────┘ │
│ ╭───╮ │ │ │ ╭───╮ │
╰──│ 2 │──╯ │ └──│ 2 │──┐ │
│ ╰───╯ │ │ ╰───╯ │ │
│ │ │ ┌─────────┘ │
│ ╭───╮ │ │ │ ╭───╮ │
╰──│ 3 │──╯ │ └──│ 3 │────╮ │
│ ╰───╯ │ │ ╰───╯ │ │
│ │ ╰──────────────╰──────────────╯
│ ╭───╮ │
╰──│ 4 │──╯
╰───╯
complicated-horizontalchoice-4
╭──────────────╮──────────────╮
│ │ ╭───╮ │
│ │ ╭──│ 1 │──╮ │
│ │ │ ╰───╯ │ │
│ │ │ │ │
│ │ │ ╭───╮ │ │
│ │ ╭──│ 2 │──╮ │
│ │ │ ╰───╯ │ │
│ │ │ │ │
│ │ │ ╭───╮ │ │
│ │ ╭──│ 3 │──╮ │
│ │ │ ╰───╯ │ │
│ │ │ │ │
│ ╭───╮ │ │ ╭───╮ │ │ ╭───╮
├┼──╯─╮──│ 1 │──╭─╮╰─╯──│ 4 │──╰─╮╰────│ 1 │──┐ ╭──┼┤
│ ╰───╯ │ │ ╰───╯ │ ╰───╯ │ │
│ │ │ │ ┌─────────┘ │
│ ╭───╮ │ │ │ │ ╭───╮ │
╰──│ 2 │──╯ │ │ └──│ 2 │──┐ │
│ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ ┌─────────┘ │
│ ╭───╮ │ │ │ │ ╭───╮ │
╰──│ 3 │──╯ │ │ └──│ 3 │────╯
│ ╰───╯ │ │ │ ╰───╯ │
│ │ ╰──────────────╰──────────────╯
│ ╭───╮ │
╰──│ 4 │──╯
╰───╯
complicated-horizontalchoice-5
╭───╮
╭──│ 1 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 2 │──╮
│ ╰───╯ │
│ │
│ ╭───╮ │
╭──│ 3 │──╮
│ ╰───╯ │
╭──────────────╮──────────────╮ │ │
│ ╭───╮ │ ╭───╮ │ │ ╭───╮ │
├┼──╯────│ 1 │──┐ ╰─╮──│ 1 │──╭─╮╰─╯──│ 4 │──╰─╭──┼┤
╰───╯ │ │ ╰───╯ │ │ ╰───╯ │
┌─────────┘ │ │ │ │
│ ╭───╮ │ ╭───╮ │ │ │
└──│ 2 │──┐ ╰──│ 2 │──╯ │ │
╰───╯ │ │ ╰───╯ │ │ │
┌─────────┘ │ │ │ │
│ ╭───╮ │ ╭───╮ │ │ │
└──│ 3 │────╮ ╰──│ 3 │──╯ │ │
╰───╯ │ │ ╰───╯ │ │ │
│ │ │ │ │
│ │ ╭───╮ │ │ │
│ ╰──│ 4 │──╯ │ │
│ ╰───╯ │ │
╰──────────────╰──────────────╯
single-stack
╭───╮
├┼──────│ 1 │──────┼┤
╰───╯
complicated-optionalsequence-1
╭───────────╮─────────────────╮──────────────────╮
│ │ ╭───╮ │ │
│ │ ╭──│ 2 │──╮ │ │
│ │ │ ╰───╯ │ │ │
│ │ │ │ │ │
│ │ │ ╭───╮ │ │ │
│ │ ╭──│ 3 │──╮ │ │
│ │ │ ╰───╯ │ │ │
│ │ │ │ │ │
│ ╭───╮ │ │ ╭───╮ │ │ ╭───╮ │
├┼──╯──│ 1 │──╮─╰─┼──│ 4 │──┼─╭─╮─╰────│ 6 │───┐ │
╰───╯ │ │ ╰───╯ │ │ │ ╰───╯ │ │
│ │ │ │ │ ┌──────────┘ │
│ │ ╭───╮ │ │ │ │ ╭───╮ │
│ ╰──│ 5 │──╯ │ │ └──│ 7 │───┐ │
│ ╰───╯ │ │ ╰───╯ │ │
╰───────────────╯ │ ┌──────────┘ │
│ │ ╭───╮ │
│ └──│ 8 │───┐ │
│ ╰───╯ │ │
│ ┌──────────┘ │
│ │ ╭───╮ │
│ └──│ 9 │───┐ │
│ ╰───╯ │ │
│ ┌──────────┘ │
│ │ ╭────╮ │ ╭────╮
│ └──│ 10 │────╭─╮─╰──│ 11 │──╭──┼┤
│ ╰────╯ │ │ ╰────╯ │
╰────────────────╯ ╰────────────╯