#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int isIdent(char ch);
int isOper(char ch);
int isDel(char ch);
int isKey(char *str);
void final();
void removeDuplicate();
char op[8]={'+','-','*','/','=','<','>','%'};
char del[9]={'}','{',';','(',')','[',']',',','#'};
char *key[]={"int","void","main","char","float","FILE"};
int idi=0,idj=0,j,opi=0,opj=0,liti=0,deli=0;
int uniqIdenti=0,uniqOpi=0,uniqDeli=0,keyi=0,consi=0;
char uniqIdent[20][20],uniqOp[20][20],uniqDel[20],keyword[20][20];
char ident[20][20],literal[20][30],lit[30],oper[20][20],delem[20],constant[20][20];
void lexAnalysis(char *str)
{
int i=0,l;
while(str[i]!='\0')
{
if(isIdent(str[i])) // Check For Identifier
{
while(isIdent(str[i]))
{
ident[idi][idj++]=str[i++];
}
ident[idi][idj]='\0';
idi++,idj=0;
}
else
if(str[i]=='"') // for literals
{
l=0;
lit[l++]=str[i];
for(j=i+1;str[j]!='"';j++)
{
lit[l++]=str[j];
}
lit[l++]=str[j];
lit[l]='\0';
strcpy(literal[liti++],lit);
i=j+1;
}
else
if(isOper(str[i])) // Check For Operator
{
while(isOper(str[i]))
{
oper[opi][opj++]=str[i++];
}
oper[opi][opj]='\0';
opi++,opj=0;
}
else
if(isDel(str[i])) // Check For Delimeter
{
while(isDel(str[i]))
{
delem[deli++]=str[i++];
}
delem[deli]='\0';
}
else
{
i++;
}
}
}
int isIdent(char ch) // Check for Identifier
{
if(isalpha(ch)||ch=='_'||isdigit(ch)||ch=='.')
return 1;
else
return 0;
}
int isOper(char ch) // Check for Operator
{
int f=0,i;
for(i=0;i<8&&!f;i++)
{
if(ch==op[i])
f=1;
}
return f;
}
int isDel(char ch) // Check for Delimeter
{
int f=0,i;
for(i=0;i<9&&!f;i++)
{
if(ch==del[i])
f=1;
}
return f;
}
int isKey(char *str) // Check for keyword
{
int i,f=0;
for(i=0;i<6;i++)
{
if(!strcmp(key[i],str))
f=1;
}
return f;
}
void removeDuplicate()
{
int i,j,flag=1;
for(i=0;i<deli;i++) // Removing duplicate delemeters
{
flag=1;
for(j=0;j<uniqDeli;j++)
{
if(delem[i]==uniqDel[j])
{
flag=0; break;
}
}
if(flag)
uniqDel[uniqDeli++]=delem[i];
}
uniqDel[uniqDeli]='\0';
for(i=0;i<idi;i++) // Removing duplicate identifiers
{
flag=1;
for(j=0;j<uniqIdenti;j++)
{
if(!strcmp(ident[i],uniqIdent[j]))
{
flag=0; break;
}
}
if(flag)
strcpy(uniqIdent[uniqIdenti++],ident[i]);
}
for(i=0;i<opi;i++) // Removing duplicate operator
{
flag=1;
for(j=0;j<uniqOpi;j++)
{
if(!strcmp(oper[i],uniqOp[j]))
{
flag=0; break;
}
}
if(flag)
strcpy(uniqOp[uniqOpi++],oper[i]);
}
}
void final()
{
int i=0;
idi=0;
for(i=0;i<uniqIdenti;i++)
{
if(isKey(uniqIdent[i])) // Identifying Keyword
strcpy(keyword[keyi++],uniqIdent[i]);
else
if(isdigit(uniqIdent[i][0])) // Identifying constants
strcpy(constant[consi++],uniqIdent[i]);
else
strcpy(ident[idi++],uniqIdent[i]); // Identifier
}
}
void outputs() //Printing the Outputs
{
int i;
printf("\n\tDelemeter are : \n");
for(i=0;i<uniqDeli;i++)
printf("\t%c\n",uniqDel[i]);
printf("\n\tOperators are : \n");
for(i=0;i<uniqOpi;i++)
{
printf("\t");
puts(uniqOp[i]);
}
printf("\n\tIdentifiers are : \n");
for(i=0;i<idi;i++)
{
printf("\t");
puts(ident[i]);
}
printf("\n\tKeywords are : \n");
for(i=0;i<keyi;i++)
{
printf("\t");
puts(keyword[i]);
}
printf("\n\tConstants are :\n");
for(i=0;i<consi;i++)
{
printf("\t");
puts(constant[i]);
}
printf("\n\tLiterals are :\n");
for(i=0;i<liti;i++)
{
printf("\t");
puts(literal[i]);
}
}
int main()
{
char filename[15];
FILE *file;
char line [ 128 ];
printf("Enter The File Name :\n");
scanf("%s",&filename);
file = fopen ( filename, "r" );
if ( file != NULL )
{
/* or other suitable maximum line size */
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
lexAnalysis(line);
}
fclose( file );
removeDuplicate();
final();
outputs();
}
else
{
perror( filename ); /* If file doesn't exist */
}
}Lexical Analyzer Program in C
Subscribe to:
Posts (Atom)


No comments:
Post a Comment