I have to code in c++, and I’m given these filesproject 2.cc/* * Copyright (C) Mohsen Zohrevandi, 2017 * * Do not share this file with anyone */#include #include #include using namespace std;int main (int argc, char* argv[]){ int task; if (argc < 2) { cout << "Error: missing argumentn"; return 1; } /* Note that by convention argv[0] is the name of your executable, and the first argument to your program is stored in argv[1] */ task = atoi(argv[1]); // TODO: Read the input grammar at this point from standard input /* Hint: You can modify and use the lexer from previous project to read the input. Note that there are only 4 token types needed for reading the input in this project. WARNING: You will need to modify lexer.cc and lexer.h to only support the tokens needed for this project if you are going to use the lexer. */ switch (task) { case 1: cout << "decl idList idList1 colon ID COMMA n"; break; case 2: // TODO: perform task 2. break; case 3: // TODO: perform task 3. break; case 4: // TODO: perform task 4. break; case 5: // TODO: perform task 5. break; default: cout << "Error: unrecognized task number " << task << "n"; break; } return 0;}-----------------------------------------------------------------------------------------------lexer.h#ifndef __LEXER__H__#define __LEXER__H__#include #include #include “inputbuf.h”// Lexer modified for FIRST & FOLLOW projecttypedef enum { END_OF_FILE = 0, ARROW, HASH, DOUBLEHASH, ID, ERROR } TokenType;class Token { public: void Print(); std::string lexeme; TokenType token_type; int line_no;};class LexicalAnalyzer { public: Token GetToken(); TokenType UngetToken(Token); LexicalAnalyzer(); private: std::vector tokens; int line_no; Token tmp; InputBuffer input; bool SkipSpace(); Token ScanId();};#endif //__LEXER__H__———————————————————————————————–lexer.cc#include #include #include #include #include #include “lexer.h”#include “inputbuf.h”using namespace std;// Lexer modified for FIRST & FOLLOW projectstring reserved[] = { “END_OF_FILE”, “ARROW”, “HASH”, “DOUBLEHASH”, “ID”, “ERROR” };void Token::Print(){ cout << "{" << this->lexeme << " , " << reserved[(int) this->token_type] << " , " << this->line_no << "}n";}LexicalAnalyzer::LexicalAnalyzer(){ this->line_no = 1; tmp.lexeme = “”; tmp.line_no = 1; tmp.token_type = ERROR;}bool LexicalAnalyzer::SkipSpace(){ char c; bool space_encountered = false; input.GetChar(c); line_no += (c == ‘n’); while (!input.EndOfInput() && isspace(c)) { space_encountered = true; input.GetChar(c); line_no += (c == ‘n’); } if (!input.EndOfInput()) { input.UngetChar(c); } return space_encountered;}Token LexicalAnalyzer::ScanId(){ char c; input.GetChar(c); if (isalpha(c)) { tmp.lexeme = “”; while (!input.EndOfInput() && isalnum(c)) { tmp.lexeme += c; input.GetChar(c); } if (!input.EndOfInput()) { input.UngetChar(c); } tmp.line_no = line_no; tmp.token_type = ID; } else { if (!input.EndOfInput()) { input.UngetChar(c); } tmp.lexeme = “”; tmp.token_type = ERROR; } return tmp;}// you should unget tokens in the reverse order in which they// are obtained. If you execute//// t1 = lexer.GetToken();// t2 = lexer.GetToken();// t3 = lexer.GetToken();//// in this order, you should execute//// lexer.UngetToken(t3);// lexer.UngetToken(t2);// lexer.UngetToken(t1);//// if you want to unget all three tokens. Note that it does not// make sense to unget t1 without first ungetting t2 and t3//TokenType LexicalAnalyzer::UngetToken(Token tok){ tokens.push_back(tok);; return tok.token_type;}Token LexicalAnalyzer::GetToken(){ char c; // if there are tokens that were previously // stored due to UngetToken(), pop a token and // return it without reading from input if (!tokens.empty()) { tmp = tokens.back(); tokens.pop_back(); return tmp; } SkipSpace(); tmp.lexeme = “”; tmp.line_no = line_no; input.GetChar(c); switch (c) { case ‘-‘: input.GetChar(c); if (c == ‘>’) { tmp.token_type = ARROW; } else { if (!input.EndOfInput()) { input.UngetChar(c); } tmp.token_type = ERROR; } return tmp; case ‘#’: input.GetChar(c); if (c == ‘#’) { tmp.token_type = DOUBLEHASH; } else { if (!input.EndOfInput()) { input.UngetChar(c); } tmp.token_type = HASH; } return tmp; default: if (isalpha(c)) { input.UngetChar(c); return ScanId(); } else if (input.EndOfInput()) tmp.token_type = END_OF_FILE; else tmp.token_type = ERROR; return tmp; }}———————————————————————————————–inputbuf.h#ifndef __INPUT_BUFFER__H__#define __INPUT_BUFFER__H__#include class InputBuffer { public: void GetChar(char&); char UngetChar(char); std::string UngetString(std::string); bool EndOfInput(); private: std::vector input_buffer;};#endif //__INPUT_BUFFER__H__———————————————————————————————–inputbuffer.cc#include #include #include #include #include #include “inputbuf.h”using namespace std;bool InputBuffer::EndOfInput(){ if (!input_buffer.empty()) return false; else return cin.eof();}char InputBuffer::UngetChar(char c){ if (c != EOF) input_buffer.push_back(c);; return c;}void InputBuffer::GetChar(char& c){ if (!input_buffer.empty()) { c = input_buffer.back(); input_buffer.pop_back(); } else { cin.get(c); }}string InputBuffer::UngetString(string s){ for (unsigned i = 0; i < s.size(); i++) input_buffer.push_back(s[s.size()-i-1]); return s;}----------------------------------------------------------------------Please help. I have no clue at the moment,Im only asking for case 1.I can figure out the rest.