HW 3 README: Ben Kaplan *the compile shell script in the root directory will compile the program, including running lex and yacc. *To run the program, execute Debug/CompilerDesign *as stated in the requirements, there are no scoping rules. Any time you initialize a value, it's added to the symbol table again. *try to do some basic error handling. The compiler will report problems at the outermost level (i.e. no braces), failure to parse declarations, and failure to identify factors. Except for the first case, the error message will list the token it was stuck on and the line number, so that hopefully the user can identify the problematic token * anytime a rule is used, the printout starts with "rule:". Also, errors all start with "error:" and are printed to stderr *to get the output of the sample program, run the command $ cat input.test | Debug/CompilerDesign { basicrule: decls -> empty rule: type -> basic id;rule: decl -> type id; rule: decls -> decls decl basicrule: type -> basic id;rule: decl -> type id; rule: decls -> decls decl basicrule: type -> basic id;rule: decl -> type id; rule: decls -> decls decl basicrule: type -> basic id;rule: decl -> type id; rule: decls -> decls decl basicrule: type -> basic [num]rule: type -> type [ num ] id;rule: decl -> type id; rule: decls -> decls decl whilerule: stmts -> empty ( truerule: factor -> bool rule: unary -> factor rule: term -> unary )rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join { dorule: decls -> empty rule: stmts -> empty idrule: loc -> id = idrule: loc -> id +rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term numrule: factor -> num rule: unary -> factor rule: term -> unary ;rule: expr -> expr + term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc = bool while( idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] loc rule: unary -> factor rule: term -> unary rule: expr -> term idrule: loc -> id )rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr < expr rule: equality -> rel rule: join -> equality rule: bool -> join ;rule: stmt -> do stmt while (bool) rule: stmts -> stmts stmt do idrule: loc -> id = idrule: loc -> id -rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term numrule: factor -> num rule: unary -> factor rule: term -> unary ;rule: expr -> expr - term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc = bool while( idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] >rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term idrule: loc -> id )rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr > expr rule: equality -> rel rule: join -> equality rule: bool -> join ;rule: stmt -> do stmt while (bool) rule: stmts -> stmts stmt if (idrule: loc -> id >=rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term idrule: loc -> id )rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr >= expr rule: equality -> rel rule: join -> equality rule: bool -> join break ;rule: stmt -> break idrule: stmt -> if (bool) stmt rule: stmts -> stmts stmt rule: loc -> id = idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] ;rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc = bool rule: stmts -> stmts stmt idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] = idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] ;rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc = bool rule: stmts -> stmts stmt idrule: loc -> id [idrule: loc -> id ]rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc -> loc[bool] = idrule: loc -> id ;rule: factor -> loc rule: unary -> factor rule: term -> unary rule: expr -> term rule: rel -> expr rule: equality -> rel rule: join -> equality rule: bool -> join rule: loc = bool rule: stmts -> stmts stmt }rule: block -> '{' decls stmts '}' rule: stmt -> block rule: stmt -> while(bool) stmt rule: stmts -> stmts stmt }rule: block -> '{' decls stmts '}' rule: program -> block { i j v x a }