| epsilon:: ()
}
-testcase "unnamed" {
+testcase "qaq" {
input "qaq";
- output "q:{a:{s1:{epsilon}}}";
+ output "q:{a:{s1}}";
s = ^"q" x "q"
x = ^"a" a
idl = [a-d]
}
-testcase "a+b*c" {
+testcase "priority" {
input "a+b*c";
output "plus:{stringify:{a} times:{stringify:{b} stringify:{c}}}";
w = " "
idl = [a-d]
}
+testcase "associativity" {
+ input "a*b*c";
+ output "times:{stringify:{a} times:{stringify:{b} stringify:{c}}}";
+ w = " "
+ l = id
+ s = assign:: l "=" r
+ | r
+ r = l
+ | assign:: l "=" r
+ | plus:: r "+" r
+ | times:: r "*" (r)
+ | "(" r ")"
+ | times:: r r
+ id = stringify:: idl++
+ idl = [a-d]
+}
+
testcase "unnamed" {
input "aa bb";
output "{q:{a a} q:{b b}}";
testcase "unnamed" {
input "aaaaa";
- output "top:{a q:{a a a} a}";
+ output "top:{a q a}";
s = top:: z (q::"a"*) z
z = a:: "a"
As = () | As "a"
AAs = () | AAs "aa"
}
+
+testcase "question mark" {
+ input "aa aba abba";
+ output "s:{Y Y Z}";
+ s = s:: X " " X " " X
+ X = Y > Z
+ Y = Y:: "a" B? "a"
+ Z = Z:: "a" "b"* "a"
+ B = "b"
+}
+
+testcase "operator: ... " {
+ input "aaabbbaaa abababababa";
+ output "s:{C:{a a a b b b a a a} B:{a b a b a b a b a b a}}";
+ s:: = A " " A
+ A = B > C
+ B:: = [ab]* &~ (... "bbb" ...)
+ C:: = [ab]*
+}
+
+testcase "operator: ~~" {
+ input "aaabbbaaa abababababa";
+ output "s:{C:{a a a b b b a a a} B:{a b a b a b a b a b a}}";
+ s:: = A " " A
+ A = B > C
+ B:: = ~~(... "bbb" ...)
+ C:: = [ab]*
+}
+
+testcase "lifts" {
+ input "a+(b*c)";
+ output "+:{a *:{id:{b} c}}";
+
+ s = r
+ r = id
+ | r ^"*" `r
+ | `r ^"+" r
+ | "(" r ")"
+ id:: = [a-z]++
+}
+
+testcase "epsilon as a positive conjunct" {
+ input "abababab";
+ s:: = X*
+ X:: = "a" ("b"+ & ())
+}
+
+testcase "ensure sharing of so-called reduction nodes" {
+ input "a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a ";
+ ignore output;
+ s:: = (S!)+
+ S:: = A:: "a "
+ | B:: "a "
+}
+
+testcase "epsilon as a negative conjunct" {
+ input "aaaaa";
+ s:: = X*
+ X:: = "a" ("b"* &~ ())
+}
+