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 |--\
| +-------+ |
/\-----\ /-----/\
|+--| X |--+|
\/-----/ \-----\/
| /---\ |
\----| * |----/
\---/
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 |--\
| \-----/ |
/\----\ /----/\
|+--| X |--+|
\/----/ \----\/
| /-----\ |
\--| 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 |--/--+|
| \----/ | | \----/ |
\----------------/ \------------/