首页 > 代码库 > 词法分析

词法分析

词法分析

#include<stdio.h>
#include<string.h>
void main()
{ 
	int  i=0,j,k=0,state=1,f=0,linenum=1;
    char a[11][10]={"const","var","call","begin","if","while","do","odd","end","then","procedure"}; 
    char b,d[40]={"\0"};
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	b=getchar();
	while(b!=EOF)/*判断所输入字符是否为结束符*/
    {
      if(b==‘ ‘||b==‘\n‘||b==‘\t‘)/*滤过空格、换行等分隔符号*/
	  {
		if(b=‘\n‘) linenum++;
		b=getchar();
	  }
	else if((b>=‘a‘&&b<=‘z‘)||(b>=‘A‘&&b<=‘Z‘))/*识别标识符以及保留字*/
	{
		d[i++]=b;
		b=getchar(); 
		while((b>=‘a‘&&b<=‘z‘)||(b>=‘A‘&&b<=‘Z‘)||(b>=‘0‘&&b<=‘9‘))
		{
			d[i++]=b;
			b=getchar(); 
		}
		for(j=0;j<11;j++)/*查询保留字表确定该单词是否是保留字*/ 
		{
			if(strcmp(d,a[j])==0)
			{
				printf("1,%s\n",d);
				k=1;
				break; 

			}

		}
		if(k==0)/*在保留字表中没有查到该单词,是标识符*/ 
		printf("3,%s\n",d);
		for(j=0;j<=i;j++) 
		d[j]=‘\0‘; 
		i=0; 
		k=0; 

	}
	   else if(b>=‘0‘&&b<=‘9‘)/*识别常数*/ 
	   {
	    d[i++]=b; 
		b=getchar();
		while(f!=1){ 
		switch (state)
		case 1: 
		if(b>=‘0‘&&b<=‘9‘) { 
		state=1;
		d[i++]=b;
		b=getchar();
		}
		else if(b==‘.‘) 
		{ state=2;d[i++]=b;b=getchar();}
		else if(b==‘E‘)
		{ state=4;d[i++]=b;b=getchar();}
		else state=7;
		break; 

   case 2:
        if(b>=‘0‘&&b<=‘9‘) { 
			state=3; 
			d[i++]=b;
            b=getchar();} 
			else state=8; 
            break;




	   }


	}





}

词法分析