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

📄 mycompiler.cpp

📁 这可是我的倾情制作
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				lexbegin = lexforward;
			}
			else if(CurChar == '\n')
			{
				LineNO ++;ColNO=0;
				MoveToNextChar();
				lexbegin = lexforward;
			}
			else if(CurChar == '0') state = 2;	/*Deal with Hex and Oct Integer Num*/
			else if(isdigit(CurChar)) state = 9;	/*Deal with Dec and Float Num*/
			else if(isalpha(CurChar)||CurChar == '_') state = 18;	/*Deal with Identifier*/
			else
			switch(CurChar)
			{
				case '>':state = 20;	/*Deal with beginning of '>' including: >, >=, >> */
					break;
				case '-':state = 24;	/*Deal with beginning of '-' including: -, -=, --, ->*/
					break;
				case '<':state = 29;	/*Deal with beginning of '<' including: <, <=, << */
					break;
				case '+':state = 33;	/*Deal with beginning of '+' including: +, ++, += */
					break;
				case '*':state = 37;	/*Deal with beginning of '*' including: *, *= */
					break;
				case '/':state = 40;	/*Deal with beginning of '/' including: /, /=, Comment begin and end */
					break;
				case '|':state = 46;	/*Deal with beginning of '|' including: |, || */
					break;
				case '&':state = 49;	/*Deal with beginning of '&' including: &, && */
					break;
				case '!':state = 50;	/*Deal with beginning of '!' including: !, != */
					break;
				case '~':state = 52;	/*Deal with beginning of '~' including: ~ */
					break;
				case '^':state = 54;	/*Deal with beginning of '^' including: ^ */
					break;
				case '=':state = 55;	/*Deal with beginning of '=' including: =, == */
					break;
				case '?':state = 58;	/*Deal with beginning of '?' including: ? */
					break;
				case '.':state = 59;	/*Deal with beginning of '.' including: . */
					break;
				case ',':state = 60;	/*Deal with beginning of ',' including: , */
					break;
				case ':':state = 61;   	/*Deal with beginning of ':' including: : */
					break;
				case ';':state = 62;	/*Deal with beginning of ';' including: ; */
					break;
				case '(':state = 63;	/*Deal with beginning of '(' including: ( */
					break;
				case ')':state = 64;	/*Deal with beginning of ')' including: ) */
					break;
				case '[':state = 65;	/*Deal with beginning of '[' including: [ */
					break;
				case ']':state = 66;	/*Deal with beginning of ']' including: ] */
					break;
				case '{':state = 67;	/*Deal with beginning of '{' including: } */
					break;
				case '}':state = 68;	/*Deal with beginning of '}' including: } */
					break;
				case '#':state = 69;	/*Deal with beginning of '#' including: # */
					break;
				case '%':state = 70;	/*Deal with beginning of '%' including: % , %= */
					break;
				case '"':state = 73;	/*Deal with beginning of '"' including: constant character string and escape char*/
					break;
				case '\'':state = 78;	/*Deal with beginning of '\'' including: one char included */
					break;
				case '@':state = 80;	/*Deal with Syntax variable*/
					break;
				case '$':
					MoveToNextChar();
					lexbegin = lexforward;
					return PFINISH;	/*Deal with Syntax Product a line*/
				case EOF:
					return DONE;
				default:error("Unlegal char!");
					MoveToNextChar();
					lexbegin = lexforward;
					state = 1;
					break;
			}/*switch(CurChar)*/
			break;
		case 2: /*Deal with Oct and Hex Integer num*/
			MoveToNextChar();
			if(CurChar == 'x' || CurChar == 'X')
				state = 3;
			else if (isdigit(CurChar) && CurChar != '9' && CurChar != '8')
				state = 6;
			token1 = 0;
			lexbegin = lexforward;
			return (NUM1);
		case 3: /*Deal with Hex Integer */
			do{
			MoveToNextChar();
			}while(isxdigit(CurChar));
			lexbegin = lexforward;
			if(AbsoluteLength() == 2)
			{
				state = 1;
				error("Hex constant num after 0x should have num!");
				break;
			}
			GetIntoLexBufferFromInputBuffer();
			lexbegin = lexforward;
			state = 0;
			token1 = strtol (LexBuffer,&endptr,16);
			return (NUM1);
		case 6: /*Deal with Oct Integer or turn to state Dec float num*/
			do{
			MoveToNextChar();
			}while(isdigit(CurChar));
			if(CurChar == '.')
			{
				/*MidIntUse = strtol(LexBuffer,&endptr,10);*/
				state = 10;
				break;
			}
			GetIntoLexBufferFromInputBuffer();
			lexbegin = lexforward;
			for(Counter = 0;LexBuffer[Counter] != '\0';Counter ++)
				if(LexBuffer[Counter]=='9'||LexBuffer[Counter]=='8')
				{
				state = 1;
				error("Integer num began with 0 should be Oct which should not include 8,9!");
				break;
				}
			if(LexBuffer[Counter] != '\0') break;
			token1 = strtol(LexBuffer,&endptr,8);
			/*state = 0;*/
			return NUM1;
		case 9: /*Deal with Dec and Float Num*/
			while(isdigit(CurChar))
				MoveToNextChar();
			switch(CurChar)
			{
				case '.':
					state = 10;
					break;
				case 'e':case'E':
					state = 12;
					break;
				default:
					GetIntoLexBufferFromInputBuffer();
					lexbegin = lexforward;
					token1 = strtol(LexBuffer,&endptr,10);
					return NUM1;
			}/*switch (CurChar)*/
			break;
		case 10:/*Deal with float num after Recognize integer part*/
			do{
			MoveToNextChar();
			}while(isdigit(CurChar));
			if(CurChar == 'E' || CurChar == 'e')
			{
				state = 12;
				break;
			}
			GetIntoLexBufferFromInputBuffer();
			lexbegin = lexforward;
			token2 = strtod(LexBuffer,&endptr);
			return NUM2;
		case 12:/*Deal with scientific num */
			MoveToNextChar();
			if(!(isdigit(CurChar)||CurChar=='+'||CurChar=='-'))
			{
				error("After E/e Should +/-/_/digit!");
				state = 1;
				break;
				/*return ERROR;*/
			}
			do{
			MoveToNextChar();
			}while(isdigit(CurChar));
			GetIntoLexBufferFromInputBuffer();
			lexbegin = lexforward;
			token2 = strtod(LexBuffer,&endptr);
			return NUM2;
		case 18:/*Deal with identifier which may be ID or key words*/
			do{
			MoveToNextChar();
			}while(isdigit(CurChar)||isalpha(CurChar)||CurChar == '_');
			GetIntoLexBufferFromInputBuffer();
			lexbegin = lexforward;
			/*Determine whether it is key words*/
			/*if it is , we just return the key words TokenNum */
			/*if it is not , we insert it into SymbolTable return ID tokennum*/
			TempSymbol = LookWordsUpSymbolTable(::G_SymbolTable,LexBuffer);
			if(TempSymbol == NULL)
				if((TempSymbol = ::LookWordsUpSymbolTable(::CurSymbolTable,LexBuffer))== NULL)
					TempSymbol = InsertIntoSymbolTable(::CurSymbolTable,LexBuffer,ID);
			CurSymbol = TempSymbol;
			return CurSymbol->TokenNum;
		case 20:/*Deal with beginning of '>' including: >, >=, >> */
			MoveToNextChar();
			switch(CurChar)
			{
				case '>':/* >> */
					MoveToNextChar();
					lexbegin = lexforward;
					return BMOVR;
				case '=':/* >= */
					MoveToNextChar();
					lexbegin = lexforward;
					return RLARQ;
				default :/* > */
					lexbegin = lexforward;
					return RLARG;
			}
		case 24:/*Deal with beginning of '-' including: -, -=, --, ->*/
			MoveToNextChar();
			switch(CurChar)
			{
				case '-':/* -- */
					MoveToNextChar();
					lexbegin = lexforward;
					return DEE;
				case '=':/* -= */
					MoveToNextChar();
					lexbegin = lexforward;
					return DEQ;
				case '->':/* -> */
					MoveToNextChar();
					lexbegin = lexforward;
					return POINTTO;
				default: /* - */
					return DEC;
			}
		case 29:/*Deal with beginning of '<' including: <, <=, << */
			MoveToNextChar();
			switch(CurChar)
			{
				case '<':/*<<*/
					MoveToNextChar();
					lexbegin = lexforward;
					return BMOVL;
				case '=':/* <= */
					MoveToNextChar();
					lexbegin = lexforward;
					return RSMAQ;
				default :/* < */
					lexbegin = lexforward;
					return RSMAL;
			}
		case 33:/*Deal with beginning of '+' including: +, ++, += */
			MoveToNextChar();
			switch(CurChar)
			{
				case '+':/*++*/
					MoveToNextChar();
					lexbegin = lexforward;
					return INC;
				case '=':/*+=*/
					MoveToNextChar();
					lexbegin = lexforward;
					return INQ;
				default : /*+*/
					lexbegin = lexforward;
					return ADD;
			};
		case 37:/*Deal with beginning of '*' including: *, *= */
			MoveToNextChar();
			lexbegin = lexforward;
			if(CurChar != '=')
				return MUL;
			MoveToNextChar();
			lexbegin = lexforward;
			return MUQ;
		case 40:/*Deal with beginning of '/' including: /, /=, Comment begin and end */
			MoveToNextChar();
			switch(CurChar)
			{
				case '=':/* /=*/
					MoveToNextChar();
					lexbegin = lexforward;
					return DIQ;
				case '*':/* Commends begin */
					do
					{
					MoveToNextChar();
					lexbegin = lexforward;
					if(CurChar == '\n')
					{
						LineNO ++;ColNO = 0;
					}
					else	ColNO ++;
					if(CurChar == '*')
					{
						MoveToNextChar();
						lexbegin = lexforward;
						if(CurChar == '/')
						{
							state = 1;
							break;
						}
						ColNO ++;
					}
					}while(1);
					break;
				default:/* div / */
					lexbegin = lexforward;
					return DIV;
			};
			break;
		case 46:/*Deal with beginning of '|' including: |, || ,|=*/
			MoveToNextChar();
			switch(CurChar)
			{
				case '|':/* || */
					MoveToNextChar();
					lexbegin = lexforward;
					return LOR;
				case '=':/* |= */
					MoveToNextChar();
					lexbegin = lexforward;
					return BORQ;
				default :/* | */
					MoveToNextChar();
					lexbegin = lexforward;
					return BOR;
			}
		case 49:/*Deal with beginning of '&' including: &, && ,&=*/
			MoveToNextChar();
			switch(CurChar)
			{
				case '&':/* & */
					MoveToNextChar();
					lexbegin = lexforward;
					return LAND;
				case '=':/* &= */
					MoveToNextChar();
					lexbegin = lexforward;
					return BANDQ;
				default :/* & */
					lexbegin = lexforward;
					return BAND;
			}
		case 50:/*Deal with beginning of '!' including: !, != */
			MoveToNextChar();
			lexbegin = lexforward;
			if(CurChar != '=')
				return LNOT;
			MoveToNextChar();
			lexbegin = lexforward;
			return	RNOTQ;
		case 54:/*Deal with beginning of '^' including: ^,^= */
			MoveToNextChar();
			lexbegin = lexforward;
			if(CurChar != '=')
				return BEOR;
			MoveToNextChar();
			lexbegin = lexforward;
			return	BEORQ;
		case 55:/*Deal with beginning of '=' including: =, == */
			MoveToNextChar();
			lexbegin = lexforward;
			if(CurChar != '=')
				return EQUA;
			MoveToNextChar();
			lexbegin = lexforward;
			return REQUA;
		case 58:/*Deal with beginning of '?' including: ? */
			MoveToNextChar();
			lexbegin = lexforward;
			return QUES;
		case 59:/*Deal with beginning of '.' including: . */
			MoveToNextChar();
			lexbegin = lexforward;
			return DOT;
		case 60:/*Deal with beginning of ',' including: , */
			MoveToNextChar();
			lexbegin = lexforward;
			return COMA;
		case 61:/*Deal with beginning of ':' including: : */
			MoveToNextChar();
			lexbegin = lexforward;
			return COLON;
		case 62:/*Deal with beginning of ';' including: ; */
			MoveToNextChar();
			lexbegin = lexforward;
			return SCOLON;

⌨️ 快捷键说明

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