CLASS PROJECT, Part 1 For your class project, you will write a compiler for nonlinear programming problems. The first step in this project is to write a lexical scanner that will recognize the lexemes in a source file written in the problem specification language and produce the corresponding tokens. You will use Lex to do this. See Appendix B.1 for a description of Lex. See the file NONLINEAR PROGRAMMING SPECIFICATION LANGUAGE (on the class web page) for a description of the lexemes that will appear in source files. Write a Lex specification similar to the example in the appendix (pp. 326-328) for this language and demonstrate that it works on the sample problem statements found on the class web page. (I will add one or more sample problems in a few days.) On the due date, turn in a listing of your Lex specification file and traces showing you compiling this file and running it on all the sample problems. The outputs should show each generated token on a separate line of output. Some Hints: Variable names will consist of a single letter possibly followed by an integer. Since it will be better if the grammar rules handle the conversion of letter+number into an array reference, the single letter and the integer should be treated as separate lexemes. So, instead of having identifiers, uppercase letters should be stored in the symbol table and the the token "ucase" returned, and lowercase letter should be stored in the symbol table and the token "lcase" returned. (The symbol table will only contain single characters instead of strings for now; that will change later.) All lexemes that consist of a single character (apart from letters) such as '(', '^','-', etc., should be grouped together into one Lex pattern and the ascii number for the character should be returned as its token. This is what the book's example does for "binary operators" in the pattern it calls "op". Each key word in the nonlinear programming specification language should have its own token; they should not be lumped together into one category.