Recursive descent markdown parser