[EMAIL PROTECTED] wrote:
>
> If anyone has a working tpr05a solution using Parse::RecDescent
> or other CPAN module can you please post it to the list, as I
> am also interested in comparing that solution to the others.
You have only to ask:
This one uses Parse::Yapp.
Here's a rpn.y:
%left '+' '-'
%left '*' '/'
%%
expr: NUMBER
| '-' NUMBER { "-$_[2]" }
| expr '+' expr { "$_[1] $_[3] +" }
| expr '-' expr { "$_[1] $_[3] -" }
| expr '*' expr { "$_[1] $_[3] *" }
| expr '/' expr { "$_[1] $_[3] /" }
| '(' expr ')' { $_[2] }
;
%%
my $s; # warning - not re-entrant
sub yylex { $s=~/\G\d+/cg?('NUMBER',$&):$s=~/\G./cg?$&:'' }
sub parse
{
my $self = shift()->new(yylex=>\&yylex,
yyerror=>sub{die "Syntax Error"});
$s = shift;
$self->YYParse;
}
package main; ###############################################
$_ = <>; s/\s+//g; print rpn->parse($_), "\n";
and a Makefile for it:
all: rpn.pl
rpn.pl: rpn.y
yapp rpn.y
echo '#!/usr/bin/perl' >rpn.pl
cat rpn.pm >>rpn.pl
chmod +x rpn.pl
rm -f rpn.pm
that produces a rpn.pl that passes v8 tests: rpn.pl: 2807.26 strokes (ok)
Also, instead of using Parse::RecDescent, I did my own recursive
descent parser, and submitted it in the "Artistic" section at 141.36 (though
as the comment says, it's really a 137).
#!perl -p
sub o{print$"x$|++,shift}
sub f{s/^-*\d+//?o$&:e(s/.//)+s/.//}
sub t{f;o$&x1,f while s+^[*/]++}
sub e{t;o$&x1,t while s/^[+-]//}
e y/ //d
This would have scored in the middle of the pack, instead of the
actual depressing position I finished in.
--
Rick Klement