grammar MiniLisp rule root (expression) end rule expression ((space_p) "(" (space_p) (body) ")") end rule space_p (space)0..1 end rule body ((expression) / (identifier) / (float) / (integer) / (string))0.. end rule space \s1.. end rule identifier (([a-zA-Z=*] [a-zA-Z=*_]0..) (space_p)) end rule float (((integer) (("." [0-9]1..) / ("e" [0-9]1..))) (space_p)) end rule integer ((("+" / "-")0..1 [0-9]1..) (space_p)) end rule string ("\"" (("\\" .) / (!"\"" .))0.. "\"" (space_p)) end end