rparsec の四則演算デモを浮動小数点に対応させる
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