Line # Revision Author
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 }