Professional Documents
Culture Documents
01 134201 011 9556776808 12042022 111907pm
01 134201 011 9556776808 12042022 111907pm
LAB-5
PART-1 Test your Lexical analyzer by: Part-1 Results:
Part-1 Results:
g. Test keywords and identifiers and symbol
table.
If21 if while while123 xyzif foryes
// abcdefgh
//jjhhtyuuiii (
)[]{},;:
([)]{,;]:
+ += ++ * == * * * ++ += ==<< >==
++++++******======➔>>>>>>>
Your task is to write a program which processes a file containing any number of
abovementioned keywords or operators. your program reads characters, groups them in an
internal buffer and if the characters in the buffer match with any of the above it prints a
message.
Strategy:
white space.
2- Read file character by character in a char variable.
1
Compiler Construction
3- Check whether the character read is a space, tab, newline, if so skip ot and read next
character, --- we skip space characters because C language uses space characters for
formatting purpose only.
4- Consume C style comments starting with // consume all character until newline char
found.
#include<iostream>
#include<conio.h>
#include <string>
#include <fstream>
using namespace std;
fstream AMINA;
enum tokentype { A_PLUS_PLUS, A_EQUALSTO, A_plus, A_MINUS_MINUS, A_MINUS_EQUALS,
A_MINUS, A_MULTIPLY_EQUALS, A_MULTIPLY, A_DIVIDE_EQUALS, A_DIVIDE,
A_MOD_EQUALS, A_MOD, A_EQUALSTO_EQUALSTO, A_EQUAL, A_NOT_EQUALS, A_NOT_EQUALS_TO,
A_AND_AND, A_AND, A_OR_OR, A_OR, A_right_opening_bracket,
A_left_opening_bracket, A_right_round_bracket, A_left_round_bracket, A_comma_op,
A_semicolon, A_GREATER_OR_EQUALTO, A_input, A_GREATER_THAN,
A_LESS_OR_EQUALTO, A_output, A_LESS_THAN, A_num, A_if, A_elseif, A_int, A_while, A_do,
A_for, A_return, A_float, A_double, A_string, A_variable };
struct AMINA_STRUCTURE
{
tokentype t;
string identifier;
string name = "";
int val = 0;
};
int maximum = 0;
string array1[10];
int insertsymboltable(string name)
{
int returnvalue;
int flag = 0;
for (int i = 0; i <= maximum; i++)
{
if (array1[i] == name)
{
flag = 0;
returnvalue = i;
return returnvalue;
}
else
{
flag = 1;
}
}
if (flag == 1)
{
array1[maximum] = name;
maximum++;
return maximum;
}
}
AMINA_STRUCTURE lexical()
{
AMINA_STRUCTURE A1;
char character;
//Check for operators
if (character == '+')
{
AMINA.get(character);
if (character == '+')
{
A1.t = A_PLUS_PLUS;
A1.name = "PLUS_PLUS";
A1.val;
return A1;
}
else if (character == '=')
{
A1.t = A_EQUALSTO;
A1.name = "A_EQUALSTO";
A1.val;
return A1;
}
else
{
A1.t = A_plus;
A1.name = "A_plus";
A1.val;
return A1;
}
}
else if (character == '-')
{
AMINA.get(character);
if (character == '-')
{
A1.t = A_MINUS_MINUS;
A1.name = "A_MINUS_MINUS";
A1.val;
return A1;
}
else if (character == '=')
{
A1.t = A_MINUS_EQUALS;
A1.name = "A_MINUS_EQUALS";
A1.val;
return A1;
}
else
{
A1.t = A_MINUS;
A1.name = "A_MINUS";
A1.val;
return A1;
}
}
else if (character == '*')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_MULTIPLY_EQUALS;
A1.name = "A_MULTIPLY_EQUALS";
A1.val;
return A1;
}
else
{
A1.t = A_MULTIPLY;
A1.name = "A_MULTIPLY";
A1.val;
return A1;
}
}
else if (character == '/')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_DIVIDE_EQUALS;
A1.name = "A_DIVIDE_EQUALS";
A1.val;
return A1;
}
else {
A1.t = A_DIVIDE;
A1.name = "A_DIVIDE";
A1.val;
return A1;
}
}
else if (character == '%')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_MOD_EQUALS;
A1.name = "A_MOD_EQUALS";
A1.val;
return A1;
}
else {
A1.t = A_MOD;
A1.name = "A_MOD";
A1.val;
return A1;
}
}
else if (character == '=')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_EQUALSTO_EQUALSTO;
A1.name = "A_EQUALSTO_EQUALSTO";
A1.val;
return A1;
}
else {
A1.t = A_EQUAL;
A1.name = "A_EQUAL";
A1.val;
return A1;
}
}
else if (character == '!')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_NOT_EQUALS;
A1.name = "A_NOT_EQUALS";
A1.val;
return A1;
}
else {
A1.t = A_NOT_EQUALS_TO;
A1.name = " A_NOT_EQUALS_TO";
A1.val;
return A1;
}
}
else if (character == '&')
{
AMINA.get(character);
if (character == '&')
{
A1.t = A_AND_AND;
A1.name = "A_AND_AND";
A1.val;
return A1;
}
else {
A1.t = A_AND;
A1.name = "A_AND";
A1.val;
return A1;
}
}
else if (character == '|')
{
AMINA.get(character);
if (character == '|')
{
A1.t = A_OR_OR;
A1.name = "A_OR_OR";
A1.val;
return A1;
}
else
{
A1.t = A_OR;
A1.name = "A_OR";
A1.val;
return A1;
}
}
else if (character == '{')
{
A1.t = A_right_opening_bracket;
A1.name = "A_right_opening_bracket";
A1.val;
return A1;
}
else if (character == '}')
{
A1.t = A_left_opening_bracket;
A1.name = "A_left_opening_bracket";
A1.val;
return A1;
}
else if (character == '(')
{
A1.t = A_right_round_bracket;
A1.name = "A_right_round_bracket";
A1.val;
return A1;
}
else if (character == ')')
{
A1.t = A_left_round_bracket;
A1.name = "A_left_round_bracket";
A1.val;
return A1;
}
else if (character == ',')
{
A1.t = A_comma_op;
A1.name = "A_comma_op";
A1.val;
return A1;
}
else if (character == ';')
{
A1.t = A_semicolon;
A1.name = "A_semicolon";
A1.val;
return A1;
}
else if (character == '>')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_GREATER_OR_EQUALTO;
A1.name = "A_GREATER_OR_EQUALTO";
A1.val;
return A1;
}
else if (character == '>')
{
A1.t = A_input;
A1.name = "A_input";
A1.val;
return A1;
}
else
{
A1.t = A_GREATER_THAN;
A1.name = "A_GREATER_THAN ";
A1.val;
return A1;
}
}
else if (character == '<')
{
AMINA.get(character);
if (character == '=')
{
A1.t = A_LESS_OR_EQUALTO;
A1.name = "A_LESS_OR_EQUALTO";
A1.val;
return A1;
}
else if (character == '<')
{
A1.t = A_output;
A1.name = "A_output";
A1.val;
return A1;
}
else
{
A1.t = A_LESS_THAN;
A1.name = "A_LESS_THAN";
A1.val;
return A1;
}
}
else if (isdigit(character))
{
string s;
do
{
s += character;
AMINA.get(character);
} while (isdigit(character));
AMINA.putback(character);
A1.t = A_num;
A1.name = "IS A NUMBER";
A1.val;
return A1;
}
else if (isalpha(character))
{
string s;
do
{
s += character;
AMINA.get(character);
} while (isalpha(character) || isdigit(character));
AMINA.putback(character);
if (s == "if")
{
A1.t = A_if;
A1.name = "..IF..";
A1.val;
return A1;
}
else if (s == "else if")
{
A1.t = A_elseif;
A1.name = "..ELSE_IF..";
A1.val;
return A1;
}
else if (s == "int")
{
A1.t = A_int;
A1.name = "..INT..";
A1.val;
return A1;
}
else if (s == "while")
{
A1.t = A_while;
A1.name = "..WHILE..";
A1.val;
return A1;
}
else if (s == "do")
{
A1.t = A_do;
A1.name = "..DO..";
A1.val;
return A1;
}
else if (s == "return")
{
A1.t = A_return;
A1.name = "..RETURN..";
A1.val;
return A1;
}
else if (s == "for")
{
A1.t = A_for;
A1.name = "..FOR..";
A1.val;
return A1;
}
else if (s == "float")
{
A1.t = A_float;
A1.name = "..FLOAT..";
A1.val;
return A1;
}
else if (s == "double")
{
A1.t = A_double;
A1.name = "..DOUBLE..";
A1.val;
return A1;
}
else if (s == "string")
{
A1.t = A_string;
A1.name = "..STRING..";
A1.val;
return A1;
}
else if (s == "variable")
{
A1.t = A_variable;
A1.name = "..variable..";
A1.val;
return A1;
}
else {
AMINA_STRUCTURE AM;
int val = insertsymboltable(s);
AM.t = A_variable;
AM.identifier = "A_variable,";
AM.identifier += val;
AM.val = NULL;
return AM;
}
}
}
int main()
{
AMINA.open("C:\\Users\\amina\\OneDrive\\Desktop\\AMINA.txt");
if (!AMINA)
{
cout << "file does not exist";
}
else
{
char character;
while (!AMINA.eof())
{
AMINA.get(character);
if (AMINA.eof())
{
break;
}
else if (character == ' ' || character == '\n' || character == '\
t')
{
continue;
}
else if (character == '/')
{
AMINA.get(character);
if (character == '/')
{
while (character != '\n')
{
AMINA.get(character);
continue;
}
}
}
system("pause");
return 0;
}
}
}
2