On Tue, 10 Oct 2000, Brian Goetz wrote:

> 
> >#foreach $element in $list $element #end
> >             1      2    3     4
> >
> >If all directives are pluggable then there
> >is nothing specific in the grammar to
> >catch a #foreach $element in $list. You are basically
> >looking for #anything, then a list of arguments.
> >In the above example it's not possible to tell
> >that (4) is in the body of the #foreach without
> >giving the parser a hint i.e. the number of
> >arguments to the directive. So a #foreach has
> >three arguments so what follows must be the
> >body of loop.
> 
> Actually, what I did in WM is a little more complicated, but this is 
> close.  Each directive has a directive descriptor, which includes a list of 
> argument descriptors.  Argument descriptors describe an argument, and there 
> are defined types for Conditional, LValue, RValue, Keyword, Block, etc.  So 
> the argument list for #foreach would be: ( LValue, Keyword("in"), RValue, 
> Block )
> 
> While this solves the problem of backward compatibility in WM, it does make 
> the parser more complicated.  Jason's idea of delimiting the argument list 
> with ( .. ) seems to work, although you're still going to want to be able 
> to say that some directives require a block (like #if and #foreach) and 
> some don't (like #set.)  I think this will still require some, but fewer, 
> JAVACODE productions.

You still have to know whether the directive has blocks, yes, but we
have no JAVACODE productions and everything is working
fine. Geir and I are just finishing what we hope will be the
first production quality parser.

jvz.

Reply via email to