This works with your example, but I don't know how general it is.
Code
def arrayify(str)
eval('['+str.gsub(/(\w+)\s+\(/,'{\1=>[')
.gsub( /(?!\{)(\w+)\s+/, '{\1=>nil},')
.gsub(')', ']}')
.gsub(/\b(\w+)\b/,"\"\\1\"")+']')
end
Example
str = "Animals ( Reptiles Birds ( Eagles Pigeons Crows ) )"
arrayify(str)
#=> [{ "Animals"=>[{ "Reptiles"=>"nil"},
# { "Birds" =>[{ "Eagles" =>"nil" },
# { "Pigeons"=>"nil" },
# { "Crows" =>"nil" }
# ]
# }
# ]
# }
# ]
Explanation
s1 = str.gsub(/(\w+)\s+\(/,'{\1=>[')
#=> "{Animals=>[ Reptiles {Birds=>[ Eagles Pigeons Crows ) )"
s2 = s1.gsub( /(?!\{)(\w+)\s+/, '{\1=>nil},')
#=> "{Animals=>[ {Reptiles=>nil},{Birds=>[ {Eagles=>nil},{Pigeons=>nil},{Crows=>nil},) )"
s3 = s2.gsub(')', ']}')
#=> "{Animals=>[ {Reptiles=>nil},{Birds=>[ {Eagles=>nil},{Pigeons=>nil},{Crows=>nil},]} ]}"
s4 = s3.gsub(/\b(\w+)\b/,"\"\\1\"")
#=> "{\"Animals\"=>[ {\"Reptiles\"=>\"nil\"},{\"Birds\"=>[ {\"Eagles\"=>\"nil\"},{\"Pigeons\"=>\"nil\"},{\"Crows\"=>\"nil\"},]} ]}"
eval('['+s4+']')
#=> <result in example>
Pardon me, but I have to run. The eval
police are coming.