class Calcparser rule target: exp { print val[0] } exp: exp '+' exp | exp '*' exp | '(' exp ')' | NUMBER ---- inner def parse @q = STDIN.read.split(' ') do_parse end def next_token a = @q.shift begin b = Integer(a) return [:NUMBER, b] rescue return [a,a] end end ---- footer Calcparser.new.parse