checkpoint harmony
[sbp.git] / tests / regression.tc
index 040bf84..ae452e9 100644 (file)
@@ -24,8 +24,8 @@ testcase {
     output "1:{{a b} {c}}";
 
     s   ::= ids
-    ids ::= id (" " ids &~ id [~]*) => "1"
-          | id (    ids &~ id [~]*) => "2"
+    ids ::= id (" " ids &~ id ~[]*) => "1"
+          | id (    ids &~ id ~[]*) => "2"
           | id
     id  ::= [a-z]++
 }
@@ -45,11 +45,11 @@ testcase {
 
 testcase {
     input "aaabbbccc";
-    output "";
+    output "ab";
 
     s   ::= ab & dc
-    ab  ::= a b
-    dc  ::= d c
+    ab  ::= a b       => ab
+    dc  ::= d c       => dc
     a   ::= "a" a     | ()
     b   ::= "b" b "c" | ()
     c   ::= "c" c     | ()
@@ -60,8 +60,8 @@ testcase {
     input "aaabbbbccc";
 
     s   ::= ab & dc
-    ab !::= a b
-    dc !::= d c
+    ab !::= a b       => ab
+    dc !::= d c       => dc
     a   ::= "a" a     | ()
     b   ::= "b" b "c" | ()
     c   ::= "c" c     | ()
@@ -69,6 +69,16 @@ testcase {
 }
 
 testcase {
+    input "aabb";
+    output "xbx:{abab:{a b}}";
+
+    x  !::= ~[]
+    s   ::= x* b x* => xbx
+    b   ::= [ab][ab] => abab
+         &~ ( "aa" | "bb" )
+}
+
+testcase {
     input "12111211";
     output "ac:{{2 1 2 1}}";
     //output "a:{{2 1 2 1}}";
@@ -90,11 +100,12 @@ testcase {
 }
 
 testcase {
-    input  "xbambambam";
-    output "bam:{a bam:{a bam:{a x}}}";
+    input  "qxbambambam";
+    output "bam:{a bam:{a bam:{a x:{x}}}}";
 
-    s ::= a s ^"bam"
-    s ::= ^"x"
+    s ::= "q" z
+    z ::= a z ^"bam"
+    z ::= ^"x"
     a ::= ()       => "a"
 }
 
@@ -155,7 +166,7 @@ testcase {
     output "poo:{poo:{poox poox} poox}";
     output "poo:{poox poo:{poox poox}}";
     s ::= s s "a"  => "poo"
-    s ::= ()       => "poox"
+        | ()       => "poox"
 }
 
 testcase {
@@ -182,11 +193,11 @@ testcase {
     input "a+(b*c)";
     output "+:{{a} *:{{b} {c}}}";
 
-    s   ::= R
-    R   ::= id
-          | R ^"*" R
-          | R ^"+" R
-          | "(" R ")"
+    s   ::= r
+    r   ::= id
+          | r ^"*" r
+          | r ^"+" r
+          | "(" r ")"
     id  ::= [a-z]++
 }
 
@@ -197,17 +208,16 @@ testcase {
     output "plus:{stringify:{{a}} times:{minus:{stringify:{{b}} stringify:{{d}}} stringify:{{c}}}}";
     output "times:{minus:{plus:{stringify:{{a}} stringify:{{b}}} stringify:{{d}}} stringify:{{c}}}";
     output "minus:{plus:{stringify:{{a}} stringify:{{b}}} times:{stringify:{{d}} stringify:{{c}}}}";
-    s  ::= S
     w  ::= " "
-    L  ::= id
-    S  ::= L "=" Q  => "assign"
-         | Q
-    Q  ::= id
-         | L "=" Q       => "assign"
-         | Q "-" Q       => "minus"
-         | Q "+" Q       => "plus"
-         | Q "*" Q       => "times"
-         | "(" Q ")"
+    l  ::= id
+    s  ::= l "=" q  => "assign"
+         | q
+    q  ::= id
+         | l "=" q       => "assign"
+         | q "-" q       => "minus"
+         | q "+" q       => "plus"
+         | q "*" q       => "times"
+         | "(" q ")"
     id   ::= idl++       => "stringify"
     idl  ::= [a-d]
 }
@@ -215,17 +225,16 @@ testcase {
 testcase {
     input "a*b*c";
     output "times:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
-    s  ::= S
     w  ::= " "
-    L  ::= id
-    S  ::= L "=" R  => "assign"
-         | R
-    R  ::= L
-         | L "=" R       => "assign"
-         | R "+" R       => "plus"
-         | (R) "*" R       => "times"
-         | "(" R ")"
-         | R R           => "times"
+    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]
 }
@@ -233,73 +242,85 @@ testcase {
 testcase {
     input "a+b*c";
     output "plus:{stringify:{{a}} times:{stringify:{{b}} stringify:{{c}}}}";
-    s  ::= S
     w  ::= " "
-    L  ::= id
-    S  ::= L "=" R  => "assign"
-         | R
-    R  ::= L
-         | L "=" R       => "assign"
-         | R "+" R       => "plus"
-         > R "*" R       => "times"
-         | "(" R ")"
-         | R R           => "times"
+    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 "aa bb";
+  output "{q:{{a a}} q:{{b b}}}";
 
-    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*
-sp        ::= " "
-
-block     ::= "\n" !indent  BlockBody
-           &~ "\n" outdent [~\ ] [~]*
-
-BlockBody ::= Statement
-            > Statement BlockBody => "sbb"
-
-Statement ::= Call
-            | ^"while" Expr block
-
-Expr      ::= ident
-            | Call
-            | Expr ^">" Expr
-            | num
-
-Call      ::= Expr "()"
-
-num       ::= [0-9]++
-
-ident     ::= [a-z]++ &~ keyword
-keyword   ::= "if" | "then" | "else" | "while"
-
-w         ::= " " | "\n" | "\r"
-ws        ::= w*
-
-
+  s  ::= q */ ws
+  ws ::= " "*
+  q  ::= [a-z]++ => "q"
 }
+
+//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"
+//
+//
+//
+//}
+//
\ No newline at end of file