0917 实验一词法分析程序

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define M 1000
struct key
{
char g[20];
};
typedef struct key KEY;
int main()
{
KEY k[6];
int i=0,j=0;
char a[M],b[M],ch;
strcpy(k[0].g,"begin");
strcpy(k[1].g,"if");
strcpy(k[2].g,"then");
strcpy(k[3].g,"while");
strcpy(k[4].g,"do");
strcpy(k[5].g,"end");

printf("请输入源程序: ");
do{
scanf("%c",&ch);
a[i]=ch;
i++;
}while(a[i-1]!='#');
a[i]='';
//gets(a);
i=0;
while(a[i]!='')
{
j=0;
//if((isalpha(a[i]))||(a[i]=='_'))
if(isalpha(a[i]))
{
while((a[i]!=' ')&&(a[i]!=''))
{
if((isalpha(a[i]))||(isdigit(a[i])))
{
b[j]=a[i];
j++;
i++;
}
else
break;
}
if((a[i]==' ')||(a[i]=='')||(a[i]==' '))
{
b[j]='';
if(strcmp(b,k[0].g)==0)
printf("begin 种别码 1 ");
else if(strcmp(b,k[1].g)==0)
printf("if 种别码 2 ");
else if(strcmp(b,k[2].g)==0)
printf("then 种别码 3 ");
else if(strcmp(b,k[3].g)==0)
printf("while 种别码 4 ");
else if(strcmp(b,k[4].g)==0)
printf("do 种别码 5 ");
else if(strcmp(b,k[5].g)==0)
printf("end 种别码 6 ");
else
printf("%s 种别码 10 ",b);
}
else
{
b[j]='';
printf("%s 种别码 10 ",b);
i--;
}
}

else if(isdigit(a[i]))
{
j=0;
while(isdigit(a[i]))
{
b[j]=a[i];
j++;
i++;
}
b[j]='';
printf("%s 种别码 11 ",b);
i--;
}
else
{
switch(a[i])
{

case' ': break;
case' ': break;
case '+':
printf("%c 种别码 13 ",a[i]);break;
case '-':
printf("%c 种别码 14 ",a[i]);break;
case '*':
printf("%c 种别码 15 ",a[i]);break;
case '/':
printf("%c 种别码 16 ",a[i]);break;
case ':':
if(a[i+1]=='=')
{ printf(":= 种别码 18 ");i++;break;}
else
{ printf("%c 种别码 17 ",a[i]);break;}
case '<':
if(a[i+1]=='=')
{ printf("<= 种别码 21 ");i++;break;}
if(a[i+1]=='>')
{ printf("<> 种别码 22 ");i++;break;}
else
printf("%c 种别码 20 ",a[i]);break;
case '>':
if(a[i+1]=='=')
{ printf(">= 种别码 24 ");i++;break;}
else
printf("%c 种别码 23 ",a[i]);break;
case '=':
printf("= 种别码 25 ");break;
case ';':
printf("; 种别码 26 ");break;
case '(':
printf("( 种别码 27 ");break;
case ')':
printf(") 种别码 28 ");break;
case '#':
printf("# 种别码 0 ");break;
default:
printf("%c 语法错误! ",a[i]);break;
}
}

i++;
}
}

原文地址:https://www.cnblogs.com/57rongjielong/p/4830384.html