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

📄 main.c

📁 一个简单的词法分析器 一个简单的词法分析器
💻 C
字号:
#include<stdio.h>
#include<string.h>
#define MAX 20
typedef struct{ //二元组
	int syn; //种别编码
    char value[MAX]; //值
}WS;
char ch;
FILE *fp;

void getbc(){ //检查ch是否为空白符,是的话,继续取下一个字符,直到不为空
	while(ch==' ')	
		ch=fgetc(fp);
}
int letter(){ //判断ch是否为字母
	if((ch>='A')&&(ch<='Z')||(ch>='a')&&(ch<='z')) 
		return 1;
	else 
		return 0;
}

int digit(){ //判断ch是否为数字
	if((ch>='0')&&(ch<='9')) 
		return 1;
	else 
		return 0;
}

int reserve(char token[]){  //查关键字表,判断token中的字符串是否为关键字 
	int key=10,i;
	char WORDS_KEY[8][20]={"main","int","char","if","else","for","while","void"};
	for(i=0;i<8;i++)
      if(strcmp(token,WORDS_KEY[i])==0){
		  key=i+1;
		  break;
	  } 
	return key;
}

void error(){ //错误调用函数
	printf("There has some unlawful words!");
}

print(WS *wd){ //打印函数
	printf("<  %d , %s  >",wd->syn,wd->value);
}
WS scaner(){ //扫描函数,主要算法
	char token[20];
	WS wd;                   //声明一个类
	int c;
	int i=0;
    ch=fgetc(fp);
	getbc(fp);
	if(letter()){ //是否为字母,是的话继续取字符,直到取的词不是字母或数字。调用reserve(char *token)判断是否为关键字。
		while(letter()||digit()){        //判断是否为数字或字母		
			token[i]=ch;
			ch=fgetc(fp);
			i++;
		}
		token[i]='\0';                  
		fseek(fp,-1L,1); //退一个字符
		c=reserve(token);         //
		if(c!=10){	
			wd.syn=c;
			strcpy(wd.value,token);
			return wd;
		}
		else{
			wd.syn=10;
			strcpy(wd.value,token);
			return wd;
		}
	}
	else 
		if(digit()){ //是否为数字,是的话继续取字符,直到取的词不是数字。
			while(digit()){		
				token[i]=ch;
			    ch=fgetc(fp);
			    i++;
			}
		fseek(fp,-1L,1);
        token[i]='\0';
		wd.syn=11;
		strcpy(wd.value,token);
		return wd;
	}
		else{
			switch(ch){ //判断可识别字符
			case '+': ch=fgetc(fp);
			        if(ch=='+'){
						wd.syn=13;
						wd.value[0]='+';
						wd.value[1]='+';
						wd.value[2]='\0';
						return wd;
						break;
					}
			        fseek(fp,-1L,1);
		            wd.syn=25;
					wd.value[0]='+';
					wd.value[1]='\0'; 
					return wd;
					break;
            case '-': wd.syn=14;
				wd.value[0]='-';
				wd.value[1]='\0'; 
				return wd;
				break;
		    case '*': wd.syn=15;
				wd.value[0]='*'; 
				wd.value[1]='\0';
				return wd; break;
            case '/': ch=fgetc(fp);
				if(ch=='*'){
						while(1){ 
							ch=fgetc(fp);
							if(ch=='*') { 
								ch=fgetc(fp);
								if(ch=='/') 
								    break;
							} 
						}
						wd.syn=-1; return wd;
						break;
					}
				else
					if(ch!='/'){
					    wd.syn=-1;
				        return wd;
				}
				wd.syn=16;
				wd.value[0]='/';
				wd.value[1]='\0';
			    fseek(fp,-1L,1);
				return wd;
				break;
          case '<': ch=fgetc(fp);
			        if(ch=='='){
						wd.syn=26;
						wd.value[0]='<';
						wd.value[1]='=';
						wd.value[2]='\0';  
						return wd;
						break;
					}
                    fseek(fp,-1L,1);
				    wd.syn=18;
					wd.value[0]='<';
					wd.value[1]='\0';  
					return wd; 
					break;
		  case ';': wd.syn=24;
			  wd.value[0]=';'; 
			  wd.value[1]='\0'; 
			  return wd;
			  break;
		  case '(': wd.syn=20;
			  wd.value[0]='('; 
			  wd.value[1]='\0';  
			  return wd; 
			  break;
		  case ')': wd.syn=21;
			  wd.value[0]=')';
			  wd.value[1]='\0';  
			  return wd; 
			  break;
		  case '{': wd.syn=22;
			  wd.value[0]='{'; 
			  wd.value[1]='\0';
			  return wd; 
			  break;
		  case '}': wd.syn=23;
			  wd.value[0]='}'; 
			  wd.value[1]='\0';
			  return wd;
			  break;
		  case ',': wd.syn=19;
			  wd.value[0]=','; 
			  wd.value[1]='\0';  
			  return wd;
			  break;
		  case '=': wd.syn=17;
			  wd.value[0]='='; 
			  wd.value[1]='\0'; 
			  return wd; 
			  break;
		  default : wd.syn=-1; 
			  return wd;
			  break;
		}
	}
}
int main(){
   WS wd;
   ch=0;
   if((fp=fopen("file.txt","r+"))==NULL) printf("文件打开失败"); 
   while(ch!=EOF){
	   wd=scaner();
	   if(wd.syn!=-1) {
		   print(&wd);
		   printf("\n");
	   }
   }
   fclose(fp);
   return 0;
}

⌨️ 快捷键说明

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