finctoken.c

来自「FinC编译器源代码」· C语言 代码 · 共 1,354 行 · 第 1/2 页

C
1,354
字号
			}			token_prev_char(self);		}		break;	}	return result;}/*(0|0x|0X|0b|0B)number+((.)number+)(e|E)(+|-)number+(f|F|l|L|u|U)*/static void token_proc_number(FinCTokenEnv* self){	char ch;	int b;	char *p, buf[128];	#ifdef USING_LONG_DOUBLE	long double factor;	#else	float factor;	#endif	unsigned int expo;	int sign;	#ifdef USING_LONG_DOUBLE	long double value;	#else	float value;	#endif	sign = +1;	value = 0.L;	p = buf;	b = 10;	factor = 0.0;	ch  = token_next_char(self);	if ( ch == '0' )	{		ch = token_next_char(self);		if ( ch == 'x' || ch == 'X' )/*it's a hex number*/		{			b = 16;			ch = token_next_char(self);			while ( is_digit(ch) || isalpha(ch) )			{				*p++ = ch;				ch = token_next_char(self);			}			*p = '\0';		}		else if ( ch == 'b' || ch == 'B' )		{			b = 2;			ch = token_next_char(self);			while ( (ch=='0')||(ch=='1') )			{				*p++ = ch;				ch = token_next_char(self);			}			*p = '\0';		}		else if ( ch == '.' )		{			goto float_label;		}		else		{			b = 8;			while ( is_digit(ch) )			{				*p++ = ch;				ch = token_next_char(self);			}			*p = '\0';		}		self->last_double = token_spec_number(buf, strlen(buf), b);		self->current_token = FinCTokenType_Int;	}	else	{		while ( is_digit(ch) )		{			value = value*10 + ( ch - '0' );			ch = token_next_char(self);		}		if ( ch == '.' )		{float_label:			factor = 1.0;			ch = token_next_char(self);			while ( is_digit(ch) )			{				factor *= 0.1;				value += ( ch - '0' )*factor;				ch = token_next_char(self);			}		}		if ( ch == 'e' || ch == 'E' )		{			expo = 0;			factor = 10.L;			ch = token_next_char(self);			switch (ch)			{			case '-': factor = 0.1;			case '+':				ch = token_next_char(self);				break;			default:				if ( is_digit(ch) ) break;				else				{					value = 0.L;					goto done;				}			}			while ( is_digit(ch) )			{				expo = 10*expo + (ch - '0' );				ch = token_next_char(self);			}			while (1)			{				if (expo & 1) value *= factor;				if ((expo >>=1) == 0) break;				factor *= factor;			}		}done:		self->last_double = value;		#ifdef USING_FLOAT		if (factor != 0.0) 		{			self->last_float = value;			self->current_token = FinCTokenType_Float;		}		else		#endif		{			self->current_token = FinCTokenType_Int;		}	}	switch ( ch )	{	#ifdef USING_FLOAT	case 'f':	case 'F':		self->current_token = FinCTokenType_Float;		break;	#endif	case 'l':	case 'L':		self->current_token = FinCTokenType_Long;		break;		#ifdef USING_DOUBLE	case 'd':	case 'D':		self->current_token = FinCTokenType_Double;		break;	#endif	default:		token_prev_char(self);		break;	}}/*use 64 bit number*/#define BN_SIZE 2#ifdef USING_DOUBLEstatic double token_spec_number(char* string, int length, int b)#elsestatic long token_spec_number(char* string, int length, int b)#endif{	char* p;	int t;	int i, j, shift=1;	unsigned int bn[BN_SIZE], v;	#ifdef USING_DOUBLE	double d;	#else	long d;	#endif	p = string;	i = 0;	switch ( b )	{	case 16: shift = 4;		break;	case 8:  shift = 3;		break;	case 2:  shift = 1;		break;	default: break;	}	for ( j=0; j<BN_SIZE ; j++) bn[j] = 0;	while ( i<length )	{		t = *p++;		if ( t>='a' && t <='f' )		{			t = t - 'a' +10;		}		else if ( t >='A' && t <='F' )		{			t = t - 'A' +10;		}		else t = t - '0';		for ( j=0; j<BN_SIZE ; j++)		{			v = bn[j];			bn[j] = (v<<shift) | t;			t = v >> (32 - shift);		}		i++;	}	#ifdef USING_DOUBLE	d = (double)bn[1] * 4294967296.0 + (double)bn[0];	#else	d = (long)bn[0];	#endif	return d;}#ifdef FINC_TOKEN_DEBUGvoid finc_token_debug(FinCTokenEnv* token){	switch (token->current_token)	{	case FinCTokenType_Left_Paren :	kprintf("(");	break;	case FinCTokenType_Right_Paren :	kprintf(")");	break;	case FinCTokenType_Left_Curly :	kprintf("{");	break;	case FinCTokenType_Right_Curly :	kprintf("}");	break;	case FinCTokenType_Left_Brace :	kprintf("[");	break;	case FinCTokenType_Right_Brace :	kprintf("]");	break;	case FinCTokenType_Comma :	kprintf(",");	break;	case FinCTokenType_Colon :	kprintf(":");	break;	case FinCTokenType_Semicolon :	kprintf(";");	break;	case FinCTokenType_Dot :	kprintf(".");	break;	case FinCTokenType_Question :	kprintf("?");	break;	case FinCTokenType_Not :	kprintf("!");	break;	case FinCTokenType_Not_Eqs:	kprintf("!=");	break;	case FinCTokenType_And:	kprintf("&");	break;	case FinCTokenType_Logic_And:	kprintf("&&");	break;	case FinCTokenType_Mul :	kprintf("*");	break;	case FinCTokenType_Add :	kprintf("+");	break;	case FinCTokenType_Inc:	kprintf("++");	break;	case FinCTokenType_Sub :	kprintf("-");	break;	case FinCTokenType_Dec:	kprintf("--");	break;	case FinCTokenType_Div :	kprintf("/");	break;	case FinCTokenType_Mod :	kprintf("mod");	break;	case FinCTokenType_Assign :	kprintf("=");	break;	case FinCTokenType_Eq:	kprintf("=");	break;	case FinCTokenType_GT :	kprintf(">");	break;	case FinCTokenType_Greater_Eqs:	kprintf(">=");	break;	case FinCTokenType_LT :	kprintf("<");	break;	case FinCTokenType_Less_Eqs:	kprintf("<=");	break;	case FinCTokenType_Logic_Or:	kprintf("||");	break;	case FinCTokenType_Or:	kprintf("|");	break;	case FinCTokenType_Char:	kprintf("char");	break;	case FinCTokenType_Short:	kprintf("short");	break;	case FinCTokenType_String:	kprintf("string");	break;	case FinCTokenType_Int:	kprintf("int");	break;	#ifdef USING_FLOAT	case FinCTokenType_Float:	kprintf("float");	break;	#endif	#ifdef USING_DOUBLE	case FinCTokenType_Double:	kprintf("double");	break;	#endif	case FinCTokenType_Long:	kprintf("long");	break;	case FinCTokenType_Type_Void:	kprintf("void");	break;	case FinCTokenType_Type_Int:	kprintf("type:int");	break;	case FinCTokenType_Type_Char:	kprintf("type:char");	break;	case FinCTokenType_Type_Short:	kprintf("type:short");	break;	#ifdef USING_DOUBLE	case FinCTokenType_Type_Double:	kprintf("type:double");	break;	#endif	#ifdef USING_FLOAT	case FinCTokenType_Type_Float:	kprintf("type:float");	break;	#endif	case FinCTokenType_Type_Bool:	kprintf("type:bool");	break;	case FinCTokenType_Type_Pointer:	kprintf("type:pointer");	break;	case FinCTokenType_Type_String:	kprintf("type:string");	break;	case FinCTokenType_Static:	kprintf("static");	break;	case FinCTokenType_Unsigned:	kprintf("unsigned");	break;	case FinCTokenType_Struct:	kprintf("struct");	break;	case FinCTokenType_False:	kprintf("false");	break;	case FinCTokenType_True:	kprintf("true");	break;	case FinCTokenType_Null:	kprintf("null");	break;	case FinCTokenType_For:	kprintf("for");	break;	case FinCTokenType_While:	kprintf("while");	break;	case FinCTokenType_If:	kprintf("if");	break;	case FinCTokenType_Else:	kprintf("else");	break;	case FinCTokenType_Return:	kprintf("return");	break;	case FinCTokenType_Break:	kprintf("break");	break;	case FinCTokenType_Continue:	kprintf("continue");	break;	case FinCTokenType_Import:	kprintf("import");	break;	case FinCTokenType_Package:	kprintf("package");	break;	case FinCTokenType_Addrof:	kprintf("addrof");	break;	case FinCTokenType_Valueof:	kprintf("valueof");	break;	case FinCTokenType_Identifier:	kprintf("id");	break;	case FinCTokenType_Eof:	kprintf("eof\n");	break;	case FinCTokenType_Bad:	kprintf("bad");	break;	}}void finc_token_expect(FinCTokenType token){	switch (token)	{	case FinCTokenType_Left_Paren :	kprintf("(");	break;	case FinCTokenType_Right_Paren :	kprintf(")");	break;	case FinCTokenType_Left_Curly :	kprintf("{");	break;	case FinCTokenType_Right_Curly :	kprintf("}");	break;	case FinCTokenType_Left_Brace :	kprintf("[");	break;	case FinCTokenType_Right_Brace :	kprintf("]");	break;	case FinCTokenType_Comma :	kprintf(",");	break;	case FinCTokenType_Colon :	kprintf(":");	break;	case FinCTokenType_Semicolon :	kprintf(";");	break;	case FinCTokenType_Dot :	kprintf(".");	break;	case FinCTokenType_Question :	kprintf("?");	break;	case FinCTokenType_Not :	kprintf("!");	break;	case FinCTokenType_Not_Eqs:	kprintf("!=");	break;	case FinCTokenType_And:	kprintf("&");	break;	case FinCTokenType_Logic_And:	kprintf("&&");	break;	case FinCTokenType_Mul :	kprintf("*");	break;	case FinCTokenType_Add :	kprintf("+");	break;	case FinCTokenType_Inc:	kprintf("++");	break;	case FinCTokenType_Sub :	kprintf("-");	break;	case FinCTokenType_Dec:	kprintf("--");	break;	case FinCTokenType_Div :	kprintf("/");	break;	case FinCTokenType_Mod :	kprintf("mod");	break;	case FinCTokenType_Assign :	kprintf("=");	break;	case FinCTokenType_Eq:	kprintf("=");	break;	case FinCTokenType_GT :	kprintf(">");	break;	case FinCTokenType_Greater_Eqs:	kprintf(">=");	break;	case FinCTokenType_LT :	kprintf("<");	break;	case FinCTokenType_Less_Eqs:	kprintf("<=");	break;	case FinCTokenType_Logic_Or:	kprintf("||");	break;	case FinCTokenType_Or:	kprintf("|");	break;	case FinCTokenType_Char:	kprintf("char");	break;	case FinCTokenType_Short:	kprintf("short");	break;	case FinCTokenType_String:	kprintf("string");	break;	case FinCTokenType_Int:	kprintf("int");	break;	#ifdef USING_FLOAT	case FinCTokenType_Float:	kprintf("float");	break;	#endif	#ifdef USING_DOUBLE	case FinCTokenType_Double:	kprintf("double");	break;	#endif	case FinCTokenType_Long:	kprintf("long");	break;	case FinCTokenType_Type_Void:	kprintf("void");	break;	case FinCTokenType_Type_Int:	kprintf("type:int");	break;	case FinCTokenType_Type_Char:	kprintf("type:char");	break;	case FinCTokenType_Type_Short:	kprintf("type:short");	break;	#ifdef USING_DOUBLE	case FinCTokenType_Type_Double:	kprintf("type:double");	break;	#endif	#ifdef USING_FLOAT	case FinCTokenType_Type_Float:	kprintf("type:float");	break;	#endif	case FinCTokenType_Type_Bool:	kprintf("type:bool");	break;	case FinCTokenType_Type_Pointer:	kprintf("type:pointer");	break;	case FinCTokenType_Type_String:	kprintf("type:string");	break;	case FinCTokenType_Static:	kprintf("static");	break;	case FinCTokenType_Unsigned:	kprintf("unsigned");	break;	case FinCTokenType_Struct:	kprintf("struct");	break;	case FinCTokenType_False:	kprintf("false");	break;	case FinCTokenType_True:	kprintf("true");	break;	case FinCTokenType_Null:	kprintf("null");	break;	case FinCTokenType_For:	kprintf("for");	break;	case FinCTokenType_While:	kprintf("while");	break;	case FinCTokenType_If:	kprintf("if");	break;	case FinCTokenType_Else:	kprintf("else");	break;	case FinCTokenType_Return:	kprintf("return");	break;	case FinCTokenType_Break:	kprintf("break");	break;	case FinCTokenType_Continue:	kprintf("continue");	break;	case FinCTokenType_Import:	kprintf("import");	break;	case FinCTokenType_Package:	kprintf("package");	break;	case FinCTokenType_Addrof:	kprintf("addrof");	break;	case FinCTokenType_Valueof:	kprintf("valueof");	break;	case FinCTokenType_Identifier:	kprintf("id");	break;	case FinCTokenType_Eof:	kprintf("eof");	break;	case FinCTokenType_Bad:	kprintf("bad");	break;	}}#endif

⌨️ 快捷键说明

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