David Abrahams <[EMAIL PROTECTED]> wrote:
> "Joel de Guzman" <[EMAIL PROTECTED]> writes:

>> Now, unlike YACC, Spirit has iteration (kleene, plus, optional)
>> Here's a more or less the complete suite of patterns and the
>> corresponding semantic-action signatures:
>> 
>>     r ::= a b    ----->    F(tuple<A, B>)
>>     r ::= a | b  ----->    F(variant<A, B>)
>>     r ::= a*     ----->    F(vector<A>)
>>     r ::= a+     ----->    F(vector<A>)
>>     r ::= a?     ----->    F(optional<A>)
> 
> 
> This is somewhat OT, but I want to suggest you consider something
> else.  I did this in a parser generator system I wrote, and it worked
> out really well.
> 
> If the rule is
> 
>    x -> a b | c d c
> 
> Then the way you refer to the semantic value associated with the a
> symbol is by writing, simply, 'a'.  The way you refer to the semantic
> value of the first c symbol is by writing c[0], and you refer to the
> 2nd one as c[1].  I'm sure you get the idea.
> 
> Then the user almost never needs to worry about positional
> associations between grammar symbols and their semantic values.  It's
> actually fairly rare that the same symbol appears twice on the rhs of
> a rule (especially when rules are reduced to eliminate "|") and
> keeping track of whether it's the first or nth instance of 'X' is much
> easier than keeping track of precisely where the Xs fall in the
> sequence of symbols.
> 
> My system was written in Python, but you might be able to adapt the
> general idea to C++.

Hmmm, nice! How does it handle iteration like x -> a* and the optional
x -> a? 

-- 
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to