/* Program on lexical analysis */
#include<stdio.h>
#include<conio.h>
#define MAX 30
void main()
{
char str[MAX];
int state=0;
int i=0, j,
startid=0, endid, startcon, endcon;
clrscr();
for(j=0; j<MAX;
j++)
str[j]=NULL; //Initialise
NULL
printf("***
Program on Lexical Analysis ***");
printf("
Enter the string: ");
gets(str); //Accept input string
str[strlen(str)]='
';
printf("
Analysis:
");
while(str[i]!=NULL)
{
while(str[i]=='
') //To eliminate spaces
i++;
switch(state)
{
case 0:
if(str[i]=='i') state=1; //if
else
if(str[i]=='w') state=3; //while
else
if(str[i]=='d') state=8; //do
else
if(str[i]=='e') state=10; //else
else
if(str[i]=='f') state=14; //for
else
if(isalpha(str[i]) || str[i]=='_')
{
state=17;
startid=i;
}
//identifiers
else
if(str[i]=='<') state=19;
//relational '<' or '<='
else
if(str[i]=='>') state=21;
//relational
'>' or '>='
else
if(str[i]=='=') state=23;
//relational '==' or assignment '='
else
if(isdigit(str[i]))
{
state=25; startcon=i;
}
//constant
else
if(str[i]=='(') state=26;
//special characters '('
else
if(str[i]==')') state=27;
//special characters ')'
else
if(str[i]==';') state=28;
//special characters ';'
else
if(str[i]=='+') state=29;
//operator '+'
else
if(str[i]=='-') state=30;
//operator '-'
break;
//States for
'if'
case 1:
if(str[i]=='f') state=2;
else
{ state=17; startid=i-1; i--; }
break;
case 2:
if(str[i]=='(' || str[i]==NULL)
{
printf("
if :
Keyword");
state=0;
i--;
}
else
{ state=17; startid=i-2; i--; }
break;
//States for
'while'
case 3:
if(str[i]=='h') state=4;
else
{ state=17; startid=i-1; i--; }
break;
case 4:
if(str[i]=='i') state=5;
else
{ state=17; startid=i-2; i--; }
break;
case 5:
if(str[i]=='l') state=6;
else
{ state=17; startid=i-3; i--; }
break;
case 6:
if(str[i]=='e') state=7;
else { state=17; startid=i-4;
i--; }
break;
case 7:
if(str[i]=='(' || str[i]==NULL)
{
printf("
while :
Keyword");
state=0;
i--;
}
else
{ state=17; startid=i-5; i--; }
break;
//States for
'do'
case 8:
if(str[i]=='o') state=9;
else
{ state=17; startid=i-1; i--; }
break;
case 9:
if(str[i]=='{' || str[i]==' ' || str[i]==NULL || str[i]=='(')
{
printf("
do :
Keyword");
state=0;
i--;
}
break;
//States for
'else'
case 10:
if(str[i]=='l') state=11;
else
{ state=17; startid=i-1; i--; }
break;
case 11:
if(str[i]=='s') state=12;
else
{ state=17; startid=i-2; i--; }
break;
case 12:
if(str[i]=='e') state=13;
else
{ state=17; startid=i-3; i--; }
break;
case 13:
if(str[i]=='{' || str[i]==NULL)
{
printf("
else :
Keyword");
state=0;
i--;
}
else
{ state=17; startid=i-4; i--; }
break;
//States for
'for'
case 14:
if(str[i]=='o') state=15;
else
{ state=17; startid=i-1; i--; }
break;
case 15:
if(str[i]=='r') state=16;
else
{ state=17; startid=i-2; i--; }
break;
case 16: if(str[i]=='(' || str[i]==NULL)
{
printf("
for :
Keyword");
state=0;
i--;
}
else
{ state=17; startid=i-3; i--; }
break;
//States for
identifiers
case 17:
if(isalnum(str[i]) || str[i]=='_')
{
state=18; i++;
}
else
if(str[i]==NULL||str[i]=='<'||str[i]=='>'||str[i]=='('||str[i]==')'||str[i]==';'||str[i]=='='||str[i]=='+'||str[i]=='-')
state=18;
i--;
break;
case 18:
if(str[i]==NULL || str[i]=='<' || str[i]=='>' ||
str[i]=='(' || str[i]==')' || str[i]==';' || str[i]=='=' || str[i]=='+'
||str[i]=='-')
{
endid=i-1;
printf("
");
for(j=startid; j<=endid; j++)
printf("%c", str[j]);
printf(" :
Identifier");
state=0;
i--;
}
break;
//States for
relational operator '<' & '<='
case 19:
if(str[i]=='=') state=20;
else
if(isalnum(str[i]) || str[i]=='_')
{
printf("
< :
Relational operator");
i--;
state=0;
}
break;
case 20:
if(isalnum(str[i]) || str[i]=='_')
{
printf("
<= :
Relational operator");
i--;
state=0;
}
break;
//States for
relational operator '>' & '>='
case 21: if(str[i]=='=')
state=22;
else
if(isalnum(str[i]) || str[i]=='_')
{
printf("
> :
Relational operator");
i--;
state=0;
}
break;
case 22:
if(isalnum(str[i]) || str[i]=='_')
{
printf("
>= :
Relational operator");
i--;
state=0;
}
break;
//States for
relational operator '==' & assignment operator '='
case 23:
if(str[i]=='=') state=24;
else
{
printf("
= :
Assignment operator");
i--;
state=0;
}
break;
case 24:
if(isalnum(str[i]))
{
printf("
== :
Relational operator");
state=0;
i--;
}
break;
//States for
constants
case 25:
if(isalpha(str[i]))
{
printf("
*** ERROR ***
");
puts(str);
for(j=0; j<i; j++)
printf(" ");
printf("^");
printf("
Error at position %d
Alphabet cannot follow digit", i);
state=99;
}
else if(str[i]=='(' || str[i]==')' || str[i]=='<' || str[i]=='>'
|| str[i]==NULL || str[i]==';' || str[i]=='=')
{
endcon=i-1;
printf("
");
for(j=startcon; j<=endcon; j++)
printf("%c", str[j]);
printf(" : Constant");
state=0;
i--;
}
break;
//State for
special character '('
case 26:
printf("
( :
Special character");
startid=i;
state=0;
i--;
break;
//State for
special character ')'
case 27:
printf("
) :
Special character");
state=0;
i--;
break;
//State for
special character ';'
case 28:
printf("
; :
Special character");
state=0;
i--;
break;
//State for
operator '+'
case 29:
printf("
+ :
Operator");
state=0;
i--;
break;
//State for
operator '-'
case 30:
printf("
+ :
Operator");
state=0;
i--;
break;
//Error State
case 99: goto
END;
}
i++;
}
printf("
End of program");
END:
getch();
}
/* Output
Correct input
-------------
*** Program on Lexical Analysis ***
Enter the string: for(x1=0; x1<=10; x1++);
Analysis:
for : Keyword
( : Special
character
x1 : Identifier
= : Assignment
operator
0 : Constant
; : Special
character
x1 : Identifier
<= :
Relational operator
10 : Constant
; : Special
character
x1 : Identifier
+ : Operator
+ : Operator
) : Special
character
; : Special
character
End of program
Wrong input
-----------
*** Program on Lexical Analysis ***
Enter the string: for(x1=0; x1<=19x; x++);
Analysis:
for : Keyword
( : Special
character
x1 : Identifier
= : Assignment
operator
0 : Constant
; : Special
character
x1 : Identifier
<= :
Relational operator
Token cannot be generated
*/
No comments:
Post a Comment