Project 3: Semantic Analyzer for the PASC language. The project has these files: driver3.c: driving program to check command line options and invoke the parser and semantic analyzer. seman.c: routines used to augment the syntax tree generated by the parser and create the symbol table for the source code. seman.h: include file defining attributes and other semantic information, such as error messages. traverse.c: routines used to traverse the original parse tree, build the symbol table for all identifiers, and conduct semantic analyses. parser.y: grammar definitions and semantic actions to build a syntax tree. tree.c: routines to build and test the syntax tree; some functions are updated and new functions are added for convenience. tree.h: tree node definitions. lexer.l: lex file from project 1; It generates tokens and maintains a string buffer containing all lexemes. table.c : implementation of a hash table and string buffer used to store lexemes (identifiers and string constants). To run the semantic analyzer, type 'make' or 'make -f seman.mk' followed by: parser [-da [-ts [-dt [outfile]]]] < file.pasc The flags '-da' and '-ts' turn on tracing of the parser and semantic analyzer, respectively. The flag '-dt' outputs the augmented syntax tree to 'outfile'. If no file is specified, stdout is assumed. The semantic analyzer reports error and warning messages to the standard output. A program is accepted if there is no semantic error found. Except for type checking, all necessary semantic analyses are implemented and work properly.