# $Id: grammar.pg 29028 2008-07-03 18:25:25Z tene $ =begin overview This is the grammar for lolcode written as a sequence of Perl 6 rules. =end overview grammar lolcode::Grammar is PCT::Grammar; rule TOP { ['HAI' ]? ['KTHXBYE' ]? [ $ || ] {*} } token version { \d+ [ '.' \d+ ]? } rule statement { | {*} #= declare | {*} #= assign | {*} #= function | {*} #= ifthen | {*} #= expression } token statement_terminator { [ ',' | \n+ | $ ] } rule declare { 'I' 'HAS' 'A' ? [ 'ITZ' ]? {*} } token scope { | 'FARAWAY' | 'NEARBY' } rule assign { 'R' {*} } rule function { # $ is only getting the first parameter, not all of them # like I'd expect... 'HOW' 'DUZ' 'I' ['YR' $= [ 'AN' 'YR' $=]* ]? {*} #= params 'IF' 'U' 'SAY' 'SO' {*} #= block } rule ifthen { 'O' 'RLY?' 'YA' 'RLY' [ 'MEBBE' ]* [ 'NO' 'WAI' $= ]? 'OIC' {*} } rule switch { 'WTF?' [ 'OMG' ]+ [ 'OMGWTF' ]? 'OIC' } rule block { {*} #= open [ ]* {*} #= close } rule parameters { 'YR' [ 'AN' 'YR' ]* } rule expression { [ | $= | $= | $= | 'AN' | $='MKAY' ]+ {*} } token value { | {*} #= float | {*} #= integer | {*} #= boolean | {*} #= quote | {*} #= bang } token bang { '!' {*} } token operator { $=(<.identifier> <.ws> 'OF') {*} } token variable { {*} } token identifier { <[a..zA..Z]> \w* } # RT #46213 : Because PGE doesn't yet know how to do longest token matching, # order all tokens in reverse alpha order to avoid a parsing bug. token keyword { [ 'YR' | 'YA' | 'WTF?' | 'WIN' | 'WAI' | 'U' | 'SO' | 'SAY' | 'RLY?' | 'RLY' | 'R' | 'OMGWTF' | 'OMG' | 'OIC' | 'OF' | 'O' | 'NO' | 'MKAY' | 'MEBBE' | 'KTHXBYE' | 'ITZ' | 'IF' | 'I' | 'HOW' | 'HAS' | 'GTFO' | 'FOUND' | 'FARAWAY' | 'FAIL' | 'AN' | 'A' ] >> } token integer { '-'? \d+ {*} } token float { '-'? \d+ '.' \d+ {*} } rule boolean { [ 'WIN' | 'FAIL' ] {*} } rule quote { [ <.before '"'> ] {*} } token ws { [ | ^^ \h* BTW \h \N* \n+ | ^^ \h* OBTW .*? ^^ \h* TLDR \n+ | \h+ ]* }