| 1 |
24466 |
coke |
# $Id$ |
| 2 |
|
|
|
| 3 |
|
|
=begin overview |
| 4 |
|
|
|
| 5 |
|
|
This is the grammar for lolcode written as a sequence of Perl 6 rules. |
| 6 |
|
|
|
| 7 |
|
|
=end overview |
| 8 |
|
|
|
| 9 |
|
|
grammar lolcode::Grammar is PCT::Grammar; |
| 10 |
|
|
|
| 11 |
|
|
rule TOP { |
| 12 |
28887 |
tene |
['HAI' <version> <statement_terminator>]? |
| 13 |
24559 |
kjs |
<block> |
| 14 |
28887 |
tene |
['KTHXBYE' <statement_terminator>]? |
| 15 |
27387 |
pmichaud |
[ $ || <panic: 'Syntax error'> ] |
| 16 |
24466 |
coke |
{*} |
| 17 |
|
|
} |
| 18 |
|
|
|
| 19 |
24726 |
coke |
token version { \d+ [ '.' \d+ ]? } |
| 20 |
|
|
|
| 21 |
24466 |
coke |
rule statement { |
| 22 |
24511 |
simon |
| <declare> {*} #= declare |
| 23 |
|
|
| <assign> {*} #= assign |
| 24 |
|
|
| <function> {*} #= function |
| 25 |
24660 |
coke |
| <ifthen> {*} #= ifthen |
| 26 |
25988 |
tene |
| <expression> {*} #= expression |
| 27 |
24470 |
simon |
} |
| 28 |
|
|
|
| 29 |
24486 |
simon |
token statement_terminator { [ ',' | \n+ | $ ] } |
| 30 |
24472 |
simon |
|
| 31 |
|
|
rule declare { |
| 32 |
28887 |
tene |
'I' 'HAS' 'A' <scope>? <variable> [ 'ITZ' <expression> ]? |
| 33 |
24472 |
simon |
{*} |
| 34 |
|
|
} |
| 35 |
|
|
|
| 36 |
28887 |
tene |
token scope { |
| 37 |
|
|
| 'FARAWAY' |
| 38 |
|
|
| 'NEARBY' |
| 39 |
|
|
} |
| 40 |
|
|
|
| 41 |
24472 |
simon |
rule assign { |
| 42 |
24500 |
simon |
<variable> 'R' <expression> {*} |
| 43 |
24472 |
simon |
} |
| 44 |
|
|
|
| 45 |
24485 |
simon |
rule function { |
| 46 |
26219 |
tene |
# $<parameters> is only getting the first parameter, not all of them |
| 47 |
|
|
# like I'd expect... |
| 48 |
|
|
'HOW' 'DUZ' 'I' <variable> ['YR' $<parameters>=<variable> [ 'AN' 'YR' $<parameters>=<variable>]* ]?<statement_terminator> |
| 49 |
29028 |
tene |
{*} #= params |
| 50 |
24485 |
simon |
<block> |
| 51 |
|
|
'IF' 'U' 'SAY' 'SO' |
| 52 |
29028 |
tene |
{*} #= block |
| 53 |
24485 |
simon |
} |
| 54 |
|
|
|
| 55 |
24533 |
kjs |
rule ifthen { |
| 56 |
|
|
<expression> <statement_terminator> |
| 57 |
|
|
'O' 'RLY?' <statement_terminator> |
| 58 |
|
|
'YA' 'RLY' <statement_terminator> |
| 59 |
|
|
<block> |
| 60 |
|
|
[ |
| 61 |
24535 |
kjs |
'MEBBE' <expression> <statement_terminator> |
| 62 |
|
|
<block> |
| 63 |
24533 |
kjs |
]* |
| 64 |
|
|
[ |
| 65 |
24535 |
kjs |
'NO' 'WAI' <statement_terminator> |
| 66 |
24660 |
coke |
$<else>=<block> |
| 67 |
24533 |
kjs |
]? |
| 68 |
|
|
'OIC' |
| 69 |
|
|
{*} |
| 70 |
|
|
} |
| 71 |
|
|
|
| 72 |
24535 |
kjs |
rule switch { |
| 73 |
|
|
<expression> <statement_terminator> |
| 74 |
|
|
'WTF?' <statement_terminator> |
| 75 |
|
|
[ |
| 76 |
|
|
'OMG' <value> <statement_terminator> |
| 77 |
|
|
<block> |
| 78 |
|
|
]+ |
| 79 |
|
|
[ |
| 80 |
|
|
'OMGWTF' <statement_terminator> |
| 81 |
|
|
<block> |
| 82 |
|
|
]? |
| 83 |
|
|
'OIC' |
| 84 |
|
|
} |
| 85 |
|
|
|
| 86 |
24485 |
simon |
rule block { |
| 87 |
28887 |
tene |
{*} #= open |
| 88 |
|
|
[<statement> <statement_terminator>]* |
| 89 |
|
|
{*} #= close |
| 90 |
24485 |
simon |
} |
| 91 |
|
|
|
| 92 |
|
|
rule parameters { |
| 93 |
24511 |
simon |
'YR' <identifier> [ 'AN' 'YR' <identifier> ]* |
| 94 |
24485 |
simon |
} |
| 95 |
|
|
|
| 96 |
24500 |
simon |
rule expression { |
| 97 |
25988 |
tene |
[ |
| 98 |
|
|
| $<tokens>=<operator> |
| 99 |
|
|
| $<tokens>=<variable> |
| 100 |
|
|
| $<tokens>=<value> |
| 101 |
|
|
| 'AN' |
| 102 |
|
|
| $<tokens>='MKAY' |
| 103 |
|
|
]+ {*} |
| 104 |
24500 |
simon |
} |
| 105 |
|
|
|
| 106 |
25988 |
tene |
token value { |
| 107 |
24726 |
coke |
| <float> {*} #= float |
| 108 |
24483 |
coke |
| <integer> {*} #= integer |
| 109 |
24660 |
coke |
| <boolean> {*} #= boolean |
| 110 |
24483 |
coke |
| <quote> {*} #= quote |
| 111 |
25988 |
tene |
| <bang> {*} #= bang |
| 112 |
24466 |
coke |
} |
| 113 |
|
|
|
| 114 |
25988 |
tene |
token bang { |
| 115 |
|
|
'!' {*} |
| 116 |
|
|
} |
| 117 |
24472 |
simon |
|
| 118 |
25988 |
tene |
token operator { $<identifier>=(<.identifier> <.ws> 'OF') {*} } |
| 119 |
|
|
token variable { <identifier> {*} } |
| 120 |
24511 |
simon |
|
| 121 |
25988 |
tene |
token identifier { <!keyword> <[a..zA..Z]> \w* } |
| 122 |
|
|
|
| 123 |
24728 |
coke |
# RT #46213 : Because PGE doesn't yet know how to do longest token matching, |
| 124 |
24660 |
coke |
# order all tokens in reverse alpha order to avoid a parsing bug. |
| 125 |
24485 |
simon |
token keyword { |
| 126 |
25988 |
tene |
[ 'YR' | 'YA' | 'WTF?' | 'WIN' | 'WAI' | 'U' | 'SO' |
| 127 |
|
|
| 'SAY' | 'RLY?' | 'RLY' | 'R' |
| 128 |
|
|
| 'OMGWTF' | 'OMG' | 'OIC' | 'OF' | 'O' | 'NO' | 'MKAY' | 'MEBBE' | 'KTHXBYE' |
| 129 |
28887 |
tene |
| 'ITZ' | 'IF' | 'I' | 'HOW' | 'HAS' | 'GTFO' | 'FOUND' | 'FARAWAY' | 'FAIL' |
| 130 |
25988 |
tene |
| 'AN' | 'A' ] >> |
| 131 |
24485 |
simon |
} |
| 132 |
|
|
|
| 133 |
24726 |
coke |
token integer { '-'? \d+ {*} } |
| 134 |
24466 |
coke |
|
| 135 |
24726 |
coke |
token float { '-'? \d+ '.' \d+ {*} } |
| 136 |
24473 |
simon |
|
| 137 |
24660 |
coke |
rule boolean { [ 'WIN' | 'FAIL' ] {*} } |
| 138 |
|
|
|
| 139 |
24466 |
coke |
rule quote { |
| 140 |
25125 |
coke |
[ <.before '"'> <yarn_literal> ] |
| 141 |
24466 |
coke |
{*} |
| 142 |
|
|
} |
| 143 |
|
|
|
| 144 |
|
|
token ws { <!ww> [ |
| 145 |
24487 |
simon |
| ^^ \h* BTW \h \N* \n+ |
| 146 |
|
|
| ^^ \h* OBTW .*? ^^ \h* TLDR \n+ |
| 147 |
24466 |
coke |
| \h+ |
| 148 |
|
|
]* |
| 149 |
|
|
} |