⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cabuary.cpp

📁 c语言编的PL/0的词法分析器
💻 CPP
字号:

#include <iostream.h>
#include <string.h>
#include <stdio.h>


//保留字=1;标识符=2;常数=3;运算符=4;界符=5;
bool isLetter(char c){
   
	switch(c){
	case'a': return true; 
	case'b': return true; 
	case'c': return true; 
	case'd': return true; 
	case'e': return true; 
	case'f': return true; 
	case'g': return true; 
	case'h': return true;
	case'i': return true; 
	case'j': return true; 
	case'k': return true; 
	case'l': return true;
	case'm': return true; 
	case'n': return true; 
	case'o': return true; 
	case'p': return true; 
	case'q': return true; 
	case'r': return true; 
	case's': return true; 
	case't': return true; 
	case'u': return true; 
	case'v': return true; 
	case'w': return true; 
	case'x': return true; 
	case'y': return true; 
	case'z': return true; 
	case'A': return true; 
	case'B': return true; 
	case'C': return true; 
    case'D': return true; 
    case'E': return true; 
	case'F': return true; 
	case'G': return true; 
	case'H': return true; 
		case'I': return true; break;
	
    case'J': return true; break;
	case'K': return true; break;
	case'L': return true; break;
	case'M': return true; break;
	case'N': return true; break;
	case'O': return true; break;
	case'P': return true; break;
	case'Q': return true; break;
	case'R': return true; break;
	case'S': return true; break;
	case'T': return true; break;
	case'U': return true; break;
	case'V': return true; break;
	case'W': return true; break;
	case'X': return true; break;
	case'Y': return true; break;
	case'Z': return true; break;
	default: return false;break;
	}
}
bool isDigit(char a){switch(a){
 case'0': return true; 
	case'1': return true; 
	case'2': return true; 
	case'3': return true; 
	case'4': return true; 
	case'5': return true; 
	case'6': return true; break;
	case'7': return true; break;
	case'8': return true; break;
	case'9': return true; break;
	
	default: return false;break;
}
}
bool isAlphaDigit(char a){
	switch(a){
	case'a': return true; 
	case'b': return true; 
	case'c': return true; 
	case'd': return true; 
	case'e': return true; 
	case'f': return true; 
	case'g': return true; 
	case'h': return true;
	case'i': return true; 
	case'j': return true; 
	case'k': return true; 
	case'l': return true;
	case'm': return true; 
	case'n': return true; 
	case'o': return true; 
	case'p': return true; 
	case'q': return true; 
	case'r': return true; 
	case's': return true; 
	case't': return true; 
	case'u': return true; 
	case'v': return true; 
	case'w': return true; 
	case'x': return true; 
	case'y': return true; 
	case'z': return true; 
	case'A': return true; 
	case'B': return true; 
	case'C': return true; 
    case'D': return true; 
    case'E': return true; 
	case'F': return true; 
	case'G': return true; 
	case'H': return true; 
		case'I': return true; break;
	
    case'J': return true; break;
	case'K': return true; break;
	case'L': return true; break;
	case'M': return true; break;
	case'N': return true; break;
	case'O': return true; break;
	case'P': return true; break;
	case'Q': return true; break;
	case'R': return true; break;
	case'S': return true; break;
	case'T': return true; break;
	case'U': return true; break;
	case'V': return true; break;
	case'W': return true; break;
	case'X': return true; break;
	case'Y': return true; break;
	case'Z': return true; break;
	case'0': return true; 
	case'1': return true; 
	case'2': return true; 
	case'3': return true; 
	case'4': return true; 
	case'5': return true; 
	case'6': return true; break;
	case'7': return true; break;
	case'8': return true; break;
	case'9': return true; break;
	
	default: return false;break;
	}
}

bool isword(char a[]){
  // char *a=a[10];
	int k=0;
	char *symconst="const";
   char *symvar="var";
   	char *symprocedure="procedure";
	char *symcall="call";
	char *symend="end";
   char *symif="if";
   char *symthen="then";
   	char *symwhile="while";
	char *symdo="do";
	char *symread="read";
	char *symwrite="write";
	char *symbegin="begin";
	
   if(k=*a-*symconst==0&&*a++&&*symconst++)
	return true;
   
   else	if(k=*a-*symvar==0&&*a++&&*symvar++)
	return true;
	   else	if(k=*a-*symprocedure==0&&*a++&&*symprocedure++)
	return true;
else	if(k=*a-*symcall==0&&*a++&&*symcall++)
	return true;
else	if(k=*a-*symend==0&&*a++&&*symend++)
	return true;
 else  if(k=*a-*symif==0&&*a++&&*symif++)
	return true;
 else   if(k=*a-*symthen==0&&*a++&&*symthen++)
	return true;
 else	if(k=*a-*symwhile==0&&*a++&&*symwhile++)
	return true;
 else    if(k=*a-*symdo==0&&*a++&&*symdo++)
	return true;
 else	if(k=*a-*symread==0&&*a++&&*symread++)
	return true;
 else	if(k=*a-*symwrite==0&&*a++&&*symwrite++)
	return true;
 else	if(k=*a-*symbegin==0&&*a++&&*symbegin++)
	
		
		return true;

 else  return false;
}











	getsym(){  
		char c;int k=0;char A[11]="";
		
		
		c=cin.get();

	 if(c==' ') getsym();
	else  if(c!=' '&&c!='\t'&&c!='\n'&&c!=EOF)
	 {	 
		
		
		if(isLetter(c)) 
		{A[k]=c;
	 if(k<11){k=0;
	  while(isAlphaDigit(cin.peek()))
	  {  k=k+1; A[k]+=char(cin.get()); }
	 }
	 
	 
	    
	 for(int i=0;i<11;i++)
	 {	cout<<A[i];}
	 if(isword(A))
		 cout<<':'<<1<<endl;
	   else cout<<':'<<2<<endl;
	 }
		


	   else if(isDigit(c)){
		   int m=0;char B[10]="";
		   A[k]=c;        
	    while(isLetter(cin.peek()))
          B[m]=cin.get();m+=1;
	     while(isDigit(cin.peek()))
	      k+=1;A[k]+=char(cin.get());
	   }
	    if(isword(B[10]))

		{for(int i=0;i<11;i++)
	 {	cout<<b[i];}
	    cout<<':'<<1<<endl;
	}}else for(int i=0;i<11;i++)
              {	cout<<A[i];}
               cout<<':'<<"wrong"<<endl;
	  
else  switch(c){
		   
           case '+': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
	 
			  // cout<<c<<':'<<4<<endl;
		        break;


             case '-': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;


              case '*': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;


			case '/': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;


			 case '!': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;

				 case ':=': 
			   cout<<c<<':'<<4<<endl;
		        break;

				 case '#': 
			   cout<<c<<':'<<4<<endl;
		        break;

				 case '%': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;

				 case '^': 
			   cout<<c<<':'<<4<<endl;
		        break;

				 case '(': 
			   cout<<c<<':'<<4<<endl;
		        break;

				 case ')': 
			   cout<<c<<':'<<4<<endl;
		        break;

				 case '=': 
			   cout<<c<<':'<<4<<endl;
		        break;

				case '<': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;

				case '>': 
			   A[0]=c;
               if(cin.peek()=='=')
				A[1]=cin.get();  
	
	    cout<<A<<':'<<4<<endl;
		        break;
				
			  





				 case '"': 
			   cout<<c<<':'<<5<<endl;
		        break;
			
				case '`': 
			   cout<<c<<':'<<5<<endl;
		        break;
				
				 case ',': 
			   cout<<c<<':'<<5<<endl;
		        break;

				 case '.': 
			   cout<<c<<':'<<5<<endl;
		        break;

				 case ';': 
			   cout<<c<<':'<<5<<endl;
		        break;
				
				 default: cout<<c<<":"<<"         "<<"It's a wrong sign!"<<endl;
					 break;


































	   }
     
		
	
   //return true;
	}
}




void main(){
//	char c;
	int k=0;char A[9]="";int cc=0;
//ken=" ";
	cout<<"please write the program:"<<endl;
	getsym();
//if(c!=' '&&c!='\t'&&c!='\n'&&c!=EOF)
	getsym();
  	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();	getsym();
getsym();getsym();getsym();getsym();getsym();getsym();getsym();getsym();getsym();getsym();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -