#include <stdio.h>
#include <string.h>
Char prog[80],token[8],ch;
int syn,p,m,n,sum;
Char *rwtab[6]={' begin ', ' if ', ' then ', ' while ', ' Do ', ' end '};
Scaner ();
Main ()
{p=0;
printf ("Input source program, end with # # #");
do{
scanf ("%c", &ch);
Prog[p++]=ch;
}while (ch!= ' # ');
P=0;
do{
Scaner ();
Switch (SYN)
{Case 11:printf ("(%-10d%5d) \ n", Sum,syn);
Break
case-1:printf ("You have input a wrong string\n");
GetChar ();
Default:printf ("(%-10s%5d) \ n", Token,syn);
Break
}
}while (syn!=0);
GetChar ();
}
Scaner ()
{sum=0;
for (m=0;m<8;m++) token[m++]=null;
Ch=prog[p++];
m=0;
while (ch== ") | | (ch== ' \ n ')) Ch=prog[p++];
if ((ch<= ' z ') && (ch>= ' a ')) | | ((ch<= ' Z ') && (ch>= ' A ')))
{while ((ch<= ' z ') && (ch>= ' a ')) | | ((ch<= ' Z ') && (ch>= ' A ')) | | (ch>= ' 0 ') && (ch<= ' 9 ')))
{token[m++]=ch;
Ch=prog[p++];
}
p--;
syn=10;
for (n=0;n<6;n++)
if (strcmp (Token,rwtab[n]) ==0)
{syn=n+1;
Break
}
}
else if ((ch>= ' 0 ') && (ch<= ' 9 '))
{while ((ch>= ' 0 ') && (ch<= ' 9 '))
{sum=sum*10+ch-' 0 ';
Ch=prog[p++];
}
p--;
syn=11;
}
else switch (CH)
{case ' < ': token[m++]=ch;
Ch=prog[p++];
if (ch== ' = ')
{syn=22;
Token[m++]=ch;
}
Else
{syn=20;
p--;
}
Break
Case ' > ': token[m++]=ch;
Ch=prog[p++];
if (ch== ' = ')
{syn=24;
Token[m++]=ch;
}
Else
{syn=23;
p--;
}
Break
Case ' + ': token[m++]=ch;
Ch=prog[p++];
if (ch== ' + ')
{syn=17;
Token[m++]=ch;
}
Else
{syn=13;
p--;
}
Break
Case '-': token[m++]=ch;
Ch=prog[p++];
if (ch== '-')
{syn=29;
Token[m++]=ch;
}
Else
{syn=14;
p--;
}
Break
Case '! ': ch=prog[p++];
if (ch== ' = ')
{syn=21;
Token[m++]=ch;
}
Else
{syn=31;
p--;
}
Break
Case ' = ': token[m++]=ch;
Ch=prog[p++];
if (ch== ' = ')
{syn=25;
Token[m++]=ch;
}
Else
{syn=18;
p--;
}
Break
Case ' * ': syn=15;
Token[m++]=ch;
Break
Case '/': syn=16;
Token[m++]=ch;
Break
Case ' (': syn=27;
Token[m++]=ch;
Break
Case ') ': syn=28;
Token[m++]=ch;
Break
Case ' {': syn=5;
Token[m++]=ch;
Break
Case '} ': syn=6;
Token[m++]=ch;
Break
Case '; ': syn=26;
Token[m++]=ch;
Break
Case ' \ ': syn=30;
Token[m++]=ch;
Break
Case ' # ': syn=0;
Token[m++]=ch;
Break
Case ': ': syn=17;
Token[m++]=ch;
Break
Default:syn=-1;
Break
}
token[m++]= ' + ';
return 0;
}
0916 Programming Experiment a lexical analysis program