|
![](/i/fill.gif) |
scott wrote:
> I read it, very interesting seeing as I had no idea how a parser works
> (I always wondered how you would go about writing one).
The more "usual" approach is usually something based around a finite
state machine - but as I just explained, Parsec works differently. (And
indeed will parse things t FSM couldn't parse - but that you'll often
need that.)
> So essentially, you could "just" make one parser object, that consisted
> of many many complex parser objects, to parse something like a POV SDL
> file? Then you would just chuck the POV file at the top level parser
> object, and it would return a nice tree structure of the SDL code? Hmmmm.
Pretty much, yeah. SDL is complicated by #declare and #macro though. ;-)
For a "normal" programming language, the traditional approach is this:
1. A "tokeniser" takes the input string and splits it into "tokens",
possibly decorating them slightly. So now you have a flat stream of
tokens instead of just characters.
2. A "parser" builds a tree-like structure out of the token list, using
the syntax rules of the language.
3. You pass this tree ("abstract syntax tree") to a compiler or
interpretter or whatever the hell it is your program wants to do with
the thing.
Parsec allows you to parse and then tokenise, or do the whole thing in
one pass. It's up to you. (I didn't mention it, but Parsec supports
running parsers over lists of *anything*, not just characters. So you
could in theory parse raw binary if you wanted...)
POV-Ray SDL is complicated because it doesn't have *functions*, it has
*macros*, which expand at the token level, not the syntax tree level.
(So, e.g., the contents of a macro can be an incomplete expression.)
Theoretically Parsec can cope with that - but in practice I'm not sure
how ugly the code would be. IIRC there's a formal grammer available
online somewhere, right? Some appendix to the user guide or something?
Maybe I could have a go at implementing it with Parsec. (It'll be
*large* though! POV-Ray has a lot of keywords...)
Post a reply to this message
|
![](/i/fill.gif) |