Boost logo

Boost :

From: Vesa Karvonen (vesa.karvonen_at_[hidden])
Date: 2001-05-22 02:57:20


"Vladimir Prus" <ghost_at_[hidden]>

[argh...] Obviously I wrote the pseudo code too quickly, because it had
multiple pseudo bugs.

    istream& operator>>(istream& s, complex& a)
    {
        Terminal<double> re, im(0); // Don't forget initialization!

        // Generates the parser from the grammar expression
        Parser parser = re
                      | '(' + re + ')'
                      | '(' + re + ',' + im + ')'
                      ;

        if (s >> parser) // This may change the stream state!
        {
            // Assign only if parsing completes succesfully
            a = complex(re,im);
        }

        return s;
    }

> Well, this is nice. However, it seems like the grammar here is not LL(1).
Am
> I wrong? If I right, how this is supposed to work.

[Seems like I have to order a copy of the dragon book to the office as well.
Books are never there when you need them.]

Anyway, you are right that the above grammar is not LL(1). However, it is
possible to transform it to LL(1) by using left factoring:

    C -> f
    C -> ( f C'
    C' -> )
    C' -> , f )

This transformation could perhaps be done by a metaprogram that generates
the parser from the grammar specification.

There is at least one problem. The terminals '(', ',' and ')' have to be
typified. For instance (loaning a few names from Spirit):

    Parser parser = re
                  | oppar + re + clpar
                  | oppar + re + comma + im + clpar
                  ;

Where oppar, comma and clpar are defined something like this:

    Ch<'('> oppar;
    Ch<')'> clpar;
    Ch<','> comma;

(This would be different from Spirit.)

I think that the above syntax would be implementable, although not trivial,
using expression templates and metaprogramming.

An alternative to transforming the grammar to LL(1) by a metaprogram would
be to implement back tracking as is done by Spirit. Even with the slower
parsing implied by back tracking, I think that such a framework would be
quite useful for implementing micro parsers.

> > > Template metaprograms are very hard to write, debug and use.
>
> > True, but the problems are solvable and the benefits are clear.
>
> I would like to see working implementation that can handle syntax that
you've
> given a few lines above.

Me, too!


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk