勝手に添削 re Perl5 の適当な手書きパーザで、簡単な数式をパースしてみる

http://d.hatena.ne.jp/tokuhirom/20120413/1334282197 を勝手に添削。

my $src = "11*3+2/2";
use Data::Dumper;

print Dumper(parse($src));
exit;

sub parse {
    my $src = shift;
    my $ret = expression(\$src);
    if ($src) {
        die "Parse failed: $src";
    }
    $ret;
}

sub expression {
    my $src = $_[0];
    my $expr = term($src);
    while (my $op = match($src, qr/[+-]/)) {
        $expr = [ $op, $expr, term($src) ];
    }
    $expr;
}

sub term {
    my $src = shift;
    my $expr = primary($src);
    while (my $op = match($src, qr/[*\/]/)) {
        $expr = [ $op, $expr, primary($src) ];
    }
    $expr;
}

sub primary {
    my $src = shift;
    $$src =~ s/^\s*([1-9][0-9]*)//
        or die "Parse Error";
    $1;
}

sub match {
    my ($src, $re) = @_;
    $$src =~ s/^\s*($re)//
        or return;
    $1;
}

こんな感じ? 重複する処理をリトライする必要はないし、同一優先順位のオペレータはまとめてルックアップすればいい。エラー処理も、導出できなかった瞬間に行えばいい。

…っと思ったら、元のコードに左結合うんぬんって書いてあったw 直したww