Natural Language Processing Techniques for Code Generation