fork(3) download
  1. #!/usr/bin/perl
  2. our @v; # external values stack
  3. our ($allnouns, %nouns) = ( qr/\d+(?{'number'})|[-(]/,
  4. 'number' => sub { push @v, pop },
  5. '-' => sub { expr( qr/\*{2}/ ); $v[-1] = -$v[-1] },
  6. '(' => sub { expr(); /\G\s*\)/gcx or err("no )") },
  7. );
  8. our ($allverbs, %verbs) = ( qr/[-+\/]|\*{1,2}/,
  9. '+' => sub { expr( qr/\*{1,2}|\// ); $v[-2] += pop @v },
  10. '-' => sub { expr( qr/\*{1,2}|\// ); $v[-2] -= pop @v },
  11. '*' => sub { expr( qr/\*{2}/ ); $v[-2] *= pop @v },
  12. '/' => sub { expr( qr/\*{2}/ ); $v[-2] /= pop @v },
  13. '**' => sub { expr( qr/\*{2}/ ); $v[-2] **= pop @v },
  14. );
  15. sub expr # takes regex of verbs that will shift
  16. {
  17. (my $shifters, $^R) = pop // $allverbs;
  18. /\G\s*($allnouns)/gcx ? $nouns{$^R // $1}->($1) : err('bad noun');
  19. $verbs{$1}->() while /\G\s*($shifters)/gcx;
  20. }
  21. while(<>)
  22. {
  23. eval { @v = (); expr(); /\G\s*\z/gcx or err('incomplete') } or err($@);
  24. print s/\s*\z/ = @v\n/r;
  25. }
  26. sub err { exit print "ERROR ", s/\G/ <@_> /r, " \n" }
Success #stdin #stdout 0s 6044KB
stdin
2 * 3
2+3
2*3-4
(2-3*4)
-2**4
1+2+3+4+5+6+7+8+9+10
stdout
2 * 3 = 6
2+3 = 5
2*3-4 = 2
(2-3*4) = -10
-2**4 = -16
1+2+3+4+5+6+7+8+9+10 = 55