
On 03/03/08 19:29, Eric Niebler wrote:
Larry Evans wrote: [snip]
was formed with the same template as an expression... Hmm.. Getting confused again. How can one distinguish a grammar from an expression if both are formed from the same template, i.e. the expr template? Maybe by starting from the base case, the terminal template? IOW, is the following:
base_case)
For any type T: terminal<T> is a grammar type. [snip] terminal<T>::type is an expression type.
Yes. It's also a grammar type. It matches itself (more or less -- see the reference for proto::matches<>).
inductive_case)
If T0,T1,...,Tn are all grammar types, and Tag is an n-ary tag, then expr<Tag,T0,T2,...,Tn> is a grammar type.
Yes. (Minor correction, expr<Tag, argsN<T0,T1,...,Tn> > is a grammar type.) [snip]
If T0,T1,...,Tn are all expression types, and Tag is an n-ary tag, then expr<Tag,T0,T,...,Tn> is an expression type.
Yes. It is also a grammar type that matches itself.
[snip] Hmm... So a grammar is an expression and an expression is a grammar. Sorta like lisp where a program is data and data is a program. I guess proto::matches is like lisp eval. Is that sorta right?