$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Larry Evans (cppljevans_at_[hidden])
Date: 2008-03-21 22:48:23
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?