Recursive descent parser