For the scanning I would write a class that parses output from a handle and returns tokens or raises exceptions.
In fact I am working on a general purpose tokenizer/token package to deal with such cases. The code is one small part of a larger project I do so I haven't made it public (yet.) Tell me if you really want a preview of the package.