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

📄 main.c

📁 词法分析器的简易代码加解释
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h> 
#include<process.h> /* exit() */
#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=300,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=300+i; 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!=300) {	wd.syn=c;strcpy(wd.value,token); return wd;}
		else      { wd.syn=300;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=400;strcpy(wd.value,token);return wd;
	}
	else
	{
		switch(ch) //判断可识别字符
		{
		  case '+': ch=fgetc(fp);
			        if(ch=='+') {wd.syn=206;wd.value[0]='+';wd.value[1]='+'; wd.value[2]='\0';  return wd; break;}
			        if(ch=='=') {wd.syn=224;wd.value[0]='+';wd.value[1]='='; wd.value[2]='\0';  return wd; break;}
					fseek(fp,-1L,1);
		            wd.syn=201;wd.value[0]='+'; wd.value[1]='\0';  return wd; break;
          case '-': ch=fgetc(fp);
			        if(ch=='-') {wd.syn=207;wd.value[0]='-';wd.value[1]='-'; wd.value[2]='\0';  return wd; break;}
			        if(ch=='=') {wd.syn=225;wd.value[0]='-';wd.value[1]='='; wd.value[2]='\0';  return wd; break;}
			        fseek(fp,-1L,1);
					wd.syn=202;wd.value[0]='-'; wd.value[1]='\0';  return wd; break;
		             
		  case '*': wd.syn=203;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;
					}
                    if(ch=='/')
					{
					  wd.syn=-1; 
					  return wd;
					  break;
					}
                    fseek(fp,-1L,1);wd.syn=204;wd.value[0]='/'; wd.value[1]='\0'; return wd; break;
          case '<': ch=fgetc(fp);
			        if(ch=='='){ wd.syn=211;wd.value[0]='<';wd.value[1]='='; wd.value[2]='\0';  return wd; break;}
                    fseek(fp,-1L,1);
				    wd.syn=210;wd.value[0]='<'; wd.value[1]='\0';  return wd; break;
		  case '>': ch=fgetc(fp);
			        if(ch=='='){ wd.syn=209;wd.value[0]='>';wd.value[1]='='; wd.value[2]='\0';  return wd; break;}
                    fseek(fp,-1L,1);
				    wd.syn=208;wd.value[0]='>'; wd.value[1]='\0';  return wd; break;
		  case ';': wd.syn=245;wd.value[0]=';'; wd.value[1]='\0';  return wd; break;
		  case '(': wd.syn=239;wd.value[0]='('; wd.value[1]='\0';  return wd; break;
		  case ')': wd.syn=240;wd.value[0]=')'; wd.value[1]='\0';  return wd; break;
		  case '{': wd.syn=242;wd.value[0]='{'; wd.value[1]='\0';  return wd; break;
		  case '}': wd.syn=243;wd.value[0]='}'; wd.value[1]='\0';  return wd; break;
		  case ',': wd.syn=234;wd.value[0]=','; wd.value[1]='\0';  return wd; break;
		  case '=': wd.syn=223;wd.value[0]='='; wd.value[1]='\0';  return wd; break;
		  default : wd.syn=-1; return wd;break;
		}
	}
}
main()
{
   WS wd;
   ch=0;
   if((fp=fopen("LYF.txt","r+"))==NULL) printf("文件打开失败"); 
   while(ch!=EOF)
   {
	   wd=scaner(fp);
	   if(wd.syn!=-1) 
	   { print(&wd);printf("\n");}
   }
   fclose(fp);
   getch();
}

⌨️ 快捷键说明

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