#include<stdio.h>
#include<string.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()
{ m=0;
for(n=0;n<8;n++) token[n]=NULL;
ch=prog[p++];
while(ch==' ') ch=prog[p++];
if((ch>='A' && ch<='Z')||( ch>='a'&&ch<='z')) //是字母字符
{
while ((ch>='A' && ch<='Z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))//为字母字符或数字字符
{
token[m++]=ch; //ch=>token;
ch=prog[p++];
}
token[m++]='/0';
p--; //回退一个字符
syn=10;
for(n=0;n<6;n++)
if (strcmp(token,rwtab[n])==0)
{ syn=n+1; //给出syn的值;
break;
}
}
else
if (ch>='0'&&ch<='9') //是数字字符
{ while (ch>='0'&&ch<='9') //为数字字符
{ sum=0;
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else
switch(ch)
{
case '<':m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='>')
{ syn=21;
token[m++]=ch;
}
else if (ch=='=')
{ syn=22;
token[m++]=ch;
}
else
{syn=20;
p--;
}
break;
case '>':token[m++]=ch; //ch=>token;
ch=prog[p++];
if (ch=='=')
{ syn=24; //>=的种别码=>syn
token[m++]=ch; //ch=>token;
}
else
{
syn=23;
p--;
}
break;
case ':':token[m++]=ch; //ch=>token;
ch=prog[p++];
if (ch=='=')
{ syn=18;
token[m++]=ch; // ch=>token;
}
else
{ syn=17;
p--;
}
break;
case '+':syn=13;
token[0]=ch;
break;
case '-':syn=14;
token[0]=ch;
break;
case '*':syn=15;
token[0]=ch;
break;
case '/':syn=16;
token[0]=ch;
break;
case '=':syn=25;
token[0]=ch;
break;
case ';':syn=26;
token[0]=ch;
break;
case '(':syn=27;
token[0]=ch;
break;
case ')':syn=28;
token[0]=ch;
break;
case '#':syn=0;
token[0]=ch;
break;
default:syn=-1;
}
};
void main()
{
p=0;
printf("/n Please input string: /n");
do {
ch=getchar();
prog[p++]=ch;
} while (ch!='#');
p=0;
do
{
scaner();
switch(syn)
{
case 11: printf("(%d,%d)",syn,sum); break;
case -1: printf("Error!/n"); break;
default: printf("(%d,%s)",syn,token);
}
} while (syn!=0);
};
编译原理词法分析程序
最新推荐文章于 2024-05-08 08:26:47 发布