2007年5月23日星期三

词法分析实验参考程序 (老师公布)

#include "stdio.h"
#include "string.h"
char prog[80],token[8];
char ch;
int syn,p,m,n;
char *numtab[6]={"begin","if","then","while","do","end"};
int scaner(char prog[])
{
int i;
for(m=0;m<8;m++) token[m]=NULL;
m=0; ch=prog[p++];
while(ch==' ') ch=prog[p++];
if((ch>='a')&&(ch<='z'))
{
while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;ch=prog[p++];} token[m++]='\0'; n=0;
for(i=0;i<6;i++)
if(strcmp(token,numtab[i])==0)
switch(i)
{
case 0: syn=1;n++;break;
case 1: syn=2;n++;break;
case 2: syn=3;n++;break;
case 3: syn=4;n++;break;
case 4: syn=5;n++;break;
case 5: syn=6;n++;break;
}
if(n==0) syn=10;p--;
}
else if(ch>='0'&&ch<='9')
{n=0;while(ch>='0'&&ch<='9') {n=n*10+(ch-'0');ch=prog[p++];}syn=11; p--;}
else switch(ch)
{
case'<': token[m++]=ch;ch=prog[p++];
if(ch=='>')
{token[++m]=ch;syn=22;}
else if(ch=='=')
{token[++m]=ch;syn=21;}
else{p--;syn=20;} break;
case'>': token[m]=ch;
ch=prog[p++]; if(ch=='='){token[++m]=ch;syn=24;}
else{p--;syn=23;} break;
case '+': token[m]=ch;syn=13;break;
case '-': token[m]=ch;syn=14;break;
case '*': token[m]=ch;syn=15;break;
case '/': token[m]=ch;syn=16;break;
case ':': token[m++]=ch;ch=prog[p++];
if(ch=='='){token[m++]=ch;syn=18;}
else{p--;syn=17;}break;
case '=': token[m]=ch;syn=25;break;
case ';': token[m]=ch;syn=26;break;
case '(': token[m]=ch;syn=27;break;
case ')': token[m]=ch;syn=28;break;
case '#': syn=0;token[0]='#';break;
default: syn=-1;}
return syn;
return n;
}
void main()
{
p=0;
clrscr();
printf("Please input code and end with character '#':\n");
do{
ch=getchar();prog[p++]=ch;
}while(ch!='#');
p=0;
do{
syn=scaner(prog);
switch(syn)
{
case 11: printf ("\n(%2d,%8d)",syn,n);break;
case -1: printf("\n(%2d, error)",syn);break;
default: printf("\n(%2d,%8s)",syn,token);
}
}while(syn!=0);
getch();
}

没有评论: