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

📄 linetok.cpp

📁 虚拟机设计与实现——C/C++
💻 CPP
📖 第 1 页 / 共 2 页
字号:

					if(current=='0')
					{
						strcpy((*tptr).text,"$D10");
						(*tptr).type = TOK_DBL_REG;
						(*tptr).val = $D10;
					}
					else
					{
						strcpy((*tptr).text,"$D1");
						(*tptr).type = TOK_DBL_REG;
						(*tptr).val = $D1;
						goBackOneChar();
					}
				}break;
				case '2':
				{
					strcpy((*tptr).text,"$D2");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D2;
				}break;
				case '3':
				{
					strcpy((*tptr).text,"$D3");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D3;
				}break;
				case '4':
				{
					strcpy((*tptr).text,"$D4");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D4;
				}break;
				case '5':
				{
					strcpy((*tptr).text,"$D5");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D5;
				}break;
				case '6':
				{
					strcpy((*tptr).text,"$D6");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D6;
				}break;
				case '7':
				{
					strcpy((*tptr).text,"$D7");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D7;
				}break;
				case '8':
				{
					strcpy((*tptr).text,"$D8");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D8;
				}break;
				case '9':
				{
					strcpy((*tptr).text,"$D9");
					(*tptr).type = TOK_DBL_REG;
					(*tptr).val = $D9;
				}break;
				default: /* not 0-9*/
				{
					(*tptr).text[0]='$';
					(*tptr).text[1]='D';
					(*tptr).text[2]=current;
					(*tptr).text[3]='\0';
					(*tptr).type = TOK_BAD;
				}
			}/*end of $D switch*/

		}break;
		/*end case D*/
		case 'I':
		case 'i':
		{
			current = getNextLineChar();
			if((current=='P')||(current=='p'))
			{
				strcpy((*tptr).text,"$IP");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $IP;
			}
			else
			{
				(*tptr).text[0]='$';
				(*tptr).text[1]='I';
				(*tptr).text[2]=current;
				(*tptr).text[3]='\0';
				(*tptr).type = TOK_BAD;
			}

		}break;
		case 'B':
		case 'b':
		{
			current = getNextLineChar();
			if((current=='E')||(current=='e'))
			{
				strcpy((*tptr).text,"$BE");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $BE;
			}
			else
			{
				(*tptr).text[0]='$';
				(*tptr).text[1]='B';
				(*tptr).text[2]=current;
				(*tptr).text[3]='\0';
				(*tptr).type = TOK_BAD;
			}

		}break;
		case 'S':
		case 's':
		{
			current = getNextLineChar();
			if((current=='P')||(current=='p'))
			{
				strcpy((*tptr).text,"$SP");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $SP;
			}
			else if((current=='S')||(current=='s'))
			{
				strcpy((*tptr).text,"$SS");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $SS;
			}
			else
			{
				(*tptr).text[0]='$';
				(*tptr).text[1]='S';
				(*tptr).text[2]=current;
				(*tptr).text[3]='\0';
				(*tptr).type = TOK_BAD;
			}

		}break;
		case 'H':
		case 'h':
		{
			current = getNextLineChar();
			if((current=='S')||(current=='s'))
			{
				strcpy((*tptr).text,"$HS");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $HS;
			}
			else if((current=='E')||(current=='e'))
			{
				strcpy((*tptr).text,"$HE");
				(*tptr).type = TOK_INT_REG;
				(*tptr).val = $HE;
			}
			else
			{
				(*tptr).text[0]='$';
				(*tptr).text[1]='H';
				(*tptr).text[2]=current;
				(*tptr).text[3]='\0';
				(*tptr).type = TOK_BAD;
			}

		}break;
		case 'T':
		case 't':
		{
			current = getNextLineChar();
			if((current=='o')||(current=='O'))
			{
				current = getNextLineChar();
				if((current=='P')||(current=='p'))
				{
					strcpy((*tptr).text,"$TOP");
					(*tptr).type = TOK_INT_REG;
					(*tptr).val = $TOP;
				}
				else
				{
					(*tptr).text[0]='$';
					(*tptr).text[1]='T';
					(*tptr).text[2]='O';
					(*tptr).text[3]=current;
					(*tptr).text[4]='\0';
					(*tptr).type = TOK_BAD;
				}
			}
			else
			{
				(*tptr).text[0]='$';
				(*tptr).text[1]='T';
				(*tptr).text[2]=current;
				(*tptr).text[3]='\0';
				(*tptr).type = TOK_BAD;
			}

		}break;
		default:  /*NOT $R_,$F_,$D_, or $IP, $SP, $FP, $BE, $HS, $HE, $SS, $TOP*/
		{
			(*tptr).text[0]='$';
			(*tptr).text[1]=current;
			(*tptr).text[2]='\0';
			(*tptr).type = TOK_BAD;
		}
	}/*end switch*/

	return;

}/*end processRegister*/

/*-----------------------------------------------------------------*/

void LineTokenizer::processCharConst(struct Token *tptr)
{
	char current;
	char ch;
	ch = current = getNextLineChar();
	if((current>=32)&&(current<=126))
	{
		(*tptr).text[0]=current;
		(*tptr).text[1]='\0';
		(*tptr).val=current;
		(*tptr).type = TOK_CHAR_CONST;
		current = getNextLineChar();
		if(current!='\'')
		{
			(*tptr).text[0]='\'';
			(*tptr).text[1]=ch;
			(*tptr).text[2]=current;
			(*tptr).text[3]='\0';
			(*tptr).type = TOK_BAD; 
		}
	}
	else
	{
			(*tptr).text[0]='\'';
			(*tptr).text[1]=current;
			(*tptr).text[2]='\0';
			(*tptr).type = TOK_BAD; 
	}
	return;

}/*end processCharConstant*/

/*-----------------------------------------------------------------*/

void LineTokenizer::processIdentifier(struct Token *tptr, char ch)
{
	int i;
	char current;

	i=0;
	(*tptr).text[i]=ch;
	current = getNextLineChar();
	while(((current>='a')&&(current<='z'))||
		  ((current>='A')&&(current<='Z'))||
		  ((current>='0')&&(current<='9'))||
		  (current=='@')||
		  (current=='_')||
		  (current=='?')||
		  (current=='.'))
	{
		i++;
		(*tptr).text[i]=current;
		current = getNextLineChar();
	}
	i++;
	(*tptr).text[i]='\0';
	(*tptr).type=TOK_IDENTIFIER;
	goBackOneChar();
	return;

}/*end processIdentifier*/

/*-----------------------------------------------------------------*/

void LineTokenizer::processNumConst(struct Token *tptr, char ch)
{
	int i;
	char current;
	
	i=0;
	current = ch;

	if((current=='+')||(current=='-'))
	{
		(*tptr).text[i]=current;
		i++;
		current = getNextLineChar();
	}

	/* float/integer starts with 0-9 */

	if((current>='0')&&(current<='9')) 
	{
		/* if 0 is first digit, must be followed by decimal place*/

		if(current=='0')
		{
			current = getNextLineChar();
			if(current =='.')
			{ 
				current = '0';
				goBackOneChar(); 
			}
			else
			{
				(*tptr).text[i]=current;
				(*tptr).text[i+1]='\0';
				(*tptr).type = TOK_INT_CONST;
				return;
			}
		}

		while((current>='0')&&(current<='9'))
		{
			(*tptr).text[i]=current;
			i++;
			current = getNextLineChar();
		}

		/* digits end in decimal point*/

		if(current=='.')
		{
			(*tptr).text[i]='.';
			i++;
			current = getNextLineChar();
				
			if((current>='0')&&(current<='9'))
			{
				while((current>='0')&&(current<='9'))
				{
					(*tptr).text[i]=current;
					i++;
					current = getNextLineChar();
				}
			}
			else /* no digits following decimal point, required */
			{
				(*tptr).text[i]='\0';
				(*tptr).type = TOK_BAD;
				goBackOneChar();
				return;
			}

			if((current=='e')||(current=='E'))
			{
				(*tptr).text[i]=current;
				i++;
				current = getNextLineChar();

				if((current=='+')||(current=='-'))
				{
					(*tptr).text[i]=current;
					i++;
					current = getNextLineChar();
				}

				if((current>='0')&&(current<='9'))
				{
					while((current>='0')&&(current<='9'))
					{
						(*tptr).text[i]=current;
						i++;
						current = getNextLineChar();
					}

					(*tptr).text[i]='\0';
					(*tptr).type=TOK_FLT_CONST;
					(*tptr).fval = atof((*tptr).text);
					goBackOneChar();
					return;
				}
				else /*no digits after +/- */
				{
					(*tptr).text[i]='\0';
					(*tptr).type = TOK_BAD;
					goBackOneChar();
					return;
				}

			}
			else /*no e/E following .digits */
			{
				(*tptr).text[i]='\0';
				(*tptr).type=TOK_FLT_CONST;
				(*tptr).fval = atof((*tptr).text);
				goBackOneChar();
				return;
			}
		}
		
		/*digits end in e/E potential float*/
		
		else if((current=='e')||(current=='E')) 
		{
			(*tptr).text[i]=current;
			i++;
			current = getNextLineChar();

			if((current=='+')||(current=='-'))
			{
				(*tptr).text[i]=current;
				i++;
				current = getNextLineChar();
			}

			if((current>='0')&&(current<='9'))
			{
				while((current>='0')&&(current<='9'))
				{
					(*tptr).text[i]=current;
					i++;
					current = getNextLineChar();
				}
					
				(*tptr).text[i]='\0';
				(*tptr).type=TOK_FLT_CONST;
				(*tptr).fval = atof((*tptr).text);
				goBackOneChar();
				return;
			}
			else /*no digits after +/- */
			{
				(*tptr).text[i]='\0';
				(*tptr).type = TOK_BAD;
				goBackOneChar();
				return;
			}
		}
		
		/*digits do not end in decimal point or e/E, have integer*/
		
		else 
		{
			(*tptr).text[i]='\0';
			(*tptr).type = TOK_INT_CONST;
			(*tptr).val = stringToU8((*tptr).text);
			goBackOneChar();
			return;
		}
	}
	
	/*does start with 0-9  after +/- */

	else
	{
		(*tptr).text[0]='\0';
		(*tptr).type = TOK_BAD;
		goBackOneChar();
	}
	return;

}/*end processNumConstant*/

/*-----------------------------------------------------------------*/

U1 LineTokenizer::match(struct Token *tptr, int ttype)
{
	(*tptr) = getNextLineToken();
	if((*tptr).type!=ttype)
	{
		ERROR5("LineTokenizer::match(): %s:(%lu) expecting %s, not %s in \"%s\"\n",(*tptr).fName,(*tptr).line,TokStr[ttype],TokStr[(*tptr).type],(*tptr).text);
		return(FALSE);
	}
	LINE_TOK_DEBUG2("LineTokenizer::match(): OK text=%s type=%s\n",(*tptr).text,TokStr[(*tptr).type]);

	return(TRUE);

}/*end match*/

/*-----------------------------------------------------------------*/

void LineTokenizer::printToken(struct Token *tptr)
{
	printf("TOK-> file=%s line=%d type=%s ",(*tptr).fName,(*tptr).line,TokStr[(*tptr).type]);
	switch((*tptr).type)
	{
		case TOK_IDENTIFIER:{ printf("text=%s\n",(*tptr).text); }break;
		case TOK_INT_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
		case TOK_FLT_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
		case TOK_DBL_REG:{ printf("text=%s val=%d\n",(*tptr).text,(*tptr).val); }break;
		case TOK_CHAR_CONST:{ printf("text=%s\n",(*tptr).text); }break;
		case TOK_INT_CONST:
		{ 
			printf("text=%s val=",(*tptr).text); 
			pS8((*tptr).val);
			printf("\n");
		}break;
		case TOK_FLT_CONST:{ printf("text=%s fval=%g\n",(*tptr).text,(*tptr).fval); }break;
		case TOK_COMMA:{ printf("text=%s\n",(*tptr).text);}break;
		case TOK_NO_MORE:{ printf("text=%s\n",(*tptr).text);}break;
		case TOK_BAD:{ printf("text=%s\n",(*tptr).text);}break;
	}
	return;

}/*end printToken*/

⌨️ 快捷键说明

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