recursive descent parsing framework