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

📄 scan.h

📁 scan编译器得前端得扫描程序 属于便一起的一部分
💻 H
字号:
#include"gloab.h"

enum tokentype{IF=1,ELSE,WHILE,INT,VOID,RETURN,
			   NUM,ID,
			   PLU,SUB,MUL,DIV,XY,XYD,DAY,DYD,DY,BDY,FZ,FH,DH,LS,RS,LM,RM,LL,RL,
			   ENDF,ERROR};                                                                  //token列表



enum statetype{START,DONE,INNUM,INID,NEQ,EQ,DA,XIA,CH,ZS,ZSZ};                             //状态列表




char keys[7][7]={" ","if","else","while","int","void","return"};                        //关键字表



char let[51]; 
char letline[102];                                                   //当前行
bool tag=true;
int pro=0;                                                                            //属性
int fre=0;
int now=0;



char* fchars()
{
	char c[15];
	if(fre>now)
	{
		for(int i=fre;i<=100;i++)
			c[i-fre]=letline[i];
		for(int j=0;j<now;j++)
			c[i-fre+j]=letline[j];
		c[i-fre+j]='\0';
	}
	else
	{
		int t=0;
		for(int i=fre;i<now;i++)
		{
			if(i==50)
				t=1;
			else
				c[i-fre-t]=letline[i];
		}
		c[i-fre-t]='\0';
	}
	return c;
}



tokentype isid()                                                                         //判断id是否为关键字
{
	char *cl=fchars();
	tokentype g;
	int i=6;
	strcpy(keys[0],cl);
	while(1)
	{
		if(strcmp(cl,keys[i])==0)
		{g=(tokentype)i;break;}
		i--;
	}
	if(g)
		return g;
	else
		return ID;
}
void inum()                                                                          //提取当前int型
{
	char *cl=fchars();
	int cnum=0;
	int i=0;
	while(cl[i]!='\0')
	{
		cnum=cnum*10+(int)(cl[i])-48;
		i++;
	}
	cout<<cnum<<' ';
}












char nextchar()
{
	if(now==49)
	{
		if(!tag)
		{filetxt.get(let,51,EOF);strcpy(letline+51,let);tag=true;}
		now=51;
		return letline[now++];
	}
	else if(now==100)
	{
		if(tag)
		{filetxt.get(let,51,EOF);strcpy(letline,let);tag=false;}
		now=0;		
		return letline[now++];
	}
	else return letline[now++];
}
void unnextchar()
{
	if(now==0)
		now=100;
	else if(now==51)
		now=49;
	else now--;
}





/*        sybol  + - * / < <= > >= == != = ; , ( ) [ ] { }       */

tokentype nexttoken()
{
	tokentype currentoken;
	statetype state=START;
	pro=-1;
	while(state!=DONE)
	{
		char c=nextchar();
		switch(state)
		{
		case START:
			if(isdigit(c))
				state=INNUM;
			else if(isalpha(c))
				state=INID;
			else if((c==' ')||(c=='\t'))
				fre=now;
			else if(c=='\n')
			{lineno++;fre=now;}
			else if((c=='!'))
				state=NEQ;
			else if((c=='='))
				state=EQ;
			else if((c=='>'))
				state=DA;
			else if((c=='<'))
				state=XIA;
			else if((c=='/'))
				state=CH;
			else {
				state=DONE;
				fre=now;
				switch(c)
				{
				case '+':currentoken=PLU;break;
				case '-':currentoken=SUB;break;
				case '*':currentoken=MUL;break;
				case '(':currentoken=LS;break;
				case ')':currentoken=RS;break;
				case '[':currentoken=LM;break;
				case ']':currentoken=RM;break;
				case '{':currentoken=LL;break;
				case '}':currentoken=RL;break;
				case ';':currentoken=FH;break;
				case ',':currentoken=DH;break;
				case 3:currentoken=ENDF;break;
				default:currentoken=ERROR;break;
				}
			}
			break;
		case INNUM:
			{
				if(!isdigit(c))
				{
					unnextchar();
					currentoken=NUM;
					state=DONE;
				}
				break;
			}
		case INID:
			{
				if(!(isdigit(c)||isalpha(c)))
				{
					unnextchar();
					currentoken=ID;
					state=DONE;
				}
				break;
			}
		case NEQ:
			{
				if(c=='=')
				{
					currentoken=BDY;
					state=DONE;
					fre=now;
				}
				else	
				{
					unnextchar();
					currentoken=ERROR;
					state=DONE;
					fre=now;
				}
				break;
			}
		case EQ:
			{
				if(c=='=')
				{
					currentoken=DY;
					state=DONE;
					fre=now;
				}
				else	
				{
					unnextchar();
					currentoken=FZ;
					state=DONE;
					fre=now;
				}
				break;
			}
		case DA:
			{
				if(c=='=')
				{
					currentoken=DYD;
					state=DONE;
					fre=now;
				}
				else	
				{
					unnextchar();
					currentoken=DY;
					state=DONE;
					fre=now;
				}
				break;
			}
		case XIA:
			{
				if(c=='=')
				{
					currentoken=XYD;
					state=DONE;
					fre=now;
				}
				else	
				{
					unnextchar();
					currentoken=XY;
					state=DONE;
					fre=now;
				}
				break;
			}
		case CH:
			{
				if(c=='*')
					state=ZS;
				else
				{
					unnextchar();
					currentoken=DIV;
					state=DONE;
					fre=now;
				}
				break;
			}
		case ZS:
			{
				if(c=='*')
					state=ZSZ;
				break;
			}
		case ZSZ:
			{
				if(c=='/')
				{state=START;fre=now;}
				else
					state=ZS;
				break;
			}
		case DONE:
		default:
			cout<<"state ERROR!!"<<endl;
			state=DONE;
			currentoken=ERROR;
			break;
		}
		
	}
	if(currentoken==ID)
			currentoken=isid();
	if(currentoken==NUM)
			inum();
	return currentoken;

}

⌨️ 快捷键说明

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