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 {
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 = [ ]**
+}
+