in reply to ParseRecDescent and csv-like data

You don't have to get that fancy. Something like:
word: /[a-zA-Z]+(_[a-zA-Z]+)*/
should be sufficient.