update metagrammar
[sbp.git] / tests / regression.tc
index bd7d107..f13accf 100644 (file)
@@ -1,24 +1,3 @@
-//testcase {
-//    input  "x";
-//    output "a1:{x}";
-//
-//    s   = a1:: a
-//    a   = s1:: s
-//    a   = ^"x"
-//}
-//
-//testcase {
-//    input  "x";
-//    output "x";
-//    output "s2:{s2:{s0 s0} x}";
-//    output "s2:{s0 x}";
-//
-//
-//    s   = s2:: s s
-//    s   = ^"x"
-//    s   = s0:: ()
-//}
-
 testcase {
     input "aaaaa";
     s = A
@@ -26,22 +5,13 @@ testcase {
       | "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}}";
 
     s     = ids
-    ids   = "1":: id (" " ids &~ id !((~[])*))
-          | "2":: id (    ids &~ id !((~[])*))
+    ids   = "1":: id (" " ids &~ id ((~[])*)!)
+          | "2":: id (    ids &~ id ((~[])*)!)
           | id
     id    = [a-z]++
 }
@@ -91,7 +61,7 @@ testcase {
     x     = ~[]
     s     = xbx:: x* b x*
     b     = abab:: [ab][ab]
-         &~ ( "aa" | "bb" )
+         &~ ("aa"|"bb")
 }
 
 testcase {
@@ -217,23 +187,6 @@ testcase {
     idl    = [a-d]
 }
 
-//testcase {
-//    input "a*b*c";
-//    output "times:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
-//    w    = " "
-//    l    = id
-//    s    = l "=" r  => "assign"
-//         | r
-//    r    = l
-//         | l "=" r       => "assign"
-//         | r "+" r       => "plus"
-//         | (r) "*" r       => "times"
-//         | "(" r ")"
-//         | r r           => "times"
-//    id     = idl++       => "stringify"
-//    idl    = [a-d]
-//}
-
 testcase {
     input "a+b*c";
     output "plus:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
@@ -292,10 +245,10 @@ ww         = sp*
 sp         = " "
 any        = (~[])*
 
-s          = smt:: !ws statement !ws statement !ws
+s          = smt:: ws! statement ws! statement ws!
 
-block       =        !"\n" !indent  blockBody
-           &~        !"\n" (" " !outdent " ") !(~[\ ]) !((~[])*)
+block       =        "\n"! indent!  blockBody
+           &~        "\n"! (" " outdent! " ") (~[\ ])! ((~[])*)!
 
 blockBody   =       statement
             > sbb:: statement ws blockBody
@@ -319,14 +272,12 @@ keyword     = "if" | "then" | "else" | "while"
 
 }
 
-
-
 testcase {
     input "abc                         ";
 
     s     = s2:: q " "*
     q     = a3:: [a-z] [a-z] [a-z]
-         &~ !(~[]) "b" !((~[])*)
+         &~ (~[])! "b" ((~[])*)!
 }
 
 testcase {
@@ -364,7 +315,7 @@ testcase {
     Expr   = if::     "if" "(" Expr ")" IfBody     /ws
            | ident::  [a-z]++
     IfBody = else::   Expr            "else"  Expr /ws
-           | then::   Expr &~   ((~[])* "else" !Expr /ws)
+           | then::   Expr &~   ((~[])* "else" Expr! /ws)
     ws     = [ ]**
 }
 
@@ -390,10 +341,55 @@ testcase {
     x   = [123]
 }
 
+// make sure follow restrictions are honored
+// when a string matches the empty string
+testcase {
+  input "xxx";
+  s = x:: "x" A "x" C "x"
+  A = B
+  B = "y"
+    | () -> ~"x"
+  C = D -> ~"x"
+  D = ()
+}
+
+testcase {
+  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 {
+  input "aaaaaaaaaaaaaaaaaaaa";
+  output "";
+  s = As & AAs
+  As = () | As "a"
+  AAs = () | AAs "aa"
+}
 
-//testcase {
-//    input "ab";
-//    
-//    s = a:"a" b:"b"
-//}
+// pathological O(n^2) behavior
+testcase {
+  input "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+  output "x";
+          s = x:: ManyA!
+     ManyA =  ()
+            | x:: A ManyA
+          A = ()! ("a" & ManyAB)
+    ManyAB = ()
+            | "a" ManyAB
+            | "b" ManyAB
 
+}
+
+// another O(n^2) example, tickles different epsilon behaviors
+testcase {
+  input "aaaa";
+  output "x:{x:{x:{x}}}";
+  s = x:: s A! | ()
+  A = "a" & B
+  B = () | B "a"
+}