#ライブラリの読み込み require "strscan" #構文木 module AST BinOp = Struct.new :op, :lhs, :rhs do def value op.to_proc.call lhs.value, rhs.value end def to_s lhss = lhs.instance_of?(BinOp) && opRank(op) > opRank(lhs.op) ? "(#{lhs})" : lhs.to_s rhss = rhs.instance_of?(BinOp) && opRank(op) > opRank(rhs.op) ? "(#{rhs})" : rhs.to_s "#{lhss} #{op} #{rhss}" end private def opRank(op) case op when :+, :- 1 when :*, :/