You are on page 1of 8

SHOAIB

01-134201-083
BSCS-5B

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
using namespace std;

ifstream file("LAB8.txt");
int counter = 0;
bool SB_Factor();
bool A_T();
char c;
typedef enum
{

SA, S_ORB, S_CRB, S_OCB, S_CCB, S_PLUS, S_MIN, S_DIV, S_MUL, COLON, COMSA, SEMICOLON,
INC, DEC, Equal, DoubleEqual, AND, OR, LessEqual, GreaterEqual, PlusEqual, LessThen, GreaterThen, identifier,
Number,
IFidentifier, WHILEidentifier, DOidentifier, ELSEidentifier, ENDidentifier, SWITCHidentifier,
BEGINidentifier, BREAKidentifier, INTidentifier, SAINidentifier
}tokenrecord;

struct S_record
{
tokenrecord t;
string a;
};

struct symboltable
{
int id;
string identifier;
};

symboltable arr[50];
int insert(string str)
{
for (int i = 0; i <= counter; i++)
{
if (arr[i].identifier == str)
{
return arr[i].id;
}
}
counter++;
arr[counter].identifier = str;
arr[counter].id = counter;
return arr[counter].id;
}

S_record lexical()
{
S_record obj;
if (file.is_open())
{
while (file.get(c))
{
cout << c << " ";
if (isspace(c))
{

}
else
{
if (c == '(')
{
obj.t = S_ORB;
obj.a = "Opening-Round-Bracket";
return obj;
}
else if (c == ')')
{
obj.t = S_CRB;
obj.a = "Closing-Round-Bracket";
return obj;
}
else if (c == '{')
{
obj.t = S_OCB;
obj.a = "Opening-Curly-Bracket";
return obj;
}
else if (c == '}')
{
obj.t = S_CCB;
obj.a = "Closing-Curly-Bracket";
return obj;
}
else if (c == ',')
{
obj.t = COMSA;
obj.a = "ComSA";
return obj;
}
else if (c == '=')
{
file.get(c);
if (c == '=')
{
obj.t = DoubleEqual;
obj.a = "Double-Equal";
return obj;
}
else
{
file.putback(c);
obj.t = Equal;
obj.a = "Equal";
return obj;
}
}
else if (c == '&')
{
obj.t = AND;
obj.a = "And";
return obj;

}
else if (c == '|')
{
obj.t = OR;
obj.a = "OR";
return obj;
}
else if (c == ';')
{
obj.t = SEMICOLON;
obj.a = "Semi-Colon";
return obj;
}
else if (c == ':')
{
obj.t = COLON;
obj.a = "Colon";
return obj;
}
else if (c == '+')
{
file.get(c);
if (c == '+')
{
obj.t = INC;
obj.a = "Increment";
return obj;
}
else if (c == '=')
{
obj.t = PlusEqual;
obj.a = "Plus-Equal";
return obj;
}
else
{
file.putback(c);
obj.t = S_PLUS;
obj.a = "Plus";
return obj;
}
}
else if (c == '-')
{
file.get(c);
if (c == '-')
{
obj.t = DEC;
obj.a = "Decrement";
return obj;
}
else
{
file.putback(c);
obj.t = S_MIN;
obj.a = "Minus";
return obj;
}
}
else if (c == '*')
{
obj.t = S_MUL;
obj.a = "Multiply";
return obj;
}
else if (c == '/')
{
file.get(c);
if (c == '/')
{
while (c != '\n')
{
file.get(c);
}
}
else
{
obj.t = S_DIV;
obj.a = "Divide";
return obj;
}
}
else if (c == '<')
{
file.get(c);
if (c == '=')
{
obj.t = LessEqual;
obj.a = "Less-Equal";
return obj;
}
else
{
file.putback(c);
obj.t = LessThen;
obj.a = "Less-Then";
return obj;
}
}
else if (c == '>')
{
file.get(c);
if (c == '=')
{
obj.t = GreaterEqual;
obj.a = "Greater-Equal";
return obj;
}
else
{
file.putback(c);
obj.t = GreaterThen;
obj.a = "Greater-Then";
return obj;
}
}
else if (c == '/')
{

else if (isdigit(c))
{
string str;
str += c;
while (file.get(c))
{
if (isdigit(c))
{
str += c;
file.get(c);
}
else
break;
}
file.putback(c);
obj.t = Number;
obj.a = "DIGIT";
return obj;
}

else if (isalpha(c) || c == '_')


{
string str;
while (isalpha(c) || c == '_')
{
str += c;
file.get(c);
}
file.putback(c);
if (str == "if")
{
obj.t = identifier;
obj.a = "identifier";
return obj;
}

else if (str == "while")


{
obj.t = WHILEidentifier;
obj.a = "WHILE-identifier";
return obj;
}
else if (str == "do")
{
obj.t = DOidentifier;
obj.a = "DO-videntifier";
return obj;
}
else if (str == "break")
{
obj.t = BREAKidentifier;
obj.a = "identifier";
return obj;
}
else if (str == "switch")
{
obj.t = SWITCHidentifier;
obj.a = "SWITCH-identifier";
return obj;
}
else if (str == "else")
{
obj.t = ELSEidentifier;
obj.a = "ELSE-identifier";
return obj;
}
else if (str == "begin")
{
obj.t = BEGINidentifier;
obj.a = "BEGIN-identifier";
return obj;
}
else if (str == "end")
{
obj.t = ENDidentifier;
obj.a = "END-identifier";
return obj;
}
else if (str == "int")
{
obj.t = INTidentifier;
obj.a = "INT-identifier";
return obj;
}
else if (str == "SAin")
{
obj.t = SAINidentifier;
obj.a = "SAIN-identifier";
return obj;
}
else
{
int ss = insert(str);
obj.t = identifier;
obj.a = "ALPHABET";
}
}
}
}
}
obj.t = SA;
obj.a = "SA";
return obj;
}
bool S_Exp()
{
S_record Token;
do
{
if (!A_T())
{
return false;
}
Token = lexical();
} while (Token.t == S_PLUS);
return true;
}

bool A_T()
{
S_record Token;
do
{
if (!SB_Factor())
{
return false;
}
Token = lexical();
} while (Token.t == S_MUL);

return true;
}

bool SB_Factor()
{
S_record Token;
Token = lexical();
if (Token.t == Number)
{
return true;
}
else if (Token.t == identifier)
{
return true;
}
else if (Token.t == S_ORB)
{
if (S_Exp())
{
Token = lexical();

if (Token.t == S_CRB)
{
return true;
}
}
}
return false;
}
int SAin()
{
cout << " " << endl;
cout << " ____________ " << endl;
cout << " | |" << endl;
cout << " | SHOAIB |" << endl;
cout << " | 01-134201-083 |" << endl;
cout << " |____________|" << endl;
cout << " " << endl;

if (S_Exp())
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}

return 0;
}

You might also like