Luke Palmer wrote:
>
> > grammar Grammars::Languages::C::Preprocessor {
> > rule CompilationUnit {
> > ( <Directive> | <UnprocessedStuff> )*
> > }
> >
> > rule Directive {
> > <Hash> ( Include
> > | Line
> > | Conditional
> > | Define
> > ) <Continuation>*
> > }
> >
> > rule Hash { /^\s*#\s*/ }
> > rule Include {...}
> > rule Line {...}
> > rule Conditional {...}
> > rule Define {...}
> > rule Continuation {...}
> > rule UnprocessedStuff {...}
> > }
>
> We're not quite in the world of ACME::DWIM, so you can't just replace
> the important stuff with ... . :-)
>
> You're not outputting a parse tree, you're just outputting more text
> to be parsed with another, text-based, grammar. It seems to me like
> it's a big s//ubstitution, of sorts.
Hmm... well, think about yacc for a moment. You could either have the
handlers for rules assign to $$, based on $1, etc., and thus build a
huge structure, OR, you could have the handlers for rules print stuff to
stdout (which might possibly be a pipe to another process).
ISTM that we also want our grammers to be able to do things like that...
We want to be able to produce a tree, *and*, we want to be able to act
as a filter. And probably also some combination thereof -- some rules
produce trees, and other rules within the same grammer (which contain
the tree-producing ones) somehow process and output those trees.
> Or maybe not, maybe we make an output stream which will be fed to
> Grammars::Languages::C. Here's an implementation a #include
> processor, using as little made-up syntax as possible.
>
> use Pattern::Common;
>
> grammar Preprocessor {
> rule include {
> :w(/\h*/)
> \# include "<Pattern::Common::filename>" $$
> { $0 := (<<< open "< $filename") ~~ /<main>/ }
> }
>
> rule main {
> $0 := ( [<include> | .]* )
> }
> }
Alas, this doesn't work right with a fairly common idiom:
#ifdef HAVE_FOO_H
#include <foo.h>
#endif
Nor the even more common:
#ifndef SYS_SOMEFILE_H
#define SYS_SOMEFILE_H
lots of stuff, possibly including some #includes, and some typedefs.
#endif /* SYS_SOMEFILE_H */
--
$a=24;split//,240513;s/\B/ => /for@@=qw(ac ab bc ba cb ca
);{push(@b,$a),($a-=6)^=1 for 2..$a/6x--$|;print "[EMAIL PROTECTED]
]\n";((6<=($a-=6))?$a+=$_[$a%6]-$a%6:($a=pop @b))&&redo;}