#/*********************************************************** # eval.rb -- 式の評価 #***********************************************************/ $ch = 0 def isdigit( c ) if (c < ?0 || c > ?9); false; else; true; end end def error(s) # エラー処理 printf("%s\n", s); exit 1 end def readch # 1文字を読む. 空白は読み飛ばす. begin if (($ch = $stdin.getc) == nil); return false; end end while ($ch == ?\s || $ch == ?\t) true end def number # 数 if ($ch == ?+ || $ch == ?-) sign = $ch; readch end if (! isdigit($ch)); error("数か '(' がありません"); end x = $ch - ?0 while (readch && isdigit($ch)) x = 10 * x + $ch - ?0 end if ($ch == ?.) a = 1 while (readch && isdigit($ch)) x += (a /= 10.0) * ($ch - ?0) end end if (sign == ?-); return -x; else; return x; end end def factor # 因子 if ($ch != ?(); return number; end readch; x = expression if ($ch != ?)); error("')' がありません"); end readch; return x end def term # 項 x = factor while (true) if ($ch == ?*) readch; x *= factor elsif ($ch == ?/) readch; y = factor if (y == 0); error("0 では割れません"); end x /= y.to_f else break end end return x end def expression # 式 x = term while (true) if ($ch == ?+) readch; x += term elsif ($ch == ?-) readch; x -= term else break end end return x end readch; x = expression if ($ch != ?\n); error("文法の間違いがあります"); end printf("%g\n", x) exit 0