//testcase {
// input "x";
-// output "a1:{x}";
+// output "a:{x}";
//
-// s ::= a => a1
-// a ::= s => s1
-// a ::= ^"x"
+// s = a1:: a
+// a = s1:: s
+// a = ^"x"
//}
//
//testcase {
// output "s2:{s0 x}";
//
//
-// s ::= s s => s2
-// s ::= ^"x"
-// s ::= () => s0
+// s = s2:: s s
+// s = ^"x"
+// s = s0:: ()
+//}
+
+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 ::= id (" " ids &~ id ~[]*) => "1"
- | id ( ids &~ id ~[]*) => "2"
+ s = ids
+ ids = "1":: id (" " ids &~ id ((~[])*)!)
+ | "2":: id ( ids &~ id ((~[])*)!)
| id
- id ::= [a-z]++
+ id = [a-z]++
}
testcase {
output "2:{{a} 1:{{b} {c}}}";
output "1:{{a b} {c}}";
- s ::= ids
- ids ::= id " " ids => "1"
- | id ids => "2"
+ s = ids
+ ids = "1":: id " " ids
+ | "2":: id ids
| id
- id ::= [a-z]+
+ id = [a-z]+
}
testcase {
input "aaabbbccc";
output "ab";
- s ::= ab & dc
- ab ::= a b => ab
- dc ::= d c => dc
- a ::= "a" a | ()
- b ::= "b" b "c" | ()
- c ::= "c" c | ()
- d ::= "a" d "b" | ()
+ s = ab & dc
+ ab = ab:: a b
+ dc = dc:: d c
+ a = "a" a | ()
+ b = "b" b "c" | ()
+ c = "c" c | ()
+ d = "a" d "b" | ()
}
testcase {
input "aaabbbbccc";
- s ::= ab & dc
- ab !::= a b => ab
- dc !::= d c => dc
- a ::= "a" a | ()
- b ::= "b" b "c" | ()
- c ::= "c" c | ()
- d ::= "a" d "b" | ()
+ s = ab & dc
+ ab = ab:: a b
+ dc = dc:: d c
+ a = "a" a | ()
+ b = "b" b "c" | ()
+ c = "c" c | ()
+ d = "a" d "b" | ()
}
testcase {
input "aabb";
- output "xbx:{abab:{a b}}";
+ output "xbx:{{a} abab:{a b} {b}}";
- x !::= ~[]
- s ::= x* b x* => xbx
- b ::= [ab][ab] => abab
+ x = ~[]
+ s = xbx:: x* b x*
+ b = abab:: [ab][ab]
&~ ( "aa" | "bb" )
}
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 ::= (x "2" => "b")*
- c ::= (x "2" x "1" => "c")*
- 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"
- a ::= () => "a"
+ s = "q" z
+ z = a z ^"bam"
+ | ^"x"
+ a = a:: ()
}
testcase {
input "baaaa";
output "s2:{b0 a:{a:{epsilon}}}";
output "b:{a:{a:{epsilon}} epsilon}";
- s ::= b t => "s2"
+ s = s2:: b t
| ^"b" t b
- t ::= ^"a" t "a"
- | () => "epsilon"
- b ::= "b" => "b0"
- | () => "epsilon"
+ t = ^"a" t "a"
+ | epsilon:: ()
+ b = b0:: "b"
+ | epsilon:: ()
}
testcase {
input "qaq";
output "q:{a:{s1:{epsilon}}}";
- s ::= ^"q" x "q"
- x ::= ^"a" a
- x ::= () => "epsilon"
- a ::= x => "s1"
+ s = ^"q" x "q"
+ x = ^"a" a
+ | epsilon:: ()
+ a = s1:: x
}
testcase {
input "baa";
output "s1:{a2:{a2:{a0 b0} b0}}";
- s ::= "b" a => "s1"
- a ::= "a" a b => "a2"
- | () => "a0"
- b ::= () => "b0"
+ s = s1:: "b" a
+ a = a2:: "a" a b
+ | a0:: ()
+ b = b0:: ()
}
testcase {
output "s3:{epsilon a0 epsilon a0}";
output "s3:{epsilon a0 a0 epsilon}";
- s ::= "a" s a a a => "s3"
- | () => "epsilon"
- a ::= "a" => "a0"
- | () => "epsilon"
+ s = s3:: "a" s a a a
+ | epsilon:: ()
+ a = a0:: "a"
+ | epsilon:: ()
}
testcase {
input "aa";
output "poo:{poo:{poox poox} poox}";
output "poo:{poox poo:{poox poox}}";
- s ::= s s "a" => "poo"
- | () => "poox"
+ s = poo:: s s "a"
+ | poox:: ()
}
testcase {
input "baa";
output "s:{aa:{aa:{a b} b}}";
- s ::= "b" a => "s"
- a ::= "a" a b => "aa"
- a ::= () => "a"
- b ::= () => "b"
+ s = s:: "b" a
+ a = aa:: "a" a b
+ | a:: ()
+ b = b:: ()
}
testcase {
input "aaab";
output "sx:{b aa:{aa:{b b} b}}";
- s ::= b d "a" "b" => "sx"
- s ::= "a" d "a" d => "sy"
- d ::= "a" a b => "aa"
- a ::= "a" b b => "aa"
- a ::= () => "a"
- b ::= () => "b"
+ s = sx:: b d "a" "b"
+ | sy:: "a" d "a" d
+ d = aa:: "a" a b
+ a = aa:: "a" b b
+ | a:: ()
+ b = b:: ()
}
testcase {
input "a+(b*c)";
output "+:{{a} *:{{b} {c}}}";
- s ::= r
- r ::= id
+ s = r
+ r = id
| r ^"*" r
| r ^"+" r
| "(" r ")"
- id ::= [a-z]++
+ id = [a-z]++
}
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}}}}";
- w ::= " "
- l ::= id
- s ::= l "=" q => "assign"
+ w = " "
+ l = id
+ s = assign:: l "=" q
| q
- q ::= id
- | l "=" q => "assign"
- | q "-" q => "minus"
- | q "+" q => "plus"
- | q "*" q => "times"
+ q = id
+ | assign:: l "=" q
+ | minus:: q "-" q
+ | plus:: q "+" q
+ | times:: q "*" q
| "(" q ")"
- id ::= idl++ => "stringify"
- idl ::= [a-d]
+ id = stringify:: idl++
+ 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 "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}}}}";
- w ::= " "
- l ::= id
- s ::= l "=" r => "assign"
+ w = " "
+ l = id
+ s = assign:: l "=" r
| r
- r ::= l
- | l "=" r => "assign"
- | r "+" r => "plus"
- > r "*" r => "times"
+ r = l
+ | assign:: l "=" r
+ | plus:: r "+" r
+ > times:: r "*" r
| "(" r ")"
- | r r => "times"
- id ::= idl++ => "stringify"
- idl ::= [a-d]
+ | times:: r r
+ id = stringify:: idl++
+ idl = [a-d]
}
testcase {
input "aa bb";
output "{q:{{a a}} q:{{b b}}}";
- s ::= q */ ws
- ws ::= " "*
- q ::= [a-z]++ => "q"
+ s = q */ ws
+ ws = " "*
+ 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 = 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 {
-//
-// 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 "abc ";
- output "";
- s ::= q " "* => s
- q ::= [a-z] [a-z] [a-z] => a3
-// &~ "a" ~[]*
- &~ ~[] "b" ~[]*
+ s = s2:: q " "*
+ q = a3:: [a-z] [a-z] [a-z]
+ &~ (~[])! "b" ((~[])*)!
}
testcase {
input "abc ";
- output "";
+ output "s:{a b c}";
- s ::= [b-z] [a-z] [a-z] " "* => s
+ s = s:: [a-z] [a-z] [a-z] " "*
+}
+
+testcase {
+
+ input "a+2";
+ output "Plus:{left:{Foo} right:{{2}}}";
+
+ s = Expr
+ Expr = [0-9]++
+ | 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 = [ ]**
+}
+
+
+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"
+//}
+
+
+testcase {
+ input "a c";
+ s = first:: A WSA B? WSB C
+ A = "a"
+ B = "b"
+ C = "c"
+ WSA = WSA:: " "**
+ WSB = () -> ~" "
+ | WSB:: " "++
}