rparsec の四則演算デモを浮動小数点に対応させる

2007/12/14 10:05am

rparsec四則演算デモを試しているうちに、整数による演算しかできないことに気づくことと思う。

四則演算デモが calculator.rb にあるとして、

require 'calculator.rb'
parser = Calculator.new.parser
parser.parse '1+2*(3-1)'
=> 5
parser.parse '4 * 2.5'
=> 8

小数を計算させてみると、エラーにはならないものの、計算結果がおかしなことになっている。

実は、この四則演算デモは数値として整数しか解釈しない。そのため、4 * 2.5 を計算させたときは、2.5"." で解釈をやめてしまい、そこまでの 4 * 2 を計算して返した、という具合だ。

ソースコードで数値をパースしている箇所は、

term = integer.map(&To_i) | char('(') >> lazy{expr} << char(')')

どうみても、この行の左半分なので、ここを API リファレンスを参考に、

term = number.map(&To_f) | char('(') >> lazy{expr} << char(')')

こう書き換えれば動く。

parser.parse '4 * 2.5'
=> 10.0