// input "x";
// output "a1:{x}";
//
-// s ::= a => a1
-// a ::= s => s1
-// a ::= ^"x"
+// s = a => a1
+// a = s => s1
+// a = ^"x"
//}
//
//testcase {
// output "s2:{s0 x}";
//
//
-// s ::= s s => s2
-// s ::= ^"x"
-// s ::= () => s0
+// s = s s => s2
+// s = ^"x"
+// s = () => s0
//}
testcase {
input "ab c";
output "1:{{a b} {c}}";
- s ::= ids
- ids ::= id (" " ids &~ id [~]*) => "1"
- | id ( ids &~ id [~]*) => "2"
+ s = ids
+ ids = id (" " ids &~ id ~[]*) => "1"
+ | id ( ids &~ id ~[]*) => "2"
| 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"
+ s = ids
+ ids = id " " ids => "1"
| id ids => "2"
| id
- id ::= [a-z]+
+ id = [a-z]+
}
testcase {
input "aaabbbccc";
- output "";
-
- s ::= ab & dc
- ab ::= a b
- dc ::= d c
- a ::= "a" a | ()
- b ::= "b" b "c" | ()
- c ::= "c" c | ()
- d ::= "a" d "b" | ()
+ 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" | ()
}
testcase {
input "aaabbbbccc";
- s ::= ab & dc
- ab !::= a b
- dc !::= d c
- a ::= "a" a | ()
- b ::= "b" b "c" | ()
- c ::= "c" c | ()
- d ::= "a" d "b" | ()
+ 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" | ()
+}
+
+testcase {
+ input "aabb";
+ output "xbx:{{a} abab:{a b} {b}}";
+
+ x = ~[]
+ s = x* b x* => xbx
+ b = [ab][ab] => abab
+ &~ ( "aa" | "bb" )
}
testcase {
//output "a:{{2 1 2 1}}";
//output "c:{{c:{1 1} c:{1 1}}}";
- s ::= ab => "ab"
+ 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]
+ 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 "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"
- a ::= () => "a"
+ s = "q" z
+ z = a z ^"bam"
+ z = ^"x"
+ a = () => "a"
}
testcase {
input "baaaa";
output "s2:{b0 a:{a:{epsilon}}}";
output "b:{a:{a:{epsilon}} epsilon}";
- s ::= b t => "s2"
+ s = b t => "s2"
| ^"b" t b
- t ::= ^"a" t "a"
+ t = ^"a" t "a"
| () => "epsilon"
- b ::= "b" => "b0"
+ b = "b" => "b0"
| () => "epsilon"
}
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
+ x = () => "epsilon"
+ a = x => "s1"
}
testcase {
input "baa";
output "s1:{a2:{a2:{a0 b0} b0}}";
- s ::= "b" a => "s1"
- a ::= "a" a b => "a2"
+ s = "b" a => "s1"
+ a = "a" a b => "a2"
| () => "a0"
- b ::= () => "b0"
+ b = () => "b0"
}
testcase {
output "s3:{epsilon a0 epsilon a0}";
output "s3:{epsilon a0 a0 epsilon}";
- s ::= "a" s a a a => "s3"
+ s = "a" s a a a => "s3"
| () => "epsilon"
- a ::= "a" => "a0"
+ a = "a" => "a0"
| () => "epsilon"
}
input "aa";
output "poo:{poo:{poox poox} poox}";
output "poo:{poox poo:{poox poox}}";
- s ::= s s "a" => "poo"
+ s = s s "a" => "poo"
| () => "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 = "b" a => "s"
+ a = "a" a b => "aa"
+ a = () => "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 = 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"
}
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 = l "=" q => "assign"
| q
- q ::= id
+ q = id
| l "=" q => "assign"
| q "-" q => "minus"
| q "+" q => "plus"
| q "*" q => "times"
| "(" q ")"
- id ::= idl++ => "stringify"
- idl ::= [a-d]
+ 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 "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 = l "=" r => "assign"
| r
- r ::= l
+ r = l
| l "=" r => "assign"
| r "+" r => "plus"
> r "*" r => "times"
| "(" r ")"
| r r => "times"
- id ::= idl++ => "stringify"
- idl ::= [a-d]
+ 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*
-ws !::= sp**
-sp ::= " "
+ s = q */ ws
+ ws = " "*
+ q = [a-z]++ => "q"
+}
-block ::= "\n" !indent blockBody
- &~ "\n" outdent [~\ ] [~]*
+//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"
+//
+//
+//
+//}
+//
-blockBody ::= statement
- > statement blockBody /ws => "sbb"
-statement ::= call
- | ^"while" expr block /ws
+testcase {
+ input "abc ";
-expr ::= ident
- | call
- | expr ^">" expr /ws
- | num
+ s = q " "* => s
+ q = [a-z] [a-z] [a-z] => a3
+ &~ ~[] "b" ~[]*
+}
-call ::= expr "()" /ws
+testcase {
+ input "abc ";
+ output "s:{a b c}";
-num ::= [0-9]++
+ s = [a-z] [a-z] [a-z] " "* => s
+}
-ident ::= [a-z]++ &~ keyword
-keyword ::= "if" | "then" | "else" | "while"
+testcase {
-w ::= " " | "\n" | "\r"
-ws ::= w*
+ input "a+2";
+ output "";
+ s = Expr
+ Expr = [0-9]++
+ | Plus:: left:Expra "+" right:Expr
+ Expra = Foo:: ("a" | "b")
}