On Tue, Oct 04, 2005 at 09:16:58PM -0700, Joshua Hoblitt via RT wrote:
> Guys,
>
> What is the status of this bug? Should this be a PGE todo item?
My opinion is that it's "not a bug" -- the normal behavior for
most programs with infinite recursive loops is that they
eventually explode. The original set of rules were
rule atom { A }
rule binary { <expr> \* <atom> }
rule expr { <binary> }
which is analogous to writing something like
sub atom { print "A"; }
sub binary { expr(); print "*"; atom(); }
sub expr { binary(); }
and most people would consider "explode" to be, well, if not correct,
at least not a bug in the language translator.
Pm
> > [pmichaud - Sat Jul 02 15:27:11 2005]:
> >
> > On Thu, Jun 30, 2005 at 02:56:27PM -0400, Will Coleda wrote:
> > > Attempting to come up with a simplistic math grammar that has one
> > possible
> > > operand (A) and one possible operator (*) - so that things like A,
> > A*A, and
> > > A*A*A*A*A are all parsed. This simplistic example (thanks to
> > spinclad on
> > > #perl6) cause PGE to explode.
> > >
> > > $ cat ta.p6r
> > > grammar f;
> > > rule atom { A }
> > > rule binary { <expr> \* <atom> }
> > > rule expr { <binary> }
> > > $ ./parrot compilers/pge/demo.pir
> >
> > Well.... yes, of course, since there's a left-recursive rule there
> > it's
> > very likely to explode. (f::expr calls <binary>, which calls <expr>,
> > which calls <binary>, which calls <expr>, which calls <binary>, which
> > ... )
> > It's basically the same as what one would get from doing
> >
> > sub binary { expr(); atom(); }
> > sub expr { binary(); }
> >
> > and I'm not sure PGE should be responsible -- at least not yet --
> > for trapping such infinite loops.
> >
> > If you rewrite the grammar to be right-recursive I think you'll
> > find it works fine:
> >
> > grammar f;
> > rule atom { A }
> > rule binary { <atom> \* <expr> }
> > rule expr { <binary> }
> >
> > > Also, $ ./parrot compilers/pge/demo.pir
> > > ...
> > > input "rule <pattern>", "glob <pattern>", "save <name>",
> > > target string, "pir", "exp", "trace", "next", or "use <file>"
> > > rule <f::expr>
> > >
> > > input "rule <pattern>", "glob <pattern>", "save <name>",
> > > target string, "pir", "exp", "trace", "next", or "use <file>"
> > > A
> >
> > Well, "A" isn't a valid match for f::expr in the grammar you've
> > provided -- the f::expr rule calls <binary>, which absolutely
> > requires at least one \* . If you want to match "A", "A*A", "A*A*A",
> > etc., I suggest:
> >
> > grammar f;
> > rule atom { A }
> > rule binary { <atom> [ \* <atom> ]? }
> > rule expr { <binary> }
> >
> > which eliminates the recursion altogether as well as recognizing a
> > single <atom> as a valid expression.
> >
> > Pm
> >
> >
>
>