Boost logo

Boost :

From: joel de guzman (isis-tech_at_[hidden])
Date: 2001-06-11 20:57:34


Hi,

Some BNF variants allow:

r ::= a
r ::= b

Which is equivalent to:

r ::= a | b

Douglas Gregor noted that allowing the addition of new
productions would be extremely useful to be able to, for
instance, turn on/off extensions to a language at the parser
level. Example:

if (allow_typeof)
    typespec = TYPEOF >> '(' >> expr >> ')'
             | TYPEOF >> '(' >> type_id >> ')';

if (allow_template_typedefs)
    type_decl = template_header typedef;

Essentially, the declarative nature of (E)BNF productions
when inlined with imperative C++ statements yield an
uncanny mix. The C++ assignment operator substituting
as BNF's ::= operator when applied to the addition of
new productions might cause confusion.

The |= operator, as suggested by George Heintzelman,
may used for this purpose. Yet, this too might cause
confusion as one might expect &=, -= and ^= to be
equally applicable.

Also, after some deliberation, both cases impose runtime
and code size penalty. Thus, I've come up with a very
simple solution:

Undefined Rules:

An undefined rule matches nothing. This can be used to
turn on/off extensions to a language at the parser level.
For example:

r = feature_a | feature_b;
if (allow_feature_b)
    feature_b = /*...define feature_b...*/;

If the flag allow_feature_b is false, feature_b will be left
undefined and will match nothing when parsing proceeds.
So, the rule r will only have only one alternative.

Comments?
-Joel de Guzman


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