checkpoint
[sbp.git] / tests / regression.tc
index 60b4736..cdad831 100644 (file)
 //}
 
 testcase {
+    input "aaaaa";
+    s = A
+    A = "a" s &~ "a" A
+      | "a" A &~ "a" S
+}
+
+testcase {
+    input  "a";
+    output "yes:{}";
+    s = A
+    A = "a" s &~ "a" A
+      | "a" A &~ "a" S
+      | ()
+}
+
+testcase {
     input "ab c";
     output "1:{{a b} {c}}";
 
@@ -265,72 +281,72 @@ testcase {
   q    = q:: [a-z]++
 }
 
-//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}}}} 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           = ws statement ws statement ws => smt
-//
-//block       = "\n" indent  blockBody
-//           &~ "\n" outdent ~[\ ] ~[]*
-//
-//blockBody   = statement
-//            > statement ws blockBody => "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"
-//
-//
-//
-//}
-//
+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}}}} 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 {
     input "abc                         ";
 
-    s     = q " "* => s
-    q     = [a-z] [a-z] [a-z] => a3
+    s     = s2:: q " "*
+    q     = a3:: [a-z] [a-z] [a-z]
          &~ ~[] "b" ~[]*
 }
 
@@ -338,17 +354,37 @@ testcase {
     input "abc                         ";
     output "s:{a b c}";
 
-    s     = [a-z] [a-z] [a-z] " "* => s
+    s     = s:: [a-z] [a-z] [a-z] " "*
 }
 
 testcase {
 
     input "a+2";
-    output "";
+    output "Plus:{left:{Foo} right:{{2}}}";
 
     s       = Expr
     Expr    = [0-9]++
-            | Plus:: left:Expra "+" right:Expr
+            | Plus:: (left::Expra) "+" (right::Expr)
     Expra   = Foo:: ("a" | "b")
 
 }
+
+testcase {
+    input "aaaaa";
+    output "top:{a q:{{a a a}} a}";
+    s = top:: z (q::"a"*) z
+    z = a:: "a"
+}
+
+testcase {
+    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     = [ ]**
+}
+