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日ぐらいかかってしまった (-''-) 。
つづく。