码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析

时间:2015-10-08 09:06:06      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<string.h>//strcmp()
#include<conio.h>//getch()
#include<ctype.h>//isalpha(),isdigit()
#define max 200
char pro[max], lin[20];
int  n,i,syn;
char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" };   // 关键字,特殊标识符
char   ch ;
scaner( )
{ 
	int j=0;
	for ( n=0; n<20; n++ ) 
		lin[n]=NULL;                                               //临时数组初始化
	ch=pro[i++];//读取字符串
	while (ch==‘ ‘)                                               //判断,跳过空字符  
		ch=pro[i++];//读取整个单词
	if  ((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))        //判断是否是字母或数字
	{ 
		if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘))                       //判断标示符和特殊关键字                      
		{
			lin[j++]=ch;
			ch=pro[i++];//pro[i++]空,关键字
			while((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))//判断标识符
			{ 
				lin[j++]=ch;
				ch=pro[i++];   
			}
			lin[j]=‘\0‘;//结束标志,回车
			i--;
			syn=10;//单词种别码
			for (n=0;n<6 ;n++ )
				if(strcmp(lin,word[n])==0)//查找关键字表是否符合
				{      
					syn=n+1;
					break ;
				}
		}
		else                                           //判断数字
		{  
			while (ch>=48&&ch<=57)
			{ 
				lin[j++]=ch;
				ch=pro[i++];  
			}
			i--;
            lin[j]=‘\0‘;
			syn=11;
		}
	}
	else                                               //判断其它符号
	{
		/////////判断<,<=,<>
		if(ch==‘<‘) 
		{
			lin[j++]=ch;
			ch=pro[i++];
			if (ch==‘>‘)
			{  
				syn=21;
				lin[j++]=ch;
				lin[j]=‘\0‘;
			}
			else if(ch==‘=‘)
			{  
				syn=22;
				lin[j++]=ch;
				lin[j]=‘\0‘;
			}
			else 
			{ 
				syn=20;
				lin[j]=‘\0‘;
				i--;
			}
		} 
		///////////判断>,>=
		else if(ch==‘>‘)
		{
			lin[j++]=ch;
			ch=pro[i++];
			if (ch==‘=‘)
			{
				syn=24;
				lin[j++]=ch;
				lin[j]=‘\0‘;
			}
			else 
			{ 
				syn=23;
				lin[j]=‘\0‘;
				i--;
			}
		}
 ////////////判断 :,:=
		else if(ch==‘:‘)
		{
			lin[j++]=ch;
			ch=pro[i++];
			if (ch==‘=‘)
			{ 
				syn=18;
				lin[j++]=ch;
				lin[j]=‘\0‘;
			}
			else 
			{ 
				syn=17;
				lin[j]=‘\0‘;
				i--;
			} 
		}
  //////////判断其它符号
		else if(ch==‘+‘)
		{
			syn=13; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘-‘)
		{
			syn=14; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘*‘)
		{
			syn=15; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘/‘)
		{
			syn=16; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘=‘)
		{
			syn=25; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘;‘)
		{
			syn=26; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘(‘)
		{
			syn=27; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘)‘)
		{
			syn=28; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else if(ch==‘#‘)
		{
			syn=0; 
			lin[j++]=ch;
			lin[j]=‘\0‘;
		}
		else
			syn=-1;      
}
return syn;
}
void read()   //定义从文件读入数据函数
{
	FILE *fp;
	int k;
	fp=fopen("cifafenxi.txt","r");//在当前的目录下读文件名为cifafenxi.txt
	for(k=0;k<max-1;k++)
	{
		fscanf(fp,"%c",&pro[k]);
	}
	pro[k]=‘\0‘;
	fclose(fp);
}
void main()
{      
	int i=0 ;
   printf( "Please input source code:\n" );
   do{
	   ch=getchar();//读入字符串
	   pro[i++]=ch;
   }while(ch!=‘#‘);
   i=0;

   do
   {     
	   scaner();
	   switch(syn)
	   { 
	   case 11:   printf ("(%d,%s)\n",syn,lin); 
		   break;
	   case -1:  printf("错误符号\n");
		   break;     
	   default:   printf ("(%d,%s)\n",syn,lin);
	   }
   } while (syn!=0);
   getch();
}

 

词法分析

标签:

原文地址:http://www.cnblogs.com/xiaochenxi/p/4859996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!