I was looking at languages/punie/lib/punie.g in the current SVN head
and got confused. I see:
rule gprint { (print) \s* <PunieGrammar::expr> }
and
rule expr { <PunieGrammar::gprint> | <PunieGrammar::cexpr> }
Doesn't that imply that "print print print print 1;" is a valid Punie
program? Is that intentional? It seems to me that the gprint rule
should instead contain "cexpr":
rule gprint { (print) \s* <PunieGrammar::cexpr> }
Sorry if these are dumb questions. I've been following Parrot for a
while, but I'm new to the code...
Chris
--
Chris Dolan, Software Developer, http://www.chrisdolan.net/
Public key: http://www.chrisdolan.net/public.key
vCard: http://www.chrisdolan.net/ChrisDolan.vcf
"print print print print 1;" is certainly a valid Perl 5 program; it prints a
1 followed by 3 other things (which are defined to be true, and which happen
to also be the number 1). Digging on retroperl.cpan.org shows that it did
exactly the same thing on perl 1.0.0. So to answer your question, it's
probably intentional :)
Andrew
> "print print print print 1;" is certainly a valid Perl 5 program; it
> prints a 1 followed by 3 other things (which are defined to be true, and
> which happen to also be the number 1).
Nit: print doesn't *always* return a true value. It's a system call. It can
fail.
At least, that's how Punie should eventually handle it, if it doesn't yet.
-- c
Yup, that part of the punie grammar is pretty direct translation of
the original perl.y.
Allison