
On 03/04/08 11:38, Eric Niebler wrote:
Larry Evans wrote:
On 03/03/08 19:29, Eric Niebler wrote:
Larry Evans wrote:
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?
An expression is a grammar, but a grammar is not an expression. For example, not_<X> is only a grammar and not an expression.
The following grammar I think summarizes the difference between grammar and expression: expr //describes an expression. = terminal | expr+ //i.e. 1 or more expressions (e.g. expr<tag::plus,expr0,expr1>) ; gram //describes a grammar = expr | wildcard //struct wildcardns_::_ in matches.hpp | control //any struct or class template in namespace control in //matches.hpp ; control = not_ >> gram | or_ >> gram >> gram+ | and_ >> gram >> gram+ | if_ >> gram >> gram ; The '= expr' as first alternate of gram reflects the statement 'an expression is a grammar'. The absence of gram on the rhs of the expr equation reflects the statement 'a grammar is not an expression'. Is that about right?