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 + -
显示快捷键?