www.pudn.com > eva.rar > 1.cpp


                   /*程序实现C语言词法分析器的设计*/ 
 
/*06000921 吴珊珊  9班 
/*用到的几个函数 
  GetNextWord()    从字符串中得到一个单词 
  GetC()           从当前流中取一个字符 
  Pushback()       退回字符 
  SearchKey()      查找保留字表 
/*用到的变量 
  cch              放当前字符 
  flag             标志有无退回字符(1:有  0:无) 
  bchar            放退回字符 
   
 
/*C语言中的保留字(32个) 
   auto			break		case		char		const 
   continue		default		do			double		else 
   enum			extern		float		for			goto 
   if			int			long		register	return 
   short		signed		sizeof		static		struct 
   switch		typedef		union		unsigned	void 
   volatile		while 
 
/* 
运算符(43个) 
  (		)	[	]	{	}	->	.	!	~	++	--	-	* 
  &		/	%	+	<<	>>	<	<=	>	>=	==	!=	^	| 
  &&	||	?:	=	+=	-=	*=	%=	>>=	<<=	&=	^=	!=	|= 
  , 
 
*/ 
 
#include  
#include  
#include  
#include  
 
	int flag=0; 
	char cch; 
	char bchar; 
	char str[100]; 
	FILE *fp; 
void Pushback(char c) 
{ 
	bchar=c; 
	 flag=1; 
} 
 
char GetC( ) 
{ 
	  if(flag==1) 
	  { 
		  flag=0; 
		  return bchar; 
	  } 
	  char t; 
	  t=getc(fp); 
	  if(t=='\n'||t=='\t'||t=='\r') t=' '; 
	  return t; 
} 
 
int SearchKey( ) 
{ 
	char StrToken[32][10]={"auto","break","case","char","const", 
		"continue","default","do","double","else","enum","extern", 
		"float","for","goto","if","int","long","register","return", 
        "short","signed","sizeof","static","struct","switch", 
		"typedef","union","unsigned","void","volatile","while"}; 
	  for(int i=0;i<32;i++) 
	  { 
	  if(strcmp(StrToken[i],str)==0)	   
		 return i;	   
	   } 
	  return 0; 
} 
	 
void GetNextWord( ) 
{ 
     
	cch=GetC(); 
	while(cch==' ') 
	 { 
		 cch=GetC( ); 
	 } 
	int k=0; 
	str[0]=cch; 
	if((cch>='a'&&cch<='z')||(cch>='A'&&cch<='Z')) 
	{ 
		 
		str[++k]=cch; 
		cch=GetC( ); 
		while((cch>='a'&&cch<='z')||(cch>='A'&&cch<='Z')|| 
			(cch>='0'&&cch<='9')) 
		{ 
			str[k++]=cch; 
			cch=GetC( ); 
		} 
		str[k]='\0'; 
		Pushback(cch); 
		if(SearchKey( )==0) 
			cout<<"200"<='0') 
	{ 
		while(cch<='9'&&cch>='0') 
			cch=GetC( ); 
		if(cch=='E'||cch=='D') 
			cch=GetC( ); 
		if(cch=='+'||cch=='-') 
		{ 
			cch=GetC( ); 
			if(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			while(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			Pushback(cch); 
			cout<<"400"; 
		} 
		else if(cch<='9'&&cch>='0') 
		{ 
			while(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			Pushback(cch); 
			cout<<"400"; 
		} 
		else if(cch=='.') 
		{ 
			while(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			if(cch=='E'||cch=='D') 
				cch=GetC( ); 
			if(cch=='+'||cch=='-') 
		{ 
			cch=GetC( ); 
			if(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			while(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			Pushback(cch); 
			cout<<"400"; 
		} 
		else if(cch<='9'&&cch>='0') 
		{ 
			while(cch<='9'&&cch>='0') 
				cch=GetC( ); 
			Pushback(cch); 
			cout<<"400"; 
		} 
		else Pushback(cch); 
		cout<<"400"; 
		} 
		} 
 
				else  
				{ 
					switch(cch) 
					{ 
					case '+':{cch=GetC( ); 
						     switch(cch) 
							 {case '+':cout<<"1"<<"++";break; 
							  case '-':cout<<"2"<<"+=";break; 
							  default:Pushback(cch); 
								      cout<<"3"<<"+";break; 
							 } 
							 };break; 
							   
					case '-':{cch=GetC( ); 
						     switch(cch) 
							 {case '-':cout<<"4"<<"--";break; 
							  case '=':cout<<"5"<<"-=";break; 
                              case '>':cout<<"6"<<"->";break; 
							  default:Pushback(cch); 
								      cout<<"7"<<"-"; 
							 };break; 
							 } 
					case '*':{cch=GetC( ); 
						    if(cch=='=') cout<<"8"<<"*="; 
							else { 
								Pushback(cch); 
								cout<<"9"<<"*"; 
							} 
							 };break; 
							  
					case '/':{cch=GetC( ); 
						    if(cch=='=') cout<<"10"<<"/="; 
							else { 
								Pushback(cch); 
								cout<<"11"<<"/"; 
							} 
							 };break; 
							  
					case '<':{cch=GetC( ); 
						     switch(cch) 
							 { 
							 case'=':cout<<"12"<<"<=";break; 
							 case'<':cch=GetC( ); 
								 if(cch=='=')cout<<"13"<<"<<="; 
								 else { 
								Pushback(cch); 
								cout<<"14"<<"<<"; 
							}; 
							 default:Pushback(cch); 
								 cout<<"15"<<"<"; 
							 } 
							 };break; 
							  
				  case '>':{cch=GetC( ); 
						     switch(cch) 
							 { 
							 case'=':cout<<"16"<<">=";break; 
							 case'>':cch=GetC( ); 
								 if(cch=='=')cout<<"17"<<">>="; 
								 else { 
								Pushback(cch); 
								cout<<"18"<<">>";break;} 
							 default:Pushback(cch); 
								 cout<<"19"<<">"; 
							 } 
									  };break; 
					case '=':{cch=GetC( ); 
						    if(cch=='=') cout<<"20"<<"=="; 
							else { 
								Pushback(cch); 
								cout<<"21"<<"="; 
							} 
									  };break; 
					case '%':{cch=GetC( ); 
						    if(cch=='=') cout<<"22"<<"%="; 
							else { 
								Pushback(cch); 
								cout<<"23"<<"%"; 
							} 
							 };break; 
					case '!':{cch=GetC( ); 
						    if(cch=='=') cout<<"24"<<"!="; 
							else { 
								Pushback(cch); 
								cout<<"25"<<"!"; 
							} 
							 };break; 
					case '&':{cch=GetC( ); 
						     switch(cch) 
							 { 
							 case '&':cout<<"26"<<"&&";break; 
							 case '=':cout<<"27"<<"&=";break; 
							 default:Pushback(cch); 
								 cout<<"28"<<"&"; 
							 } 
							 };break; 
					case '^':cch=GetC( ); 
						if(cch=='=')cout<<"29"<<"^="; 
						else{Pushback(cch); 
						cout<<"30"<<"^"; 
						};break; 
					case '|':cch=GetC( ); 
						switch(cch) 
						{ 
						case'|':cout<<"31"<<"||";break; 
						case'=':cout<<"32"<<"|=";break; 
						default:Pushback(cch); 
							cout<<"33"<<"|"; 
						};break; 
					case '(':cout<<"34"<<"(";break; 
					case ')':cout<<"35"<<")";break; 
					case '[':cout<<"36"<<"[";break; 
                    case ']':cout<<"37"<<"]";break; 
                    case '{':cout<<"38"<<"{";break; 
					case '}':cout<<"39"<<"}";break; 
					case '~':cout<<"40"<<"~";break; 
					case '.':cout<<"41"<<".";break; 
                    case ';':cout<<"42"<<";";break; 
                    case ',':cout<<"43"<<",";break; 
                    case '?':{cch=GetC( ); 
						     if(cch==':')cout<<"44"<<"?:"; 
							 else cerr<<"error!"<