Question: CAN YOU EXPLAIN ME HOW TO RUN THIS CODE PLEASE C++ #include #include #include #include using namespace std; enum token { cin_sy, cout_sy, cin_op_sy, cout_op_sy,

CAN YOU EXPLAIN ME HOW TO RUN THIS CODE PLEASE C++

#include

#include

#include

#include

using namespace std;

enum token {

cin_sy, cout_sy, cin_op_sy, cout_op_sy, lparn_sy, rparn_sy, plus_sy, mult_sy, id, int_sy, real_sy,

error_sy, end_source_sy

};

class parser {

private:

ifstream f;

token curr_token;

token check_reserved(string s) {

if (s == "cin") return cin_sy;

else if (s == "cout") return cout_sy;

else return id;

}

token get_token() {

char ch;

string s;

int state = 0;

while (state >= 0 && state <= 11 && !f.eof()) {

switch (state) {

case 0:

f.get(ch);

if (f.eof()) return end_source_sy;

else if (isspace(ch)) {

s = ch; state = 0;

}

else if (isdigit(ch)) {

s = ch; state = 1;

}

else if (ch == '.') {

s = ch; state = 2;

}

else if (isalpha(ch)) {

s = ch; state = 4;

}

else if (ch == '<') state = 5;

else if (ch == '>') state = 6;

else if (ch == '+') state = 7;

else if (ch == '*') state = 8;

else if (ch == '(') state = 9;

else if (ch == ')') state = 10;

else state = 11;

break;

case 1:

f.get(ch);

if (isdigit(ch)) {

s += ch; state = 1;

}

else if (ch == '.') state = 3;

else { f.putback(ch); return int_sy; }

break;

case 2:

f.get(ch);

if (isdigit(ch)) {

s += ch; state = 2;

}

else

{

f.putback(ch);

return real_sy;

}

break;

case 3:

f.get(ch);

if (isdigit(ch)) { s += ch; state = 3; }

else

{

f.putback(ch);

return real_sy;

}

break;

case 4:

f.get(ch);

if (isalnum(ch)) { s + ch; state = 4; }

else

{

f.putback(ch);

return check_reserved(s);

}

break;

case 5:

f.get(ch);

if (ch == '<') return cout_op_sy;

else return error_sy;

break;

case 6:

f.get(ch);

if (ch == '<') return cin_op_sy;

else return error_sy;

break;

case 7:

return plus_sy; break;

case 8:

return mult_sy; break;

case 9:

return lparn_sy; break;

case 10:

return rparn_sy; break;

case 11:

return error_sy; break;

}

}

return end_source_sy;

}

string name (token t) {

switch (t) {

case cin_sy: return "cin token"; break;

case cout_sy: return "cout token"; break;

case cin_op_sy: return ">> token"; break;

case cout_op_sy: return "<< token"; break;

case id: return "identifier"; break;

case int_sy: return "int token"; break;

case real_sy: return "real token"; break;

case plus_sy: return "+ token"; break;

case mult_sy: return "* token"; break;

case lparn_sy: return "( token"; break;

case rparn_sy: return ") token"; break;

case error_sy: return "error token"; break;

case end_source_sy: return "End of file"; break;

}

return "error token";

}

public:

parser (string filename) {

f.open(filename.c_str());

}

~parser () {

f.close();

}

void match(token terminal) {

if (curr_token == terminal)

cout << name(curr_token) << "is matched" << endl;

else

syntax_error(curr_token);

curr_token = get_token();

}

void syntax_error(token terminal) {

cout << name(terminal) << "is not Expected ";

}

void sample_parser() {

curr_token = get_token();

program();

match(end_source_sy);

}

void program() {

if (curr_token == cin_sy) {

match(cin_sy);

match(cin_op_sy);

expr_seq();

}

else if (curr_token == cout_sy) {

match(cout_sy);

match(cout_op_sy);

expr_seq();

}

else

syntax_error(curr_token);

}

void expr_seq () {

expr();

while (curr_token == id || curr_token == int_sy || curr_token == real_sy || curr_token == lparn_sy || curr_token == rparn_sy) {

expr();

}

}

void expr() {

switch (curr_token) {

case id: match(id); break;

case int_sy: match(int_sy); break;

case real_sy: match(real_sy); break;

case lparn_sy:

match(lparn_sy);

if (curr_token == plus_sy) {

match(plus_sy);

expr_seq();

match(rparn_sy);

}

else if (curr_token == mult_sy) {

match(mult_sy);

expr_seq();

match(rparn_sy);

}

else {

syntax_error(curr_token);

}

break;

}

}

};

int main()

{

string name;

cout << "enter file name:"; cin >> name;

parser p(name);

p.sample_parser();

p.~parser();

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!