grammar Creole { # GLOBAL rule TOP { }; rule escape { '~' }; rule escaped { (.) }; rule wikitext { [ | | ]* }; rule paragraph { # @ = + }; rule paragraph_line { ^^ > # $ = [ \N* & ] $$ \n? }; # BLOCK LEVEL rule block_element { > [ | | | | | ] }; rule heading { ^^ \h* # $ = ('='+) \h* # $ = [ [.*?] & <inline> ] \h* '='+ \h* $$ \n? }; rule horizontal_rule { ^^ \h* ('----' '-'*) \h* $$ \n? }; rule preformatted { ^^ '{{{' $$ (.*?) ^^ '}}}' $$ }; ## lists rule list_item_prefix { [ '*' | '#' ]+ }; rule list_item { ^^ \h* # $<prefix> = <list_item_prefix> # $<text> = ([\N*] & <inline>) $$ \n? }; rule list { #@<items> = <list_item>+ }; ## tables rule table_cell { <!before escape> '|' \h* #$<is_heading> = '='? \h* #$<text> = [ [ <escaped> | <inline_element_with_bar> | <[\N]-[|]> ]* & <inline> ] }; rule table_row { ^^ \h* #@<cells> = <table_cell>+ \h* [ '|' \h* ]? $$ \n? }; rule table { #@<rows> = <table_row>+ }; # INLINE LEVEL rule inline { | <escaped> | <inline_element> | [ <!before <escaped>|<inline_element> > \N ]* }; rule inline_element { | <bold> | <italic> | <automatic_link> | <link> | <image> | <line_break> | <nowiki> }; rule bold { '**' <inline> '**' }; rule italic { '//' <inline> '//' }; rule line_break { \\ \\ }; rule nowiki { '{{{' (.*?) '}}}' }; rule automatic_link { :panic [ 'http://' | 'ftp://' ]: \S+ <!after <[,.?!:;"'>]> > # " }; rule inline_element_with_bar { | <link> | <image> }; rule link { '[[' #$<target> = [ <-[|]>* ] [ '|' #$<title> = <inline> ]? ']]' }; rule image { '{{' #$<location> = [ <-[|]>* ] [ '|' #$<caption> = <inline> ]? '}}' }; }; if "foo" ~~ Creole { say "aye"; };