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

📄 linetok.c

📁 < 虚拟机设计与实现>>的 windows版本
💻 C
📖 第 1 页 / 共 2 页
字号:
			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;
		
	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;

}

void processCharConst(struct Token *tptr)
{
	char current;
	char ch;

	current = getNextLineChar();
	ch = current;
	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;

}

void 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;

}

void 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] = '0';
				(*tptr).text[i + 1] = '\0';
				(*tptr).type = TOK_INT_CONST;
				(*tptr).val = stringToU8((*tptr).text);
				goBackOneChar();
				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;
			}
		}
		else if ((current == 'e') || (current == 'E')) 
		{
			/*digits end in e/E potential float*/
			(*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 
		{
			/*digits do not end in decimal point or e/E, have integer*/
			(*tptr).text[i] = '\0';
			(*tptr).type = TOK_INT_CONST;
			(*tptr).val = (S8)stringToU8((*tptr).text);
			goBackOneChar();
			return;
		}
	}
	else
	{
		(*tptr).text[i] = '\0';
		(*tptr).type = TOK_BAD;
		goBackOneChar();
	}
	return;

}

void processComment(struct Token *tptr, char ch)
{
	int i;
	char current;

	i = 0;
	current = ch;
	while (current != EOL)
	{	
		(*tptr).text[i] = current;
		i++;
		current = getNextLineChar();
	}
	
	(*tptr).text[i] = '\0';
	(*tptr).type = TOK_IDENTIFIER;
	goBackOneChar();
	return;

}

U1 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;

}

void 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;

}

void goBackOneChar()
{
	if (itChars >= 0)
	{ 
		itChars--; 
	}
	else
	{ 
		LINE_TOK_DEBUG1("goBackOneChar(): decrement below 0, %d\n", itChars); 
	} 
	return;

}

⌨️ 快捷键说明

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