13 // output "s2:{s2:{s0 s0} x}";
14 // output "s2:{s0 x}";
32 s ::= { Hello } => "yep"
35 Hello ::= "hello" ws { "there" "how" { "are" } }
41 output "1:{{a b} {c}}";
44 ids ::= id (" " ids &~ id [~]*) => "1"
45 | id ( ids &~ id [~]*) => "2"
53 output "2:{{a} 1:{{b} {c}}}";
54 output "1:{{a b} {c}}";
57 ids ::= id " " ids => "1"
90 output "ac:{{2 1 2 1}}";
91 //output "a:{{2 1 2 1}}";
92 //output "c:{{c:{1 1} c:{1 1}}}";
104 b ::= (x "2" => "b")*
105 c ::= (x "2" x "1" => "c")*
111 output "bam:{a bam:{a bam:{a x:{x}}}}";
120 output "s2:{b0 a:{a:{epsilon}}}";
121 output "b:{a:{a:{epsilon}} epsilon}";
132 output "q:{a:{s1:{epsilon}}}";
136 x ::= () => "epsilon"
142 output "s1:{a2:{a2:{a0 b0} b0}}";
145 a ::= "a" a b => "a2"
153 output "s3:{s3:{epsilon a0 epsilon epsilon} epsilon epsilon epsilon}";
154 output "s3:{s3:{epsilon epsilon epsilon epsilon} a0 epsilon epsilon}";
155 output "s3:{s3:{epsilon epsilon a0 epsilon} epsilon epsilon epsilon}";
156 output "s3:{s3:{epsilon epsilon epsilon a0} epsilon epsilon epsilon}";
157 output "s3:{epsilon epsilon a0 a0}";
158 output "s3:{s3:{s3:{epsilon epsilon epsilon epsilon} epsilon epsilon epsilon} epsilon epsilon epsilon}";
159 output "s3:{s3:{epsilon epsilon epsilon epsilon} epsilon epsilon a0}";
160 output "s3:{s3:{epsilon epsilon epsilon epsilon} epsilon a0 epsilon}";
161 output "s3:{epsilon a0 epsilon a0}";
162 output "s3:{epsilon a0 a0 epsilon}";
164 s ::= "a" s a a a => "s3"
172 output "poo:{poo:{poox poox} poox}";
173 output "poo:{poox poo:{poox poox}}";
174 s ::= s s "a" => "poo"
180 output "s:{aa:{aa:{a b} b}}";
182 a ::= "a" a b => "aa"
189 output "sx:{b aa:{aa:{b b} b}}";
190 s ::= b d "a" "b" => "sx"
191 s ::= "a" d "a" d => "sy"
192 d ::= "a" a b => "aa"
193 a ::= "a" b b => "aa"
200 output "+:{{a} *:{{b} {c}}}";
212 output "plus:{stringify:{{a}} minus:{stringify:{{b}} times:{stringify:{{d}} stringify:{{c}}}}}";
213 output "times:{plus:{stringify:{{a}} minus:{stringify:{{b}} stringify:{{d}}}} stringify:{{c}}}";
214 output "plus:{stringify:{{a}} times:{minus:{stringify:{{b}} stringify:{{d}}} stringify:{{c}}}}";
215 output "times:{minus:{plus:{stringify:{{a}} stringify:{{b}}} stringify:{{d}}} stringify:{{c}}}";
216 output "minus:{plus:{stringify:{{a}} stringify:{{b}}} times:{stringify:{{d}} stringify:{{c}}}}";
219 s ::= l "=" q => "assign"
222 | l "=" q => "assign"
227 id ::= idl++ => "stringify"
233 output "times:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
236 s ::= l "=" r => "assign"
239 | l "=" r => "assign"
241 | (r) "*" r => "times"
244 id ::= idl++ => "stringify"
250 output "plus:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
253 s ::= l "=" r => "assign"
256 | l "=" r => "assign"
261 id ::= idl++ => "stringify"
282 output "smt:{while:{>:{{x} {0}} while:{>:{{y} {0}} sbb:{{f o o} {b a r}}}}}";
283 output "smt:{while:{>:{{x} {0}} sbb:{while:{>:{{y} {0}} {f o o}} {b a r}}}}";
286 outdent !::= " " outdent " "
290 s ::= any "\n\n" ww statement ww "\n\n" any => smt
295 block ::= "\n" indent blockBody
296 &~ "\n" outdent [~\ ] [~]*
298 blockBody ::= statement
299 > statement blockBody /ws => "sbb"
302 | ^"while" expr block /ws
309 call ::= expr "()" /ws
313 ident ::= [a-z]++ &~ keyword
314 keyword ::= "if" | "then" | "else" | "while"
316 w ::= " " | "\n" | "\r"
324 output "{q:{{a a}} q:{{b b}}}";
328 q ::= [a-z]+ !=> [a-z] => "q"