data Op
| OutP -- .
| InP -- ,
| Loop [Op] -- [...]
| Proc [Op] -- (...)
| Call -- :
parse
= fst . parseAccum
[] Nothing
parseAccum acc Nothing
"" = (reverse acc
, "")parseAccum acc
(Just x
) "" = error $ "parse error: expected " ++ [x
] -- todoparseAccum acc end ('+' : src) = parseAccum (Change 1 : acc) end src
parseAccum acc end ('-' : src) = parseAccum (Change (-1) : acc) end src
parseAccum acc end ('>' : src) = parseAccum (Move 1 : acc) end src
parseAccum acc end ('<' : src) = parseAccum (Move (-1) : acc) end src
parseAccum acc end ('.' : src) = parseAccum (OutP : acc) end src
parseAccum acc end (',' : src) = parseAccum (InP : acc) end src
parseAccum acc end (':' : src) = parseAccum (Call : acc) end src
parseAccum acc end ('[' : src) = parseAccum (op : acc) end src' where (op, src') = parseBlock src ']' Loop
parseAccum acc end ('(' : src) = parseAccum (op : acc) end src' where (op, src') = parseBlock src ')' Proc
parseAccum acc Nothing (_ : src) = parseAccum acc Nothing src
parseAccum acc e@(Just end) (c : src)
parseBlock src end ctor =
mapFst ctor $ parseAccum [] (Just end) src
mapFst f (x, y) = (f x, y)
ZGF0YSBPcAogICAgPSBDaGFuZ2UgSW50IC0tICssIC0KICAgIHwgTW92ZSBJbnQgICAtLSA+LCA8CiAgICB8IE91dFAgICAgICAgLS0gLgogICAgfCBJblAgICAgICAgIC0tICwKICAgIHwgTG9vcCBbT3BdICAtLSBbLi4uXQogICAgfCBQcm9jIFtPcF0gIC0tICguLi4pCiAgICB8IENhbGwgICAgICAgLS0gOgogICAgZGVyaXZpbmcgKFNob3csIEVxKQoKcGFyc2UgOjogU3RyaW5nIC0+IFtPcF0KcGFyc2UgPSBmc3QgLiBwYXJzZUFjY3VtIFtdIE5vdGhpbmcKCnBhcnNlQWNjdW0gOjogW09wXSAtPiBNYXliZSBDaGFyIC0+IFN0cmluZyAtPiAoW09wXSwgU3RyaW5nKQpwYXJzZUFjY3VtIGFjYyBOb3RoaW5nICAiIiAgICAgICAgICAgICAgPSAocmV2ZXJzZSBhY2MsICIiKQpwYXJzZUFjY3VtIGFjYyAoSnVzdCB4KSAiIiAgICAgICAgICAgICAgPSBlcnJvciAkICJwYXJzZSBlcnJvcjogZXhwZWN0ZWQgIiArKyBbeF0gLS0gdG9kbwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCcrJyA6IHNyYykgPSBwYXJzZUFjY3VtIChDaGFuZ2UgICAxICA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCctJyA6IHNyYykgPSBwYXJzZUFjY3VtIChDaGFuZ2UgKC0xKSA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCc+JyA6IHNyYykgPSBwYXJzZUFjY3VtIChNb3ZlICAgICAxICA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCc8JyA6IHNyYykgPSBwYXJzZUFjY3VtIChNb3ZlICAgKC0xKSA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCcuJyA6IHNyYykgPSBwYXJzZUFjY3VtIChPdXRQICAgICAgICA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCcsJyA6IHNyYykgPSBwYXJzZUFjY3VtIChJblAgICAgICAgICA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCc6JyA6IHNyYykgPSBwYXJzZUFjY3VtIChDYWxsICAgICAgICA6IGFjYykgZW5kIHNyYwpwYXJzZUFjY3VtIGFjYyBlbmQgICAgICAgICAgKCdbJyA6IHNyYykgPSBwYXJzZUFjY3VtIChvcCAgICAgICAgICA6IGFjYykgZW5kIHNyYycgd2hlcmUgKG9wLCBzcmMnKSA9IHBhcnNlQmxvY2sgc3JjICddJyBMb29wCnBhcnNlQWNjdW0gYWNjIGVuZCAgICAgICAgICAoJygnIDogc3JjKSA9IHBhcnNlQWNjdW0gKG9wICAgICAgICAgIDogYWNjKSBlbmQgc3JjJyB3aGVyZSAob3AsIHNyYycpID0gcGFyc2VCbG9jayBzcmMgJyknIFByb2MKcGFyc2VBY2N1bSBhY2MgTm90aGluZyAgICAgIChfICAgOiBzcmMpID0gcGFyc2VBY2N1bSBhY2MgTm90aGluZyBzcmMKcGFyc2VBY2N1bSBhY2MgZUAoSnVzdCBlbmQpIChjICAgOiBzcmMpCiAgICB8IGMgPT0gZW5kICA9IChyZXZlcnNlIGFjYywgc3JjKQogICAgfCBvdGhlcndpc2UgPSBwYXJzZUFjY3VtIGFjYyBlIHNyYwoKcGFyc2VCbG9jayA6OiBTdHJpbmcgLT4gQ2hhciAtPiAoW09wXSAtPiBPcCkgLT4gKE9wLCBTdHJpbmcpCnBhcnNlQmxvY2sgc3JjIGVuZCBjdG9yID0KICAgIG1hcEZzdCBjdG9yICQgcGFyc2VBY2N1bSBbXSAoSnVzdCBlbmQpIHNyYyAKCm1hcEZzdCBmICh4LCB5KSA9IChmIHgsIHkp