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

📄 main.c

📁 词法分析器
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
#include<time.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]='\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;
					}
                    fseek(fp,-1L,1);wd.syn=16;wd.value[0]='-'; wd.value[1]='\0'; return wd; break;
          case '<': ch=fgetc(fp);
			        if(ch=='='){ wd.syn=26;wd.value[0]='-'; wd.value[1]='\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;
		}
	}
}
main()
{
   WS wd;
   ch=0;
   if((fp=fopen("file.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 + -