Ver código fonte

The compiler now accept integer literal suffixes "uUsSlL" but still all of then are stored as SQInteger.

mingodad 8 anos atrás
pai
commit
280aeba8c9

+ 28 - 9
SquiLu/squirrel/sqcompiler.cpp

@@ -123,6 +123,15 @@ struct SQScope {
 		case TK_LOCAL_VOIDPTR_T: \
 		case TK_LOCAL_WEAKREF_T
 
+#define CASE_TK_INTEGER \
+        case TK_INTEGER: \
+        case TK_UNSIGNED_INTEGER: \
+        case TK_SHORT_INTEGER: \
+        case TK_UNSIGNED_SHORT_INTEGER: \
+        case TK_LONG_INTEGER: \
+        case TK_UNSIGNED_LONG_INTEGER: \
+        case TK_LONG_LONG_INTEGER: \
+        case TK_UNSIGNED_LONG_LONG_INTEGER
 static SQInteger compilerReadFunc(SQUserPointer fp)
 {
     SQInteger c = fgetc((FILE *)fp);
@@ -367,7 +376,7 @@ public:
 		case TK_STRING_LITERAL:
 			ret = _fs->CreateString(_lex.data->svalue,_lex.data->longstr.size()-1);
 			break;
-		case TK_INTEGER:
+		CASE_TK_INTEGER:
 			ret = SQObjectPtr(_lex.data->nvalue);
 			break;
 		case TK_FLOAT:
@@ -395,7 +404,7 @@ public:
 					case TK_STRING_LITERAL:
 						etypename = _SC("STRING_LITERAL");
 						break;
-					case TK_INTEGER:
+					CASE_TK_INTEGER:
 						etypename = _SC("INTEGER");
 						break;
 					case TK_FLOAT:
@@ -1382,7 +1391,8 @@ public:
 			_fs->AddInstruction(_OP_LOADNULLS, _fs->PushTarget(),1);
 			Lex();
 			break;
-		case TK_INTEGER: EmitLoadConstInt(_lex.data->nvalue,-1); Lex();	break;
+		CASE_TK_INTEGER:
+		    EmitLoadConstInt(_lex.data->nvalue,-1); Lex();	break;
 		case TK_FLOAT: EmitLoadConstFloat(_lex.data->fvalue,-1); Lex(); break;
 		case TK_TRUE: case TK_FALSE:
 			_fs->AddInstruction(_OP_LOADBOOL, _fs->PushTarget(),_token == TK_TRUE?1:0);
@@ -1415,7 +1425,8 @@ public:
 		case _SC('-'):
 			Lex();
 			switch(_token) {
-			case TK_INTEGER: EmitLoadConstInt(-_lex.data->nvalue,-1); Lex(); break;
+			CASE_TK_INTEGER:
+			    EmitLoadConstInt(-_lex.data->nvalue,-1); Lex(); break;
 			case TK_FLOAT: EmitLoadConstFloat(-_lex.data->fvalue,-1); Lex(); break;
 			default: UnaryOP(_OP_NEG);
 			}
@@ -1423,7 +1434,15 @@ public:
 		case _SC('!'): Lex(); UnaryOP(_OP_NOT); break;
 		case _SC('~'):
 			Lex();
-			if(_token == TK_INTEGER)  { EmitLoadConstInt(~_lex.data->nvalue,-1); Lex(); break; }
+			bool isInteger;
+			switch(_token)
+			{
+                CASE_TK_INTEGER:
+                    isInteger = true;
+                default:
+                    isInteger = false;
+			}
+			if(isInteger)  { EmitLoadConstInt(~_lex.data->nvalue,-1); Lex(); break; }
 			UnaryOP(_OP_BWNOT);
 			break;
 		case TK_TYPEOF : Lex() ;UnaryOP(_OP_TYPEOF); break;
@@ -2250,7 +2269,7 @@ if(color == "yellow"){
 		SQObject val;
 		val._type = OT_NULL; val._unVal.nInteger = 0; //shut up GCC 4.x
 		switch(_token) {
-			case TK_INTEGER:
+			CASE_TK_INTEGER:
 				val._type = OT_INTEGER;
 				val._unVal.nInteger = _lex.data->nvalue;
 				break;
@@ -2270,7 +2289,7 @@ if(color == "yellow"){
 				Lex();
 				switch(_token)
 				{
-				case TK_INTEGER:
+				CASE_TK_INTEGER:
 					val._type = OT_INTEGER;
 					val._unVal.nInteger = -_lex.data->nvalue;
 				break;
@@ -2292,7 +2311,7 @@ if(color == "yellow"){
 	{
 	    SQInteger tk_type = _token;
 		switch(_token) {
-			case TK_INTEGER:
+			CASE_TK_INTEGER:
                 EmitLoadConstInt(_lex.data->nvalue,-1);
 				break;
 			case TK_FLOAT:
@@ -2313,7 +2332,7 @@ if(color == "yellow"){
 				tk_type = _token;
 				switch(_token)
 				{
-				case TK_INTEGER:
+				CASE_TK_INTEGER:
                     EmitLoadConstInt(-_lex.data->nvalue,-1);
 				break;
 				case TK_FLOAT:

+ 7 - 0
SquiLu/squirrel/sqcompiler.h

@@ -58,6 +58,13 @@ struct SQVM;
     ENUM_TK(INLINE)\
     ENUM_TK(INSTANCEOF)\
     ENUM_TK(INTEGER)\
+    ENUM_TK(UNSIGNED_INTEGER)\
+    ENUM_TK(UNSIGNED_LONG_INTEGER)\
+    ENUM_TK(LONG_INTEGER)\
+    ENUM_TK(UNSIGNED_LONG_LONG_INTEGER)\
+    ENUM_TK(LONG_LONG_INTEGER)\
+    ENUM_TK(UNSIGNED_SHORT_INTEGER)\
+    ENUM_TK(SHORT_INTEGER)\
     ENUM_TK(LE)\
     ENUM_TK(__LINE__)\
     ENUM_TK(LOCAL)\

+ 40 - 3
SquiLu/squirrel/sqlexer.cpp

@@ -777,7 +777,7 @@ SQInteger SQLexer::ReadNumber()
 #define THEX 3
 #define TSCIENTIFIC 4
 #define TOCTAL 5
-	SQInteger type = TINT, firstchar = CUR_CHAR;
+	SQInteger rtype, type = TINT, firstchar = CUR_CHAR;
 	SQUnsignedInteger itmp=0;
 	SQChar *sTemp;
 	INIT_TEMP_STRING();
@@ -810,7 +810,7 @@ SQInteger SQLexer::ReadNumber()
 				type = TSCIENTIFIC;
 				APPEND_CHAR(CUR_CHAR);
 				NEXT();
-				if(CUR_CHAR == '+' || CUR_CHAR == '-'){
+				if(CUR_CHAR == _SC('+') || CUR_CHAR == _SC('-')){
 					APPEND_CHAR(CUR_CHAR);
 					NEXT();
 				}
@@ -837,14 +837,51 @@ SQInteger SQLexer::ReadNumber()
 		LexOctal(&data->longstr[0],&itmp);
 		break;
 	}
+	rtype = TK_INTEGER;
 	switch(type) {
 	case TINT:
+	    switch(CUR_CHAR)
+	    {
+        case _SC('u'):
+        case _SC('U'):
+            rtype = TK_UNSIGNED_INTEGER;
+            NEXT();
+            break;
+	    }
+
+	    switch(CUR_CHAR)
+	    {
+        case _SC('s'):
+        case _SC('S'):
+            rtype = (rtype == TK_UNSIGNED_INTEGER) ? TK_UNSIGNED_SHORT_INTEGER : TK_SHORT_INTEGER;
+            NEXT();
+            break;
+
+        case _SC('l'):
+        case _SC('L'):
+            rtype = (rtype == TK_UNSIGNED_INTEGER) ? TK_UNSIGNED_LONG_INTEGER : TK_LONG_INTEGER;
+            NEXT();
+            if((CUR_CHAR == _SC('l')) || (CUR_CHAR == _SC('L')) )
+            {
+                switch(rtype)
+                {
+                case TK_UNSIGNED_INTEGER:
+                case TK_UNSIGNED_LONG_INTEGER:
+                    rtype = TK_UNSIGNED_LONG_LONG_INTEGER;
+                    break;
+                default:
+                    rtype = TK_LONG_LONG_INTEGER;
+                }
+                NEXT();
+            }
+            break;
+	    }
 	case THEX:
 	case TOCTAL:
 	    //to allow 64 bits integers comment bellow
         //if(itmp > INT_MAX) return Error(_SC("integer overflow %ulld %d"));
         data->nvalue = (SQInteger) itmp;
-		return TK_INTEGER;
+		return rtype;
 	}
 	return 0;
 }