Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

SHOAIB

01-134201-083
LAB -04

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>;

using namespace std;

typedef enum {
S_IF, S_THEN, S_ELSE, S_ADDITION_ASSIGNMENT, S_SUBTRACTION_ASSIGNMENT, S_NUMBER,
S_ID, S_SWITCH, S_CASE, S_FOR, S_WHILE, S_DO, S_INT, S_FLOAT, S_DOUBLE,
S_INCREMENT, S_DECREMENT, S_SEMICOLON, S_COLON, S_COMA, S_ALPHABET, S_DIVIDE ,
S_REMAINDER, S_GREATER_THEN_EQUAL, S_LESS_THEN_EQUAL,
S_GREATER_THEN, S_LESS_THEN, S_BINERY_OR, S_LOGICAL_OR, S_BINERY_AND,
S_LOGICAL_AND, S_DIVIDE_ASSIGNMENT, S_REMAINDER_ASSIGNMENT, S_MULTIPLY,
S_MULTIPLICATION_ASSIGNMENT, S_OUTPUT, S_INPUT, S_IS_EQUAL, S_EQUAL,
S_IS_NOT_EQUAL, S_NOT, S_BINERY_ONES_COMPLIMENT, S_OPENING_CURLY_BRACKET,
S_CLOSING_CURLY_BRACKET, S_OPENING_BRACKET, S_CLOSING_BRACKET, S_UNDERSCORE,
S_PLUSE, S_MINUS, S_LETTER
} TokenType;

struct S_Record
{
TokenType Type;
string Name;
int Value;
};

ifstream myfile;
S_Record Lexical_Analizer();

int main()
{
S_Record A;

myfile.open("lab4.txt");
A = Lexical_Analizer();

cout << "Token = " << A.Name << endl;


cout << "Entry Number = " << A.Type << endl;

system("pause");
return 0;
}

S_Record Lexical_Analizer()
{
S_Record Token;
char ch;

if (myfile.is_open())
{

while (myfile.good())
{
myfile.get(ch);
if (ch == '+') //All Plus Operators
{
myfile.get(ch);
if (ch == '+')
{
Token.Type = S_INCREMENT;
Token.Name = "Increment";
return Token;
}
else if (ch == '=')
{
Token.Type = S_ADDITION_ASSIGNMENT;
Token.Name = "Addition Assignment";
return Token;
}
else
{
Token.Type = S_PLUSE;
Token.Name = "Pluse";
return Token;
}
}
else if (ch == '-') //All Minus Operators
{
myfile.get(ch);
if (ch == '-')
{
Token.Type = S_DECREMENT;
Token.Name = "Decrement";
return Token;
}
else if (ch == '=')
{
Token.Type = S_SUBTRACTION_ASSIGNMENT;
Token.Name = "Subtraction Assignment";
return Token;
}
else
{
Token.Type = S_MINUS;
Token.Name = "Minus";
return Token;
}
}
else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) //Aphabets
{
string Key;
do
{
Key += ch;
myfile.get(ch);
} while (isalpha(ch));

if (Key == "if" || Key == "else" || Key == "while" || Key == "do" || Key == "goto" ||
Key == "struct" || Key == "case")
{
Token.Type = S_ALPHABET;
Token.Name = "Alphabet";
return Token;
}
else
{
Token.Type = S_LETTER;
Token.Name = "Letter";
return Token;
}

}
else if (ch >= '0' && ch <= '9') //Numbers
{
do
{
myfile.get(ch);
} while (isdigit(ch));

Token.Type = S_NUMBER;
Token.Name = "Number";
return Token;
Token.Value = ch;
}
else if (ch == '/') //All Divide Operators
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_DIVIDE_ASSIGNMENT;
Token.Name = "Divide Assignment";
return Token;
}
else
{
Token.Type = S_DIVIDE;
Token.Name = "Divide";
return Token;
}
}
else if (ch == '%') //All Remainder Operator
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_REMAINDER_ASSIGNMENT;
Token.Name = "Remainder Assignment";
return Token;
}
else
{
Token.Type = S_REMAINDER;
Token.Name = "Remainder";
return Token;
}
}
else if (ch == '*') //All Multiplication Opertor
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_MULTIPLICATION_ASSIGNMENT;
Token.Name = "Multiplication Assignment";
return Token;
}
else
{
Token.Type = S_MULTIPLY;
Token.Name = "Multiply";
return Token;
}
}
else if (ch == '<') //All Less than Operators
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_LESS_THEN_EQUAL;
Token.Name = "Less Then Equal";
return Token;
}
else if (ch == '<')
{
Token.Type = S_OUTPUT;
Token.Name = "Output";
return Token;
}
else
{
Token.Type = S_LESS_THEN;
Token.Name = "Less Then";
return Token;
}
}
else if (ch == '>') //All Greater than Operator
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_GREATER_THEN_EQUAL;
Token.Name = "Greater Then Equal";
return Token;
}
else if (ch == '>')
{
Token.Type = S_INPUT;
Token.Name = "Input";
return Token;
}
else
{
Token.Type = S_GREATER_THEN;
Token.Name = "Greater Then";
return Token;
}
}
else if (ch == '=') //All Equal Operators
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_IS_EQUAL;
Token.Name = "Is Equal";
return Token;
}
else
{
Token.Type = S_EQUAL;
Token.Name = "Equal";
return Token;
}
}
else if (ch == '!') //All Not Operator
{
myfile.get(ch);
if (ch == '=')
{
Token.Type = S_IS_NOT_EQUAL;
Token.Name = "Is Not Equal";
return Token;
}
else
{
Token.Type = S_NOT;
Token.Name = "Not";
return Token;
}
}
else if (ch == '|') //Logical Or Operator
{
myfile.get(ch);
if (ch == '|')
{
Token.Type = S_LOGICAL_OR;
Token.Name = "Logical Or";
return Token;
}
else
{
Token.Type = S_BINERY_OR;
Token.Name = "Binery Or";
return Token;
}
}
else if (ch == '&') //Logical And Operator
{
myfile.get(ch);
if (ch == '&')
{
Token.Type = S_LOGICAL_AND;
Token.Name = "Logical And";
return Token;
}
else
{
Token.Type = S_BINERY_AND;
Token.Name = "Binery And";
return Token;
}
}
else if (ch == '~')
{
Token.Type = S_BINERY_ONES_COMPLIMENT;
Token.Name = "Binery One's Compliment";
return Token;
}
else if (ch == '{')
{
Token.Type = S_OPENING_CURLY_BRACKET;
Token.Name = "Opening Curly Bracket";
return Token;
}
else if (ch == '}')
{
Token.Type = S_CLOSING_CURLY_BRACKET;
Token.Name = "Closing Curly Bracket";
return Token;
}
else if (ch == '(')
{
Token.Type = S_OPENING_BRACKET;
Token.Name = "Opening Bracket";
return Token;
}
else if (ch == ')')
{
Token.Type = S_CLOSING_BRACKET;
Token.Name = "Closing Bracket";
return Token;
}
else if (ch == '_')
{
Token.Type = S_UNDERSCORE;
Token.Name = "Underscore";
return Token;
}
else if (ch == ';')
{
Token.Type = S_SEMICOLON;
Token.Name = "Semicolon";
return Token;
}
else if (ch == ',')
{
Token.Type = S_COMA;
Token.Name = "Coma";
return Token;
}
else if (ch == ':')
{
Token.Type = S_COLON;
Token.Name = "Colon";
return Token;
}
}
myfile.close();
}
else
cout << "Error!";
return S_Record();
}

You might also like