Tuesday, April 7, 2009

source code

#include
#include
#include
#include
#include
#define sz 128
#define none -1
#define eos '\0'
#define num 257
#define key 258
#define id 259
#define done 260
#define MAX 999
char lexemes[MAX];
char buf[sz];
int lc=-1;
int le=0;
int tval=done;
int ln=1;
int la;
struct entry
{
char *lp;
int token;
}
st[100];
struct entry
keywords[]={"if",key,"else",key,"for",key,"int",key,"float",key,"double",key,"char",key,"struct",key,"return",key,0,0};
void mess(char *m)
{
fprintf(stderr,"line %d:%s",ln,m);
exit(1);
}
int lup(char s[])
{
int k;
for(k=le;k>0;k=k-1)
if(strcmp(st[k].lp,s)==0)
return k;
return 0;
}
int insert(char s[],int tok)
{
int len;
len=strlen(s);
if(le+1>=MAX)
mess("Symbol table is full");
if(lc+len+1>=MAX)
mess("lexemes array is full");
le=le+1;
st[le].token=tok;
st[le].lp=&lexemes[lc+1];
lc=lc+len+1;
strcpy(st[le].lp,s);
return le;
}
void initialise()
{
struct entry *pt;
for(pt=keywords;pt->token;pt++)
insert(pt->lp,pt->token);
}
int lexer()
{
int t;
int val,i=0;
while(1)
{
t=getchar();
if(t==' '||t=='\t');
else if(t=='\n')
ln=ln+1;
else if(isdigit(t))
{
ungetc(t,stdin);
scanf("%d",&tval);
return num;
}
else if(isalpha(t))
{
while(isalnum(t))
{
buf[i]=t;
t=getchar();
i=i+1;
if(i>sz)
mess("compiler error");
}
buf[i]=eos;
if(t!=EOF)
ungetc(t,stdin);
val=lup(buf);
if(val==0)
val=insert(buf,id);
tval=val;
return st[val].token;
}
else if(t==EOF)
return done;
else
{
tval=none;
return t;
}
}
}
void match(int t)
{
if(la==t)
la=lexer();
else
mess("Syntax error");
}
void display(int t,int tval)
{
if(t=='+'||t=='-'||t=='*'||t=='/')
printf("\n Arithmetic Operator:%c",t);
else if(t==num)
printf("\n Number :%d",tval);
else if(t==id)
printf("\n identifier:%d",st[tval].lp);
else
printf("\n Token %d token value %d",t,tval);
}
void f()
{
void e();
switch(la)
{
case '(':
match('(');
e();
match(')');
break;
case num:
display(num,tval);
match(num);
break;
case id:
display(id,tval);
match(id);
break;
mess("\n syntax error");
}
}
void tt()
{
int t;
f();
while(1)
{
switch(la)
{
case '*':
t=la;
match(la);
f();
display(t,none);
continue;
case '/':
t=la;
match(la);
f();
display(t,none);
continue;
default:
return;
}
}
}
void e()
{
int t;
tt();
while(1)
{
switch(la)
{
case '+':
t=la;
match(la);
tt();
display(t,none);
continue;
case '-':
t=la;
match(la);
tt();
display(t,none);
continue;
default:
return;
}
}
}
void parser()
{
la=lexer();
while(la!=done)
{
e();
match(';');
}
}
void main()
{
char ans;
clrscr();
printf("\n program for recursive descent parser...");
initialise();
printf("\n enter the expression \n And place;at the end \n press ctrl z to terminate");
parser();
}

Output:

program for recursive descent parser…
enter the expression
And place;at the end
press ctrl z to terminate
(2*3)/(4+8)*(9-5);
Number:2
Number:3
Arithmetic operator:*
Number:4
Number:8
Arithmetic operator:+
Arithmetic operator:/
Number:9
Number:5
Arithmetic operator:z
Arithmetic operator:* ^z