标签:
#include<stdio.h>
#include<string.h>
void F(char c,char b);
void word(char a[]);
void number(char a[]);
int i; //定义全局变量i
int s=1; //用来记录是否存在非法字符
main(){
    char a[50];
    printf("\n请您输入需要分析的字符串:\n");
    gets(a);
	printf("\n您要分析的字符串为:\n");
	printf("\t%s",a);
	printf("\n");
    for(i=0;(a[i]!=‘\0‘)&&(i<50)&&s==1;i++){
		if((a[i]>=‘a‘ && a[i]<=‘z‘)||(a[i]>=‘A‘ && a[i]<=‘Z‘))
		   word(a);
		else if(a[i]>=‘0‘ && a[i]<=‘9‘)
			number(a);
		else
			F(a[i],a[i+1]);
	}
	printf("\n");
 }
  
 void number(char a[]) //对数字字符进行扫描分析
 {
     char b[50];
	 int m,k=0,t;
	 m=i;
     while(a[m]>=‘0‘ && a[m]<=‘9‘) 
	 {
		 b[k]=a[m]; //用数组b存放数组a中的数字
		 k++;
		 m++;
	 }
	 i=m-1;
	 printf("(11,");
	 for(t=0;t<k;t++)
		 printf("%c",b[t]);
	 printf(")");
	 printf("\n");
 }
void word(char a[]) //对字母字符进行扫描分析,并识别保留字
{
	int k=0,m,flag=0,t;
	char b[50];
	char *key[6]={"begin","if","then","while","do","end"};
	m=i;
	while((a[m]>=‘a‘&&a[m]<=‘z‘)||(a[m]>=‘A‘&&a[m]<=‘Z‘)) //用数组b存放数组a中的字母
	{
		b[k]=a[m]; 
		k++;
		m++;
		b[k]=‘\0‘; 
	}
    i=m-1;
    for(t=0;t<6;t++)
    {
		if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
		{
			printf("(%d,%s)",t+1,key[t]); //输出关键字
			flag=1;
			printf("\n");
		}
	}
    if(flag==0)
	{
		printf("(10,%s)",b); //输出标识符
		printf("\n");
	}
}
void F(char c,char b) //对特殊字符进行扫描分析
{
	switch(c){
	case ‘+‘:
		printf("(13,+)\n");
		break;
	case ‘-‘:
		printf("(14,-)\n");
		break;
	case ‘*‘:
        printf("(15,*)\n");
	    break;
	case ‘/‘:
		printf("(16,/)\n");
		break;
	case ‘:‘:
		if(b==‘=‘)
		{
            i++;
			printf("(18,:=)\n");
		}
		else
            printf("(17,:)\n");
		break;
	case ‘ ‘:
		break;
	case ‘<‘:
		if(b==‘>‘)
		{
			i++;
			printf("(21,<>)\n");
		}
		else if(b==‘=‘)
		{
			i++;
			printf("(22,<=)\n");
		}
		else
            printf("(20,<)\n");
		break;
	case ‘>‘:
		if(b==‘=‘)
		{
            printf("(24,>=)\n");
            i++;
		}
		else
			printf("(23,>)\n");
		break;
	case ‘=‘:
		printf("(25,=)\n");
		break;
	case ‘;‘:
		printf("(26,;)\n");
		break;
	case ‘(‘:
		printf("(27,()\n");
		break;
	case ‘)‘:
		printf("(28,))\n");
		break;
	case ‘#‘:
		printf("(0,#)\n");
		break;
	default:
		{
			printf("\n存在字符 ‘%c‘,无法继续识别!\n",c);
			s=0; //用s=0记录存在非法字符
			break;
		}
	}
 }
标签:
原文地址:http://www.cnblogs.com/sunset-Panda/p/5962085.html