Due: Feb 18, 2003 (Before class time)
[100 points]

Write the LEX program as per the specifications below.

Check the Resources link for samples. You can take them as a starting point.

Recognize Action
Arithmetic (+, -, *, /) Print the operator along with the line number
Relational (<, <=, >, >=, !=, ==) Print the operator along with the line number
Assignment (=) Print the operator along with the line number
Parenthesis (left and right ones) No action for now
Some set of Reserved Words (for, if, while, int, ...) Print the Reserved word along with the line number
Identifiers Insert into a table and keep track of the line number
Numbers Print the number (should handle integer and floating point) along with the line number

Keep explicit track of the current line number by recognizing "\n" as a separate token. Do not use the LEX line number variable.

At the end, print the number of distinct identifiers and the line numbers on which they occur.

Sample Input:

  int i, n, sum;
  i = 1;
  n = 10;
  sum = 0;
  while (i <= n)
    sum = sum + i;
    i = i + 1;

Corresponding Sample Output:

   Found keyword int on line 1
   Found Assignment on line 2
   Found number 1 on line 2
   Found Assignment on line 3
   Found number 10 on line 3
   Found Assignment on line 4
   Found number 0 on line 4
   Found keyword while on line 5
   Found operator <= on line 5
   Found Assignment on line 7
   Found operator + on line 7
   Found Assignment on line 8
   Found operator + on line 8
   Found number 1 on line 8
   The following are the identifers:
     Identifier i occurs on lines: 1, 2, 5, 7, 8 (2 times)
     Identifier n occurs on lines: 1, 3, 5
     Identifier sum occurs on lines: 1, 4, 7 (2 times)

Running the Lex program

  1. Write the Lex specifications as described above in a file, say, hw1.l
  2. On Unix systems, do the following:
       % lex hw1.l                    (Produces lex.yy.c as the output)
       % cc lex.yy.c -ll              (Compile the C file and link with Lex library)
       % a.out                        (Run the executable, and type the input, followed by )
                         or, if the input is in a file, say, hw1.in, then do the following:
       % a.out < hw1.in