//}
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}}";
s = ids
- ids = "1":: id (" " ids &~ id ~[]*)
- | "2":: id ( ids &~ id ~[]*)
+ ids = "1":: id (" " ids &~ id !((~[])*))
+ | "2":: id ( ids &~ id !((~[])*))
| id
id = [a-z]++
}
}
testcase {
- input "12111211";
- output "ac:{{2 1 2 1}}";
- //output "a:{{2 1 2 1}}";
- //output "c:{{c:{1 1} c:{1 1}}}";
-
- s = ab:: ab
- | ac:: ac
- | bc:: bc
- //| a => "a"
- //| b => "b"
- //| c => "c"
- 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 {
input "qxbambambam";
- output "bam:{a bam:{a bam:{a x:{x}}}}";
+ output "bam:{a bam:{a bam:{a x}}}";
s = "q" z
z = a z ^"bam"
- z = ^"x"
+ | ^"x"
a = a:: ()
}
s = ^"q" x "q"
x = ^"a" a
- x = epsilon:: ()
+ | epsilon:: ()
a = s1:: x
}
output "s:{aa:{aa:{a b} b}}";
s = s:: "b" a
a = aa:: "a" a b
- a = a:: ()
+ | a:: ()
b = b:: ()
}
input "aaab";
output "sx:{b aa:{aa:{b b} b}}";
s = sx:: b d "a" "b"
- s = sy:: "a" d "a" d
+ | sy:: "a" d "a" d
d = aa:: "a" a b
a = aa:: "a" b b
- a = a:: ()
+ | a:: ()
b = b:: ()
}
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 {
s = s2:: q " "*
q = a3:: [a-z] [a-z] [a-z]
- &~ ~[] "b" ~[]*
+ &~ !(~[]) "b" !((~[])*)
}
testcase {
s = Expr
Expr = [0-9]++
- | Plus:: left:Expra "+" right:Expr
+ | Plus:: (left::Expra) "+" (right::Expr)
Expra = Foo:: ("a" | "b")
}
testcase {
input "aaaaa";
- s = top:: z q:"a"* z
+ output "top:{a q:{{a a a}} a}";
+
+ s = top:: z (q::"a"*) z
z = a:: "a"
-}
\ No newline at end of file
+}
+
+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 = [ ]**
+}
+
+
+testcase {
+ input "12111211";
+ output "ac:{{2 1 2 1}}";
+ //output "a:{{2 1 2 1}}";
+ //output "c:{{c:{1 1} c:{1 1}}}";
+
+ s = ab:: ab
+ | ac:: ac
+ | bc:: bc
+ //| a => "a"
+ //| b => "b"
+ //| c => "c"
+ 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 {
+// input "ab";
+//
+// s = a:"a" b:"b"
+//}
+