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

📄 cffx.cpp

📁 词法分析器
💻 CPP
字号:
#include"iostream.h"
#include"fstream.h"
bool isreservedword(char *token,int i) //判断是否为保留字;返回1保留字,返回0非保留字
{
	switch(i)
	{
	case 2 :
		if(token[0]=='i'&&token[1]=='f')
			return 1;
		else
			return 0;
		//break ;
	case 3 :
		if(token[0]=='i'&&token[1]=='n'&&token[2]=='t')
			return 1;
		else if(token[0]=='f'&&token[1]=='o'&&token[2]=='r')
			return 1;
		else
			return 0;
		//break ;
	case 4:
		if(token[0]=='c'&&token[1]=='h'&&token[2]=='a'&&token[3]=='r')
			return 1;
		else if(token[0]=='b'&&token[1]=='o'&&token[2]=='o'&&token[3]=='l')
			return 1;
		else if(token[0]=='v'&&token[1]=='o'&&token[2]=='i'&&token[3]=='d')
			return 1;
		else if(token[0]=='e'&&token[1]=='l'&&token[2]=='s'&&token[3]=='e')
			return 1;
		else if(token[0]=='c'&&token[1]=='a'&&token[2]=='s'&&token[3]=='e')
			return 1;
		else if(token[0]=='c'&&token[1]=='o'&&token[2]=='u'&&token[3]=='t')
			return 1;
		else
			return 0;
		//break ;
	case 5:
		if(token[0]=='f'&&token[1]=='l'&&token[2]=='o'&&token[3]=='a'&&token[4]=='t')
			return 1;
		else if(token[0]=='w'&&token[1]=='h'&&token[2]=='i'&&token[3]=='l'&&token[4]=='e')
			return 1;
		else if(token[0]=='b'&&token[1]=='r'&&token[2]=='e'&&token[3]=='a'&&token[4]=='k')
			return 1;
		else
			return 0;
		//break ;
	case 6:
		if(token[0]=='d'&&token[1]=='o'&&token[2]=='u'&&token[3]=='b'&&token[4]=='l'&&token[5]=='e')
			return 1;
		else if(token[0]=='s'&&token[1]=='w'&&token[2]=='i'&&token[3]=='t'&&token[4]=='c'&&token[5]=='h')
			return 1;
		else if(token[0]=='r'&&token[1]=='e'&&token[2]=='t'&&token[3]=='u'&&token[4]=='r'&&token[5]=='n')
			return 1;
		else
			return 0;
		//break ;
	case 7:
		if(token[0]=='d'&&token[1]=='e'&&token[2]=='f'&&token[3]=='a'&&token[4]=='u'&&token[5]=='l'&&token[6]=='t')
			return 1;
		else if(token[0]=='i'&&token[1]=='n'&&token[2]=='c'&&token[3]=='l'&&token[4]=='u'&&token[5]=='d'&&token[6]=='e')
			return 1;
		else
			return 0;
		//break ;
	default:
		return 0;
	}
}
void print(char *token ,int x) //回显函数
{
	cout<<" ";
	for(int i=0;i<x;i++)
	{
		cout<<token[i];
	}
	cout<<endl;
}
int getToken(ifstream infile) //返回0文件结束,返回1为数字,返回2为保留字,返回3为标识符,返回4为运算符,
                             //返回5发生错误,返回6注释,返回7字符,返回8符号,返回9字符串常量
{
	infile.seekg(-1,ios::cur); //前退一格
	char tok[256];
	int i=0;
	infile.get(tok[i]);
	while(tok[i]==' '||tok[i]=='\n'||tok[i]=='\t'||tok[i]=='\r'||tok[i]=='\b') //跳过不用处理的字符
	{
		infile.get(tok[i]);
	}
	if( tok[i]>='0' && tok[i]<='9') //首字符是数字
	{
		infile.get(tok[++i]);
		while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
		{
			infile.get(tok[++i]);
		}
		cout<<"Number       : ";
		print(tok,i);
		if(infile.eof())            //文件结束
			return 0;
		return 1;
	}
	else if( (tok[i]>='a'&&tok[i]<='z')||(tok[i]>='A'&&tok[i]<='Z') ) //首字符是字母
	{
		infile.get(tok[++i]);
		while( (tok[i]>='a'&&tok[i]<='z') || (tok[i]>='A'&&tok[i]<='Z') || (tok[i]>='0' && tok[i]<='9') )
		{
			infile.get(tok[++i]);
		}
		if(isreservedword(tok,i))
		{
			cout<<"ReservedWord : ";
			print(tok,i);
		    if(infile.eof())            //文件结束
			    return 0;
			return 2;
		}
		else
		{
			cout<<"ID           : ";
			print(tok,i);
		    if(infile.eof())            //文件结束
			    return 0;
			return 3;
		}
	}
	else  //首字符是符号
	{
		switch(tok[i])
		{
		case '+':     //首字符是'+'号
			infile.get(tok[++i]);
			switch(tok[i])
			{
			case '+':
				cout<<"Operator     : ++"<<endl;
				infile.seekg(1,ios::cur);
				return 4;
			case '=':
				cout<<"Operator     : +="<<endl;
				infile.seekg(1,ios::cur);
				return 4;
			case ' ':case 'a':case 'b':	case 'c':case 'd':case 'e':
			case 'f':case 'g':case 'h':	case 'i':case 'j':case 'k':
			case 'l':case 'm':case 'n':	case 'o':case 'p':case 'q':
			case 'r':case 's':case 't':	case 'u':case 'v':case 'w':
			case 'x':case 'y':case 'z':	case 'Z':case 'Y':case 'X':
			case 'A':case 'B':	case 'C':case 'D':case 'E':
			case 'F':case 'G':case 'H':	case 'I':case 'J':case 'K':
			case 'L':case 'M':case 'N':	case 'O':case 'P':case 'Q':
			case 'R':case 'S':case 'T':	case 'U':case 'V':
			case 'W':
				cout<<tok[--i]<<endl;
				return 4;
			case '0':case '1':case '2':case '3':case '4':case '5':
			case '6':case '7':case '8':
			case '9':
				infile.get(tok[++i]);
		        while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
				{
			          infile.get(tok[++i]);
				}
		        cout<<"Number       : ";
		        print(tok,i);
		        return 1;
			}
		case '-':     //首字符是'-'号
			infile.get(tok[++i]);
			switch(tok[i])
			{
			case '-':
				cout<<"Operator     : --"<<endl;
				infile.seekg(1,ios::cur);
				return 4;
			case '=':
				cout<<"Operator     : -="<<endl;
				infile.seekg(1,ios::cur);
				return 4;
			case ' ':case 'a':case 'b':	case 'c':case 'd':case 'e':
			case 'f':case 'g':case 'h':	case 'i':case 'j':case 'k':
			case 'l':case 'm':case 'n':	case 'o':case 'p':case 'q':
			case 'r':case 's':case 't':	case 'u':case 'v':case 'w':
			case 'x':case 'y':case 'z':	case 'Z':case 'Y':case 'X':
			case 'A':case 'B':	case 'C':case 'D':case 'E':
			case 'F':case 'G':case 'H':	case 'I':case 'J':case 'K':
			case 'L':case 'M':case 'N':	case 'O':case 'P':case 'Q':
			case 'R':case 'S':case 'T':	case 'U':case 'V':
			case 'W':
				cout<<tok[--i]<<endl;
				return 4;
			case '0':case '1':case '2':case '3':case '4':case '5':
			case '6':case '7':case '8':
			case '9':
				infile.get(tok[++i]);
		        while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
				{
			          infile.get(tok[++i]);
				}
		        cout<<"Number       : ";
		        print(tok,i);
		        return 1;
			default:
				cout<<"error"<<endl;
				return 5;
			} //end of second switch()
		case '/':  //首字符是'/'号
			infile.get(tok[++i]);
			switch(tok[i])
			{
			case '/':
				while(tok[i]!='\n'&& (!infile.eof()) )
				{
					infile.get(tok[++i]);
				}
				infile.seekg(1,ios::cur);
				cout<<"注释         : ";
				print(tok,i);
				return 6 ;
			case '*':
				while(tok[i]!='/')
				{
					while(tok[i]!='*')
					{
						infile.get(tok[++i]);
					}
					infile.get(tok[++i]);
				}
				infile.seekg(1,ios::cur);
				cout<<"注释           : ";
				print(tok,++i);
				return 6 ;
			case '=':
				infile.seekg(1,ios::cur);
				cout<<"Operator     : "<<endl;
				cout<<"/=";
				return 3;
			case 'a':case 'b':	case 'c':case 'd':case 'e':
			case 'f':case 'g':case 'h':	case 'i':case 'j':case 'k':
			case 'l':case 'm':case 'n':	case 'o':case 'p':case 'q':
			case 'r':case 's':case 't':	case 'u':case 'v':case 'w':
			case 'x':case 'y':case 'z':	case 'Z':case 'Y':case 'X':
			case 'A':case 'B':	case 'C':case 'D':case 'E':
			case 'F':case 'G':case 'H':	case 'I':case 'J':case 'K':
			case 'L':case 'M':case 'N':	case 'O':case 'P':case 'Q':
			case 'R':case 'S':case 'T':	case 'U':case 'V':
			case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
			case '6':case '7':case '8':
			case '9':
				cout<<"Operator     : ";
				cout<<"/"<<endl;
				return 3;
			default:
				cout<<"Error! : ";
				cout<<tok[--i]<<tok[i]<<endl;
				return 5;
			}
		case '>':   //首字符是'>'号
			infile.get(tok[++i]);
			switch(tok[i])
			{
			case '=':
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<">="<<endl;
				return 3;
			case '>':
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<">>"<<endl;
				return 3;
			case 'a':case 'b':	case 'c':case 'd':case 'e':
			case 'f':case 'g':case 'h':	case 'i':case 'j':case 'k':
			case 'l':case 'm':case 'n':	case 'o':case 'p':case 'q':
			case 'r':case 's':case 't':	case 'u':case 'v':case 'w':
			case 'x':case 'y':case 'z':	case 'Z':case 'Y':case 'X':
			case 'A':case 'B':	case 'C':case 'D':case 'E':
			case 'F':case 'G':case 'H':	case 'I':case 'J':case 'K':
			case 'L':case 'M':case 'N':	case 'O':case 'P':case 'Q':
			case 'R':case 'S':case 'T':	case 'U':case 'V':
			case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
			case '6':case '7':case '8':
			case '9':
				cout<<"Operator      : ";
				cout<<">"<<endl;
				return 3;
			default :
				cout<<"Error!       : ";
				cout<<tok[--i]<<tok[i]<<endl;
				return 5;
			}
		case '<':  //首字符是'<'号
			infile.get(tok[++i]);
			switch(tok[i])
			{
			case '=':
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<"<="<<endl;
				return 3;
			case '<':
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<"<<"<<endl;
				return 3;
			case 'a':case 'b':	case 'c':case 'd':case 'e':
			case 'f':case 'g':case 'h':	case 'i':case 'j':case 'k':
			case 'l':case 'm':case 'n':	case 'o':case 'p':case 'q':
			case 'r':case 's':case 't':	case 'u':case 'v':case 'w':
			case 'x':case 'y':case 'z':	case 'Z':case 'Y':case 'X':
			case 'A':case 'B':	case 'C':case 'D':case 'E':
			case 'F':case 'G':case 'H':	case 'I':case 'J':case 'K':
			case 'L':case 'M':case 'N':	case 'O':case 'P':case 'Q':
			case 'R':case 'S':case 'T':	case 'U':case 'V':
			case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
			case '6':case '7':case '8':
			case '9':
				cout<<"Operator     : ";
				cout<<"<"<<endl;
				return 3;
			default :
				cout<<"Error!       : ";
				cout<<tok[--i]<<tok[i]<<endl;
				return 5;
			}
		case '\'' :  //首字符是'号
			infile.get(tok[++i]);
			infile.get(tok[++i]);
			if(tok[i]!='\'')
			{
				cout<<"Error!       : ";
				infile.seekg(1,ios::cur);
				cout<<"\'"<<tok[--i]<<tok[i]<<endl;
				return 5;
			}
			else
			{
				infile.seekg(1,ios::cur);
				cout<<"char           : ";
				cout<<"\'"<<tok[--i]<<tok[i]<<endl;
				return 7;
			}
		case '\"' :  //首字符是"号
			infile.get(tok[++i]);
			while(tok[i]!='\"')
			{
				infile.get(tok[++i]);
			}
			infile.seekg(1,ios::cur);
			cout<<"字符串常量        : ";
			print(tok,++i);
			return 9;
		case ',':case '(':case ')':case '{':case '}': case '.':
		case '[':case ']':case ';':case ':': case '#':         //首字符是, ( ) { } [ ] ; :号
			infile.seekg(1,ios::cur);
			cout<<"  "<<tok[i]<<endl;
			return 8;
		case '&':    //首字符是'&'号
			infile.get(tok[++i]);
			if(tok[i]=='&')
			{
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<tok[--i]<<tok[i]<<endl;
				infile.seekg(1,ios::cur);
				return 3;
			}
			else
			{
				cout<<"Error!"<<endl;
				return 5;
			}
		case '|':  //首字符是'|'号
			infile.get(tok[++i]);
			if(tok[i]=='|')
			{
				cout<<"Operator     : ";
				cout<<tok[--i]<<tok[i]<<endl;
				infile.seekg(1,ios::cur);
				return 3;
			}
			else
			{
				cout<<"Error!"<<endl;
				return 5;
			}
		case '=':case '*':case '%':case '!':  //首字符是= * % !号
			infile.get(tok[++i]);
			if(tok[i]=='=')
			{
				infile.seekg(1,ios::cur);
				cout<<"Operator     : ";
				cout<<tok[--i]<<tok[i]<<endl;
				if(infile.eof())            //文件结束
			         return 0;
				return 3;
			}
			else
			{
				cout<<"Operator     : ";
				cout<<tok[--i]<<endl;
				if(infile.eof())            //文件结束
			       return 0;
				return 3;
			}


		} //end of fitst switch()


	} //end of else
	return 0;
}
void main()
{
	ifstream infile("cpp.dat",ios::in|ios::nocreate);
	if(!infile)
		cout<<"无法打开";
	else
	{
		
		infile.seekg(1,ios::cur);
		while(getToken(infile))
		{
			//getToken(infile);
		}		
	}
	char relay;
	cin>>relay;
	infile.close();
}

⌨️ 快捷键说明

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