Thursday, January 21, 2010

LEXICAL ANALYSER

#include stdio.h
#include conio.h
#include string.h
#include ctype.h

/*SYMBOL TABLE*/

struct symbol_table
{
char * token_type;
const char * att;
}symbol[30];
/*GLOBAL VARIABLES*/

int index=0,look=0;
char st1[10],st2[10];
/*LOOK UP TABLE*/

int lookup(char st[])
{
int i;
for(i=1;i<=30;i++)
{
if(!strcmp(symbol[i].att,st))
return i;
else if(!i)
return 0;
}
return -1;
}

void insert(char st1[],const char st2[])
{
symbol[index].token_type=(char *)malloc(strlen(st1));
symbol[index].att=(char *)malloc(strlen(st2));
strcpy(symbol[index].token_type,st1);
strcpy(symbol[index].att,st2);
index++;
}


int main()
{
int i,j,k,val,flag,ln=0,x,y=0;
char c,ch,chr[50];
char res[10][10]={"if","else","while","do","for"};
clrscr();
printf("Enter the string : ");
while(1)
{
j=0;
flag=0;
chr[0]='\0';
c=getchar();
if(c=='$')
break;
else if((c==' ')||(c=='\t'));
else if(c=='\n')
ln++;
else if(isdigit(c))
{
while(isdigit(c))
{
chr[j]=c;
j++;
c=getchar();
}
chr[j]='\0';
ungetc(c,stdin);
insert("Num",chr);
printf("\n",chr);
}
else if(isalpha(c))
{
while(isalpha(c))
{
chr[j]=c;
j++;
c=getchar();
}
chr[j]='\0';
for(k=0;k<5;k++)
if(!strcmp(chr,res[k]))
{
insert(chr,res[k]);
flag=1;
printf("\n",res[k]);
break;
}
if(!flag)
{
look=lookup(chr);
if(look!=0)
{
insert("Id",chr);
printf("\n",chr);
}
else
{
printf("\n",chr);
insert("Id",chr);
index++;
}
}
ungetc(c,stdin);
}
else if(c=='>')
{
chr[0]=c;
chr[1]='\0';
c=getchar();
if(c=='=')
{
chr[1]=c;
chr[2]='\0';
printf("\n",chr);
insert("GTE",chr);
}
else
{ ungetc(c,stdin);
printf("\n",chr);
insert("GT",chr);
}
}
else if(c=='<')
{
chr[0]=c;
chr[1]='\0';
c=getchar();
if(c=='>')
{
chr[1]=c;
chr[2]='\0';
printf("\n",chr);
insert("NE",chr);
}
else if(c=='=')
{
chr[1]=c;
chr[2]='\0';
printf("\n",chr);
insert("LTE",chr);
}
else
{
ungetc(c,stdin);
printf("\n",chr);
insert("LT",chr);
}
}
else if(c=='=')
{
chr[0]=c;
chr[1]='\0';
c=getchar();
if(c=='=')
{
chr[1]=c;
chr[2]='\0';
printf("\n",chr);
insert("EQU",chr);
}
else
{
printf("\n",chr);
insert("ASS_OP",chr);
ungetc(c,stdin);
}
}
else
{
switch(c)
{
case '+':
chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("PLUS",chr);
break;
case '-':

chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("MINUS",chr);
break;
case '*':

chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("MULTI",chr);
break;
case '/':

chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("DIVISION",chr);
break;
case '%':

chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("MODULOS",chr);
break;
case '(':
chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert("(",chr);
break;
case ')':
chr[0]=c;
chr[1]='\0';
printf("\n",c);
insert(")",chr);
break;
default:
printf("\n",chr);
}
}
}

printf("\n\t\tSYMBOL TABLE");
printf("\n..............................................\n");
printf("%s\t\t%s\t\t%s","TOKEN","TOKEN_TYPE","TOKEN_VALUE");
printf("\n...............................................\n");
for(k=0;k {
y=0;
for(x=0;x if(!strcmp(symbol[k].att,symbol[x].att))
{
y=1;
printf("%s\t\t%s\t\t%d\n",symbol[k].att,symbol[k].token_type,x);
break;
}
if(y==0)
{
printf("%s\t\t%s\t\t%d\n",symbol[k].att,symbol[k].token_type,k);
}
}
getch();
return 0;
}


OUTPUT:

Enter the string : if(a==b) a+b$









SYMBOL TABLE
............................................…………………………………..
TOKEN TOKEN_TYPE TOKEN_VALUE
.............................................…………………………………
if if 0
( ( 1
a Id 2
== EQU 3
b Id 4
) ) 5
a Id 2
+ PLUS 7
b Id 4

No comments:

Post a Comment

  © For Movies Click Here Softwares by For Games Click Here 2010

Back to TOP