grammar Primitive include Helper rule primitive string | bool | datetime | number end rule string (/(["'])(?:\\?.)*?\1/ space) end rule bool true | false end # Full Zulu form rule datetime (y:/\d\d\d\d/ "-" m:/\d\d/ "-" d:/\d\d/ "T" h:/\d\d/ ":" mi:/\d\d/ ":" s:/\d\d/ "Z") { y,m,d,h,mi,s = [:y,:m,:d,:h,:mi,:s].map{|s| capture(s) } Time.utc(*[y,m,d,h,mi,s].map(&:value)) } end rule number float | integer end rule float (integer '.' integer) { to_str.to_f } end rule integer (sign? [0-9]+) { to_str.to_i } end rule sign '+' | '-' end rule key [a-zA-Z_] [a-zA-Z_0-9#?]* end rule true 'true' { true } end rule false 'false' { false } end end