calc.tt
grammar Arithmetic rule additive multitive r:( op:[+-] multitive )* { def to_i r.elements.reduce(multitive.to_i) do |s, e| s.send(e.op.text_value, e.multitive.to_i) end end } end rule multitive primary r:( op:[*/%] primary )* { def to_i r.elements.reduce(primary.to_i) do |s, e| s.send(e.op.text_value, e.primary.to_i) end end } end rule primary '(' additive ')' { def to_i additive.to_i end } / number end rule number '-'? [1-9] [0-9]* { def to_i text_value.to_i end } end end
calc.rb
require 'treetop' Treetop.load 'calc.tt' parser = ArithmeticParser.new puts parser.parse(ARGV.shift).to_i
Treetop のインストール。
$ gem install treetop
実行。
$ ruby calc.rb "2*(3+4)" 14
…。
ここまでくるのに3日ぐらいかかってしまった (-''-) 。
つづく。