四則演算するperlプログラム
与えられた数式はグローバル変数$qに入っていて、
使える演算子は、+-*/と括弧。
演算の優先順位は 括弧 → */ → +- の順
一応ちゃんと動いてる模様
http://rafeel.s602.xrea.com/calc/?q=2*%281%2B4%2B1%29
2*(1+4+1)
の計算結果は、12になります。
2*(1+(4*2)+1)
答え20
二重括弧も大丈夫ですね
優先順位は再帰呼び出しの順位になっています。
負の数がなかったので追加します。
次に、これを、一次方程式も解けるようにしてみます(ゝω・)
$q =~ s/[\n\r]+//g; my ($type1,$token1) = addsub(); print $token1; print "<br>"; exit; sub addsub() { my @dic; my ($type1,$token1) = muldiv(); for(;;) { if( substr($q,0,1) ne "+" && substr($q,0,1) ne "-" ) { $dic[0]=$type1;$dic[1]=$token1; return @dic; } my ($type2,$token2) = getToken(); if($type2 eq "+") { my ($type3,$token3) = muldiv(); $token1 = $token1+$token3; } elsif($type2 eq "-") { my ($type3,$token3) = muldiv(); $token1 = $token1-$token3; } } } sub muldiv() { my @dic; my ($type1,$token1) = factor(); for(;;) { if( substr($q,0,1) ne "*" && substr($q,0,1) ne "/" ) { $dic[0]=$type1;$dic[1]=$token1; return @dic; } my ($type2,$token2) = factor(); if($type2 eq "*") { my ($type3,$token3) = factor(); $token1 = $token1*$token3; } elsif($type2 eq "/") { my ($type3,$token3) = factor(); $token1 = $token1/$token3; } } } sub factor() { my @dic; my ($type1,$token1) = getToken(); if( $type1 eq "(" ) { my ($type1,$token1) = addsub(); $dic[0]=$type1;$dic[1]=$token1; if( substr($q,0,1) ne ")" ) { print "nest error<br>"; } getToken(); return @dic; } $dic[0]=$type1;$dic[1]=$token1; return @dic; } sub getToken() { my $token=""; my $type=""; my $c = substr($q,0,1); if($c =~ /[0-9]+/ ) { $type="num";$q =~ s/^([0-9]+)//; $token=$1; } elsif($c =~ /[a-zA-Z]+/ ) { $type="alp";$q =~ s/^([a-zA-Z]+)//; $token=$1; } else { $type=$c;$token=$c;$q=substr($q,1); } my @dic; $dic[0]=$type;$dic[1]=$token; return @dic; }