<br><br><div class="gmail_quote">On Sun, Mar 14, 2010 at 9:03 AM, david fries <span dir="ltr">&lt;<a href="mailto:djf@gmx.ch">djf@gmx.ch</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hello Café<br>
<br>
Some time ago I wrote a parser for a project of one our customers. The<br>
format was proprietary and binary. The data was structured as a tree<br>
with tables pointing to sub tables farther in the file. (Well actually<br>
there was one or two cases where branches joined together, so I guess it<br>
was a directed graph.) Also it had no defined endianess, some tables<br>
were bigendian others were little endian and some were in their very own<br>
in-house-endianess.<br>
All in all, the typical binary data structure that has been in use and<br>
continuously extended for the last 15 years. You know the kind.<br>
<br>
Oddly enough, our customer never bothered to write a parser of their<br>
own. I wonder why.<br>
<br>
My parser was written in C# and wasn&#39;t particularly elegant, but it<br>
worked reliably. I was wondering how you would parse tree-like<br>
structures with Parsec (or other functional parsers)? Up to know, all<br>
examples I&#39;ve seen were of sequential data. To parse trees, you&#39;d<br>
essentially need to be able to follow pointers, parse whatever is there<br>
and then jump back. I guess I&#39;d have to mess around with the internal<br>
state of the parser to do that, which is something I&#39;d rather avoid.<br></blockquote><div><br></div><div>Would binary or cereal be right for this task?</div><div><a href="http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.html">http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.html</a></div>
<div><a href="http://hackage.haskell.org/packages/archive/cereal/0.2/doc/html/Data-Serialize.html">http://hackage.haskell.org/packages/archive/cereal/0.2/doc/html/Data-Serialize.html</a></div><div><br></div><div>My understanding is they provide low-level ways to get at bytes in a chunk of memory.  Using them, I believe you&#39;d read the data into a bytestring and then load in the bytes and seek/jump as needed.  I don&#39;t know if they support the backwards jumping though.</div>
<div><br></div><div>And, I think ideally you use it by defining a type class instance for each object in the binary format and then use the provided type classes to just get/put your format.</div><div><br></div><div>If the representation is very much like a C struct, you might consider Storable.  Although, I&#39;ve never heard of anyone using it as a parser.</div>
<div><br></div><div>Jason</div></div>