10 output "1:{{a b} {c}}";
13 ids = "1":: id (" " ids &~ id ((~[])*)!)
14 | "2":: id ( ids &~ id ((~[])*)!)
22 output "2:{{a} 1:{{b} {c}}}";
23 output "1:{{a b} {c}}";
26 ids = "1":: id " " ids
59 output "xbx:{{a} abab:{a b} {b}}";
69 output "bam:{a bam:{a bam:{a x}}}";
79 output "s2:{b0 a:{a:{epsilon}}}";
80 output "b:{a:{a:{epsilon}} epsilon}";
91 output "q:{a:{s1:{epsilon}}}";
101 output "s1:{a2:{a2:{a0 b0} b0}}";
112 output "s3:{s3:{epsilon a0 epsilon epsilon} epsilon epsilon epsilon}";
113 output "s3:{s3:{epsilon epsilon epsilon epsilon} a0 epsilon epsilon}";
114 output "s3:{s3:{epsilon epsilon a0 epsilon} epsilon epsilon epsilon}";
115 output "s3:{s3:{epsilon epsilon epsilon a0} epsilon epsilon epsilon}";
116 output "s3:{epsilon epsilon a0 a0}";
117 output "s3:{s3:{s3:{epsilon epsilon epsilon epsilon} epsilon epsilon epsilon} epsilon epsilon epsilon}";
118 output "s3:{s3:{epsilon epsilon epsilon epsilon} epsilon epsilon a0}";
119 output "s3:{s3:{epsilon epsilon epsilon epsilon} epsilon a0 epsilon}";
120 output "s3:{epsilon a0 epsilon a0}";
121 output "s3:{epsilon a0 a0 epsilon}";
131 output "poo:{poo:{poox poox} poox}";
132 output "poo:{poox poo:{poox poox}}";
139 output "s:{aa:{aa:{a b} b}}";
148 output "sx:{b aa:{aa:{b b} b}}";
159 output "+:{{a} *:{{b} {c}}}";
171 output "plus:{stringify:{{a}} minus:{stringify:{{b}} times:{stringify:{{d}} stringify:{{c}}}}}";
172 output "times:{plus:{stringify:{{a}} minus:{stringify:{{b}} stringify:{{d}}}} stringify:{{c}}}";
173 output "plus:{stringify:{{a}} times:{minus:{stringify:{{b}} stringify:{{d}}} stringify:{{c}}}}";
174 output "times:{minus:{plus:{stringify:{{a}} stringify:{{b}}} stringify:{{d}}} stringify:{{c}}}";
175 output "minus:{plus:{stringify:{{a}} stringify:{{b}}} times:{stringify:{{d}} stringify:{{c}}}}";
186 id = stringify:: idl++
192 output "plus:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
203 id = stringify:: idl++
209 output "{q:{{a a}} q:{{b b}}}";
236 output "smt:{while:{>:{{x} {0}} while:{>:{{y} {0}} sbb:{{f o o} {b a r}}}} while:{>:{{x} {0}} sbb:{while:{>:{{y} {0}} {f o o}} {b a r}}}}";
239 outdent = " " outdent " "
242 w = " " | "\n" | "\r"
248 s = smt:: ws! statement ws! statement ws!
250 block = "\n"! indent! blockBody
251 &~ "\n"! (" " outdent! " ") (~[\ ])! ((~[])*)!
253 blockBody = statement
254 > sbb:: statement ws blockBody
257 | ^"while" expr block /ws
268 ident = [a-z]++ &~ keyword
269 keyword = "if" | "then" | "else" | "while"
279 q = a3:: [a-z] [a-z] [a-z]
280 &~ (~[])! "b" ((~[])*)!
287 s = s:: [a-z] [a-z] [a-z] " "*
293 output "Plus:{left:{Foo} right:{{2}}}";
297 | Plus:: (left::Expra) "+" (right::Expr)
298 Expra = Foo:: ("a" | "b")
304 output "top:{a q:{{a a a}} a}";
306 s = top:: z (q::"a"*) z
311 input "if (x) if (y) z else q";
312 output "if:{ident:{{x}} else:{if:{ident:{{y}} then:{ident:{{z}}}} ident:{{q}}}}";
315 Expr = if:: "if" "(" Expr ")" IfBody /ws
317 IfBody = else:: Expr "else" Expr /ws
318 | then:: Expr &~ ((~[])* "else" Expr! /ws)
325 output "ac:{{2 1 2 1}}";
326 //output "a:{{2 1 2 1}}";
327 //output "c:{{c:{1 1} c:{1 1}}}";
340 c = ("c":: x "2" x "1")*
352 // make sure follow restrictions are honored
353 // when a string matches the empty string
356 s = x:: "x" A "x" C "x"
366 output "q:{a {x x x x x} c}";