勝手に添削 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