Просмотр исходного кода

Added type types declaration to the lexer and compiler, for now when declaring the following:
bool_t will initialize it to false if no value is assigned.
int_t, uint_t: all integral types are initialized to zero if no value is assigned.
float_t, double_t, long_double_t: are initialized to zero if no value is assigned.
all other is assigned null as before if no value is assigned.

The idea here is to add the ability to enforce typed variables if declared as a type other than local/var.

mingodad 13 лет назад
Родитель
Сommit
9d38051739
3 измененных файлов с 128 добавлено и 18 удалено
  1. 86 3
      squirrel/sqcompiler.cpp
  2. 23 0
      squirrel/sqcompiler.h
  3. 19 15
      squirrel/sqlexer.cpp

+ 86 - 3
squirrel/sqcompiler.cpp

@@ -233,6 +233,24 @@ public:
 		case TK_FOR:		ForStatement();			break;
 		case TK_FOREACH:	ForEachStatement();		break;
 		case TK_SWITCH:	SwitchStatement();		break;
+		case TK_LOCAL_CHAR_T:
+		case TK_LOCAL_WCHAR_T:
+		case TK_LOCAL_BOOL_T:
+		case TK_LOCAL_TABLE_T:
+		case TK_LOCAL_ARRAY_T:
+		case TK_LOCAL_INT8_T:
+		case TK_LOCAL_INT16_T:
+		case TK_LOCAL_INT32_T:
+		case TK_LOCAL_INT64_T:
+		case TK_LOCAL_INT_T:
+		case TK_LOCAL_UINT8_T:
+		case TK_LOCAL_UINT16_T:
+		case TK_LOCAL_UINT32_T:
+		case TK_LOCAL_UINT64_T:
+		case TK_LOCAL_UINT_T:
+		case TK_LOCAL_FLOAT_T:
+		case TK_LOCAL_DOUBLE_T:
+		case TK_LOCAL_LONG_DOUBLE_T:
 		case TK_LOCAL:		LocalDeclStatement();	break;
 		case TK_RETURN:
 		case TK_YIELD: {
@@ -1029,6 +1047,7 @@ public:
 	void LocalDeclStatement()
 	{
 		SQObject varname;
+		SQInteger declType = _token;
 		Lex();
 		if( _token == TK_FUNCTION) {
 			Lex();
@@ -1052,7 +1071,47 @@ public:
 				if(dest != src) _fs->AddInstruction(_OP_MOVE, dest, src);
 			}
 			else{
-				_fs->AddInstruction(_OP_LOADNULLS, _fs->PushTarget(),1);
+			    SQInteger dest = _fs->PushTarget();
+			    switch(declType){
+			        /*
+                    case TK_LOCAL_CHAR_T:
+                    case TK_LOCAL_WCHAR_T:
+                        break;
+                    */
+                    case TK_LOCAL_BOOL_T:
+                        //default value false
+                        _fs->AddInstruction(_OP_LOADBOOL, dest,0);
+                        break;
+                    /*
+                    case TK_LOCAL_TABLE_T:
+                        break;
+                    case TK_LOCAL_ARRAY_T:
+                        break;
+                    */
+                    case TK_LOCAL_INT8_T:
+                    case TK_LOCAL_INT16_T:
+                    case TK_LOCAL_INT32_T:
+                    case TK_LOCAL_INT64_T:
+                    case TK_LOCAL_INT_T:
+                    case TK_LOCAL_UINT8_T:
+                    case TK_LOCAL_UINT16_T:
+                    case TK_LOCAL_UINT32_T:
+                    case TK_LOCAL_UINT64_T:
+                    case TK_LOCAL_UINT_T:
+                        //default value 0
+                        _fs->AddInstruction(_OP_LOADINT, dest,0);
+                        break;
+                    case TK_LOCAL_FLOAT_T:
+                    case TK_LOCAL_DOUBLE_T:
+                    case TK_LOCAL_LONG_DOUBLE_T:
+                        //default value 0.0
+                        _fs->AddInstruction(_OP_LOADFLOAT, dest,0);
+                        break;
+                    //case TK_LOCAL:
+                    default:
+                        //default value null
+                        _fs->AddInstruction(_OP_LOADNULLS, dest,1);
+			    }
 			}
 			_fs->PopTarget();
 			_fs->PushLocalVariable(varname, _scope.nested);
@@ -1125,11 +1184,35 @@ public:
 		Lex();
 		BEGIN_SCOPE();
 		Expect(_SC('('));
-		if(_token == TK_LOCAL) LocalDeclStatement();
-		else if(_token != _SC(';')){
+		switch(_token){
+            case TK_LOCAL_CHAR_T:
+            case TK_LOCAL_WCHAR_T:
+            case TK_LOCAL_BOOL_T:
+            case TK_LOCAL_TABLE_T:
+            case TK_LOCAL_ARRAY_T:
+            case TK_LOCAL_INT8_T:
+            case TK_LOCAL_INT16_T:
+            case TK_LOCAL_INT32_T:
+            case TK_LOCAL_INT64_T:
+            case TK_LOCAL_INT_T:
+            case TK_LOCAL_UINT8_T:
+            case TK_LOCAL_UINT16_T:
+            case TK_LOCAL_UINT32_T:
+            case TK_LOCAL_UINT64_T:
+            case TK_LOCAL_UINT_T:
+            case TK_LOCAL_FLOAT_T:
+            case TK_LOCAL_DOUBLE_T:
+            case TK_LOCAL_LONG_DOUBLE_T:
+            case TK_LOCAL:
+                LocalDeclStatement();
+                break;
+            default:
+                if(_token != _SC(';')){
 			CommaExpr();
 			_fs->PopTarget();
 		}
+		}
+
 		Expect(_SC(';'));
 		_fs->SnoozeOpt();
 		SQInteger jmppos = _fs->GetCurrentPos();

+ 23 - 0
squirrel/sqcompiler.h

@@ -72,7 +72,30 @@ struct SQVM;
 #define TK_CONST 324
 #define TK___LINE__ 325
 #define TK___FILE__ 326
+
 #define TK_IGNORE 327
+
+#define	TK_LOCAL_CHAR_T	328
+#define	TK_LOCAL_WCHAR_T	329
+#define	TK_LOCAL_BOOL_T	330
+
+#define	TK_LOCAL_TABLE_T	331
+#define	TK_LOCAL_ARRAY_T	332
+
+#define	TK_LOCAL_INT8_T	333
+#define	TK_LOCAL_INT16_T	334
+#define	TK_LOCAL_INT32_T	335
+#define	TK_LOCAL_INT64_T	336
+#define	TK_LOCAL_INT_T	337
+#define	TK_LOCAL_UINT8_T	338
+#define	TK_LOCAL_UINT16_T	339
+#define	TK_LOCAL_UINT32_T	340
+#define	TK_LOCAL_UINT64_T	341
+#define	TK_LOCAL_UINT_T	342
+
+#define	TK_LOCAL_FLOAT_T	343
+#define	TK_LOCAL_DOUBLE_T	344
+#define	TK_LOCAL_LONG_DOUBLE_T	345
 
 
 typedef void(*CompilerErrorFunc)(void *ud, const SQChar *s);

+ 19 - 15
squirrel/sqlexer.cpp

@@ -42,24 +42,28 @@ void SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,Compile
 	ADD_KEYWORD(local, TK_LOCAL);
 	ADD_KEYWORD(var, TK_LOCAL);
 
-	ADD_KEYWORD(char_t, TK_LOCAL);
-	ADD_KEYWORD(wchar_t, TK_LOCAL);
+	ADD_KEYWORD(char_t, TK_LOCAL_CHAR_T);
+	ADD_KEYWORD(wchar_t, TK_LOCAL_WCHAR_T);
 
-	ADD_KEYWORD(int8_t, TK_LOCAL);
-	ADD_KEYWORD(int16_t, TK_LOCAL);
-	ADD_KEYWORD(int32_t, TK_LOCAL);
-	ADD_KEYWORD(int64_t, TK_LOCAL);
-	ADD_KEYWORD(int_t, TK_LOCAL);
+	ADD_KEYWORD(bool_t, TK_LOCAL_BOOL_T);
+	ADD_KEYWORD(table_t, TK_LOCAL_TABLE_T);
+	ADD_KEYWORD(array_t, TK_LOCAL_ARRAY_T);
 
-	ADD_KEYWORD(uint8_t, TK_LOCAL);
-	ADD_KEYWORD(uint16_t, TK_LOCAL);
-	ADD_KEYWORD(uint32_t, TK_LOCAL);
-	ADD_KEYWORD(uint64_t, TK_LOCAL);
-	ADD_KEYWORD(uint_t, TK_LOCAL);
+	ADD_KEYWORD(int8_t, TK_LOCAL_INT8_T);
+	ADD_KEYWORD(int16_t, TK_LOCAL_INT16_T);
+	ADD_KEYWORD(int32_t, TK_LOCAL_INT32_T);
+	ADD_KEYWORD(int64_t, TK_LOCAL_INT64_T);
+	ADD_KEYWORD(int_t, TK_LOCAL_INT_T);
 
-	ADD_KEYWORD(float_t, TK_LOCAL);
-	ADD_KEYWORD(double_t, TK_LOCAL);
-	ADD_KEYWORD(long_double_t, TK_LOCAL);
+	ADD_KEYWORD(uint8_t, TK_LOCAL_UINT8_T);
+	ADD_KEYWORD(uint16_t, TK_LOCAL_UINT16_T);
+	ADD_KEYWORD(uint32_t, TK_LOCAL_UINT32_T);
+	ADD_KEYWORD(uint64_t, TK_LOCAL_UINT64_T);
+	ADD_KEYWORD(uint_t, TK_LOCAL_UINT_T);
+
+	ADD_KEYWORD(float_t, TK_LOCAL_FLOAT_T);
+	ADD_KEYWORD(double_t, TK_LOCAL_DOUBLE_T);
+	ADD_KEYWORD(long_double_t, TK_LOCAL_LONG_DOUBLE_T);
 
 	ADD_KEYWORD(for, TK_FOR);
 	ADD_KEYWORD(foreach, TK_FOREACH);