#!/usr/bin/perl
our @v; # external values stack
our ($allnouns, %nouns) = ( qr/\d+(?{'number'})|[-(]/,
'-' => sub { expr( qr/\*{2}/ ); $v[-1] = -$v[-1] },
'(' => sub { expr(); /\G\s*\)/gcx or err("no )") },
);
our ($allverbs, %verbs) = ( qr/[-+\/]|\*{1,2}/,
'+' => sub { expr
( qr/\*{1,2}|\// ); $v[-2] += pop @v }, '-' => sub { expr
( qr/\*{1,2}|\// ); $v[-2] -= pop @v }, '*' => sub { expr
( qr/\*{2}/ ); $v[-2] *= pop @v }, '/' => sub { expr
( qr/\*{2}/ ); $v[-2] /= pop @v }, '**' => sub { expr
( qr/\*{2}/ ); $v[-2] **= pop @v }, );
sub expr # takes regex of verbs that will shift
{
(my $shifters, $^R) = pop // $allverbs; /\G\s*($allnouns)/gcx ? $nouns{$^R // $1}->($1) : err('bad noun');
$verbs{$1}->() while /\G\s*($shifters)/gcx;
}
while(<>)
{
eval { @v = (); expr
(); /\G\s*\z/gcx or err
('incomplete') } or err
($@); }
sub err
{ exit print "ERROR ", s/\G/ <@_> /r
, " \n" }
IyEvdXNyL2Jpbi9wZXJsCm91ciBAdjsgICAjIGV4dGVybmFsIHZhbHVlcyBzdGFjawpvdXIgKCRhbGxub3VucywgJW5vdW5zKSA9ICggcXIvXGQrKD97J251bWJlcid9KXxbLShdLywKICAnbnVtYmVyJyA9PiBzdWIgeyBwdXNoIEB2LCBwb3AgfSwKICAnLScgPT4gc3ViIHsgZXhwciggcXIvXCp7Mn0vICk7ICR2Wy0xXSA9IC0kdlstMV0gfSwKICAnKCcgPT4gc3ViIHsgZXhwcigpOyAvXEdccypcKS9nY3ggb3IgZXJyKCJubyApIikgfSwKICApOwpvdXIgKCRhbGx2ZXJicywgJXZlcmJzKSA9ICggcXIvWy0rXC9dfFwqezEsMn0vLAogICcrJyA9PiBzdWIgeyBleHByKCBxci9cKnsxLDJ9fFwvLyApOyAkdlstMl0gKz0gcG9wIEB2IH0sCiAgJy0nID0+IHN1YiB7IGV4cHIoIHFyL1wqezEsMn18XC8vICk7ICR2Wy0yXSAtPSBwb3AgQHYgfSwKICAnKicgPT4gc3ViIHsgZXhwciggcXIvXCp7Mn0vICk7ICR2Wy0yXSAqPSBwb3AgQHYgfSwKICAnLycgPT4gc3ViIHsgZXhwciggcXIvXCp7Mn0vICk7ICR2Wy0yXSAvPSBwb3AgQHYgfSwKICAnKionID0+IHN1YiB7IGV4cHIoIHFyL1wqezJ9LyApOyAkdlstMl0gKio9IHBvcCBAdiB9LAogICk7CnN1YiBleHByICAgIyB0YWtlcyByZWdleCBvZiB2ZXJicyB0aGF0IHdpbGwgc2hpZnQKICB7CiAgKG15ICRzaGlmdGVycywgJF5SKSA9IHBvcCAvLyAkYWxsdmVyYnM7CiAgL1xHXHMqKCRhbGxub3VucykvZ2N4ID8gJG5vdW5zeyReUiAvLyAkMX0tPigkMSkgOiBlcnIoJ2JhZCBub3VuJyk7CiAgJHZlcmJzeyQxfS0+KCkgd2hpbGUgL1xHXHMqKCRzaGlmdGVycykvZ2N4OwogIH0Kd2hpbGUoPD4pCiAgewogIGV2YWwgeyBAdiA9ICgpOyBleHByKCk7IC9cR1xzKlx6L2djeCBvciBlcnIoJ2luY29tcGxldGUnKSB9IG9yIGVycigkQCk7CiAgcHJpbnQgcy9ccypcei8gPSBAdlxuL3I7CiAgfQpzdWIgZXJyIHsgZXhpdCBwcmludCAiRVJST1IgICIsIHMvXEcvIDxAXz4gL3IsICIgXG4iIH0=