プログラミングのお題スレ Part17at TECH
プログラミングのお題スレ Part17 - 暇つぶし2ch152:デフォルトの名無しさん
20/04/15 15:02:35.67 3oL83xUj.net
>>145 Perl5、再帰降下parser generator使わせてもらいました
sub evalop {
 my (@list) = @{$_[0]};
 my $val = shift(@list)->();
 while (@list) {
  my ($op, $arg2) = splice @list, 0, 2;
  $op->($val,$arg2->());
 } $val }
use Parse::RecDescent;
$parse = new Parse::RecDescent(<<'EOG');
 formula: expr /\s*\Z/ {$item[1]->()} | <error>
 expr: <leftop:muldiv add_op muldiv> {sub {::evalop $item[1]}}
 add_op: '+' {sub {$_[0] += $_[1]}} | '-' {sub{ $_[0] -= $_[1]}}
 muldiv: <leftop:factor mult_op factor> {sub {::evalop $item[1]}}
 mult_op: '*' {sub {$_[0] *= $_[1]}} | '/' {sub {$_[0] /= $_[1]}}
 factor: number | '(' expr ')' {$item[2]}
 number: /\d+/ {sub {$item[1]}}
EOG
for (<DATA>) {
 chomp;
 $ret = defined ($iret = $parse->formula($_)) ? sprintf('%d', $iret) : 'Error';
 printf "$_ = %s\n", $ret;
}
__DATA__
1+2*((3-4*5)/6+7)*8-9
100/2(3+4)
100/2*(3+4)
*10
1/3*3


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch