-//testcase {
-//
-// input "
-//
-//
-// while x>0
-// while y>0
-// foo()
-// bar()
-//
-// while x>0
-// while y>0
-// foo()
-// bar()
-//
-//
-//";
-// output "smt:{while:{>:{{x} {0}} while:{>:{{y} {0}} sbb:{{f o o} {b a r}}}}}";
-// output "smt:{while:{>:{{x} {0}} sbb:{while:{>:{{y} {0}} {f o o}} {b a r}}}}";
-//
-//indent !::= ww
-//outdent !::= " " outdent " "
-// | " " (~[]*) "\n"
-//
-//any !::= ~[]*
-//s ::= any "\n\n" ww statement ww "\n\n" any => smt
-//ww !::= sp*
-//ws !::= sp**
-//sp ::= " "
-//
-//block ::= "\n" indent blockBody
-// &~ "\n" outdent ~[\ ] ~[]*
-//
-//blockBody ::= statement
-// > statement blockBody /ws => "sbb"
-//
-//statement ::= call
-// | ^"while" expr block /ws
-//
-//expr ::= ident
-// | call
-// | expr ^">" expr /ws
-// | num
-//
-//call ::= expr "()" /ws
-//
-//num ::= [0-9]++
-//
-//ident ::= [a-z]++ &~ keyword
-//keyword ::= "if" | "then" | "else" | "while"
-//
-//w ::= " " | "\n" | "\r"
-//ws ::= w*
-//
-//
-//}
+testcase "indentation" {
+
+ input "
+
+
+
+ while x>0
+ while y>0
+ foo()
+ bar()
+
+
+ while x>0
+ while y>0
+ foo()
+ bar()
+
+
+
+";
+ 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}}}}";
+
+indent = ww
+outdent = " " outdent " "
+ | " " ("":: (~[])*) "\n"
+
+w = " " | "\n" | "\r"
+ws = "":: w*
+ww = "":: sp*
+sp = " "
+any = "":: (~[])*
+
+s = smt:: ws! statement ws! statement ws!
+
+block = "\n" indent! blockBody
+ &~ "\n" (" " outdent! " ") ~[\ ]! ("":: ~[]*)!
+
+blockBody = statement
+ > sbb:: statement ws blockBody
+
+statement = call
+ | ^"while" expr block /ws
+
+expr = ident
+ | call
+ | expr ^">" expr /ws
+ | num
+
+call = expr "()" /ws
+
+num = "":: [0-9]++
+
+ident = "":: [a-z]++ &~ keyword
+keyword = "if" | "then" | "else" | "while"
+
+
+
+}
+
+
+testcase "unnamed" {
+ input "abc ";
+
+ s = s2:: q " "*
+ q = a3:: [a-z] [a-z] [a-z]
+ &~ ("":: ~[])! "b" ("":: ~[]*)!
+}
+
+testcase "unnamed" {
+ input "abc ";
+ output "s:{a b c}";
+
+ s = s:: [a-z] [a-z] [a-z] " "*
+}
+
+testcase "a+2" {
+
+ input "a+2";
+ output "Plus:{left:{Foo} right:{{2}}}";
+
+ s = Expr
+ Expr = "":: [0-9]++
+ | Plus:: (left::Expra) "+" (right::Expr)
+ Expra = Foo:: ("a" | "b")
+
+}
+
+testcase "unnamed" {
+ input "aaaaa";
+ output "top:{a q:{a a a} a}";
+
+ s = top:: z (q::"a"*) z
+ z = a:: "a"
+}
+
+testcase "dangling else" {
+ input "if (x) if (y) z else q";
+ output "if:{ident:{x} else:{if:{ident:{y} then:{ident:{z}}} ident:{q}}}";
+
+ s = Expr
+ Expr = if:: "if" "(" Expr ")" IfBody /ws
+ | ident:: [a-z]++
+ IfBody = else:: Expr "else" Expr /ws
+ | then:: Expr &~ (("":: (~[])*) "else" Expr! /ws)
+ ws = "":: [ ]**
+}
+
+
+testcase "unnamed" {
+ input "12111211";
+ output "ac:{{2 1 2 1}}";
+
+ s = ab:: ab
+ | ac:: ac
+ | bc:: bc
+ ab = a & b
+ ac = a & c
+ bc = b & c
+ a = "":: ("1" x)*
+ b = "":: ("b":: x "2")*
+ c = "":: ("c":: x "2" x "1")*
+ x = [123]
+}
+
+testcase "follow restrictions on empty string" {
+ input "xxx";
+ s = x:: "x" A "x" C "x"
+ A = B
+ B = "y"
+ | () -> ~"x"
+ C = D -> ~"x"
+ D = ()
+}
+
+testcase "unnamed" {
+ input "axxxxxc";
+ output "q:{a {x x x x x} c}";
+ s = q:: A ws (B|()) ws C
+ ws = "":: [x]**
+ A = a:: "a"
+ B = b:: "b"
+ C = c:: "c"
+}
+
+testcase "unnamed" {
+ input "aaaaaaaaaaaaaaaaaaaa";
+ output "";
+ s = As & AAs
+ As = () | As "a"
+ AAs = () | AAs "aa"
+}