haddock2/Grammar.ebnf

88 lines
4.2 KiB
EBNF

document ::= paragraph*
paragraph ::= ( text_paragraph | code_block | header | list | table ) newline?
text_paragraph ::= text_element+
text_element ::= emphasis | bold | monospace | link | anchor | identifier |
inline_math | image | plain_text | escaped_char
emphasis ::= '/' text_no_newline '/'
bold ::= '__' text_no_newline '__'
monospace ::= '@' text_content '@'
link ::= module_link | hyperlink | markdown_link
module_link ::= '"' module_name ( ('#' | '\#') anchor_name )? '"'
hyperlink ::= '<' url ( ' ' link_text )? '>'
markdown_link ::= '[' link_text '](' ( url | module_link ) ')'
anchor ::= '#' anchor_name '#'
identifier ::= "'" haskell_id "'"
inline_math ::= '\(' math_expr '\)'
image ::= '<<' image_path ( ' ' image_title )? '>>' |
'![' alt_text '](' image_path ')'
code_block ::= at_block | bird_tracks | example_block | property_block
at_block ::= '@' newline code_content newline '@'
bird_tracks ::= ( '>' ' '? code_line newline )+
example_block ::= ( '>>>' ' ' expression newline result_line* )+
property_block ::= 'prop>' ' ' property_desc newline
header ::= header_marker ' ' header_text newline
header_marker ::= '=' | '==' | '===' | '====' | '=====' | '======'
list ::= unordered_list | ordered_list | definition_list
unordered_list ::= ( list_marker ' ' list_content )+
list_marker ::= '*' | '-'
ordered_list ::= ( number_marker ' ' list_content )+
number_marker ::= digit+ '.' | '(' digit+ ')'
definition_list ::= ( '[' term ']' ':'? ' ' definition_content )+
table ::= table_border header_row header_sep data_row* table_border
table_border ::= '+' ( '-' | '+' )* newline
header_row ::= '|' ( table_cell '|' )* newline
header_sep ::= '+' ( '=' | '+' )* newline
data_row ::= '|' ( table_cell '|' )* newline
plain_text ::= text_char+
text_char ::= letter | digit | ' ' | punctuation
text_no_newline ::= ( letter | digit | ' ' | safe_punctuation )+
text_content ::= ( letter | digit | ' ' | newline | punctuation )*
code_content ::= code_char*
code_char ::= letter | digit | ' ' | newline | punctuation
code_line ::= ( letter | digit | ' ' | punctuation )*
list_content ::= text_element* ( newline ' ' text_element* )?
table_cell ::= ' ' table_char* ' '
table_char ::= letter | digit | ' ' | safe_punctuation
header_text ::= ( letter | digit | ' ' | punctuation )+
link_text ::= link_char+
link_char ::= letter | digit | ' ' | safe_punctuation
alt_text ::= alt_char+
alt_char ::= letter | digit | ' ' | safe_punctuation
image_path ::= ( letter | digit | '.' | '/' | '-' | '_' )+
image_title ::= image_title_char+
image_title_char ::= letter | digit | ' ' | safe_punctuation
anchor_name ::= letter ( letter | digit | '-' )*
haskell_id ::= letter ( letter | digit | '_' | "'" )*
module_name ::= haskell_id ( '.' haskell_id )*
url ::= ( 'http://' | 'https://' | 'ftp://' ) url_char+
url_char ::= letter | digit | '/' | '.' | ':' | '-' | '_' | '?' | '&' | '='
math_expr ::= math_char+
math_char ::= letter | digit | ' ' | math_punctuation
property_desc ::= ( letter | digit | ' ' | punctuation )+
expression ::= ( letter | digit | ' ' | punctuation )+
result_line ::= result_char* newline
result_char ::= letter | digit | ' ' | safe_punctuation
term ::= term_char+
term_char ::= letter | digit | ' ' | safe_punctuation
definition_content ::= text_element+
escaped_char ::= '\' special_char
special_char ::= '/' | '*' | '@' | "'" | '"' | '#' | '<' | '>' | '[' | ']' | '(' | ')' | '|' | '=' | '-' | '+'
safe_punctuation ::= '!' | '$' | '%' | '^' | '&' | '(' | ')' | '_' | '+' | '{' | '}' | ';' | ':' | ',' | '.' | '`' | '~'
math_punctuation ::= '+' | '-' | '*' | '/' | '^' | '_' | '=' | '(' | ')' | '{' | '}' | '[' | ']'
punctuation ::= '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '(' | ')' | '-' | '_' | '+' | '=' | '{' | '}' | '[' | ']' | '|' | '\' | ':' | ';' | '"' | "'" | '<' | '>' | '?' | ',' | '.' | '/' | '`' | '~'
letter ::= 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'
digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
newline ::= #xA | #xD #xA | #xD