Ver código fonte

Added reduced using/typedef keywords valid syntax

mingodad 9 anos atrás
pai
commit
350213c0be

+ 54 - 19
SquiLu/squirrel/sqcompiler.cpp

@@ -191,6 +191,14 @@ public:
 	    return found;
 	}
 
+	bool TypesGet(const SQObjectPtr &key,SQObjectPtr &val){
+	    return _table(_type_names)->Get(key,val);
+	}
+
+	bool TypesNewSlot(const SQObjectPtr &key, const SQObjectPtr &val){
+	    return _table(_type_names)->NewSlot(key,val);
+	}
+
 	int CheckExternName(const SQObject &name, bool addIfNotExists=false){
 	    SQObjectPtr orefcount;
 	    int found = _table(_extern_names)->Get(name, orefcount);
@@ -358,6 +366,8 @@ public:
 		case TK_FLOAT:
 			ret = SQObjectPtr(_lex._fvalue);
 			break;
+        default:
+            ret = _fs->CreateString(_lex.GetTokenName(_token));
 		}
 		Lex();
 		return ret;
@@ -562,23 +572,10 @@ public:
 		case TK_FOR:		ForStatement();			break;
 		case TK_FOREACH:	ForEachStatement();		break;
 		case TK_SWITCH:	SwitchStatement();		break;
-		case TK_VOLATILE:
-		    Lex();
-            goto start_again;
-		case TK_STATIC:
-            if(_scope.nested)
-            {
-                Warning(_SC("%s:%d:%d warning static cualifier is ignored\n"),
-                                          _stringval(_sourcename), _lex._currentline, _lex._currentcolumn);
-            }
-            Lex(); //ignore it only to allow run some C/C++ code
-            goto start_again;
-
-        case TK_EXTERN: ExternDeclStatement();	break;
 
-		CASE_TK_LOCAL_TYPES:
+        case TK_LOCAL:
 		//case TK_CONST:
-		case TK_LOCAL:		LocalDeclStatement();	break;
+		CASE_TK_LOCAL_TYPES: LocalDeclStatement();	break;
 		case TK_RETURN:
 		case TK_YIELD: {
 			SQOpcode op;
@@ -671,6 +668,44 @@ public:
 			}
 			break;
 
+		case TK_VOLATILE:
+		    Lex();
+            goto start_again;
+		case TK_STATIC:
+            if(_scope.nested)
+            {
+                Warning(_SC("%s:%d:%d warning static cualifier is ignored\n"),
+                                          _stringval(_sourcename), _lex._currentline, _lex._currentcolumn);
+            }
+            Lex(); //ignore it only to allow run some C/C++ code
+            goto start_again;
+
+        case TK_EXTERN: ExternDeclStatement();	break;
+
+        case TK_TYPEDEF:
+			{
+			Lex();
+			SQObject type_val = ExpectTypeToken();
+			id = ExpectTypeToken();
+			SQObjectPtr strongid = id;
+			CheckLocalNameScope(id, _scope.nested);
+			Expect(_SC(';'));
+			TypesNewSlot(strongid,SQObjectPtr(type_val));
+			}
+			break;
+        case TK_USING:
+			{
+			Lex();
+			id = Expect(TK_IDENTIFIER);
+			Expect('=');
+			SQObjectPtr strongid = id;
+			CheckLocalNameScope(id, _scope.nested);
+			SQObject type_val = ExpectTypeToken();
+			Expect(_SC(';'));
+			TypesNewSlot(strongid,SQObjectPtr(type_val));
+			}
+        break;
+
 		case TK_PRAGMA:
 		    Pragma();
 		    break;
@@ -1559,10 +1594,6 @@ function_params_decl:
 		}
 
 		do {
-            if(is_void_declaration)
-            {
-                Error(_SC("void type is invalid here"));
-            }
 		    if(_token == _SC('&')){
 		        is_reference_declaration = true;
 		        Lex();
@@ -1574,6 +1605,10 @@ function_params_decl:
                 Lex();
                 goto function_params_decl;
 			}
+            if(is_void_declaration)
+            {
+                Error(_SC("void type is invalid here"));
+            }
 			else if(_token == _SC('=')) {
                 if(_is_parsing_extern)
                 {

+ 2 - 0
SquiLu/squirrel/sqcompiler.h

@@ -101,10 +101,12 @@ struct SQVM;
     ENUM_TK(SWITCH)\
     ENUM_TK(THIS)\
     ENUM_TK(THROW)\
+    ENUM_TK(TYPEDEF)\
     ENUM_TK(TRUE)\
     ENUM_TK(TRY)\
     ENUM_TK(TYPEOF)\
     ENUM_TK(UMINUS)\
+    ENUM_TK(USING)\
     ENUM_TK(USHIFTR)\
     ENUM_TK(VARPARAMS)\
     ENUM_TK(VIRTUAL)\

+ 2 - 0
SquiLu/squirrel/sqlexer.cpp

@@ -108,6 +108,7 @@ SQTable * SQLexer::GetKeywords()
 	ADD_KEYWORD(table_t, TK_LOCAL_TABLE_T);
 	ADD_KEYWORD(this, TK_THIS);
 	ADD_KEYWORD(throw, TK_THROW);
+	ADD_KEYWORD(typedef, TK_TYPEDEF);
 	ADD_KEYWORD(true,TK_TRUE);
 	ADD_KEYWORD(try, TK_TRY);
 	ADD_KEYWORD(typeof, TK_TYPEOF);
@@ -116,6 +117,7 @@ SQTable * SQLexer::GetKeywords()
 	ADD_KEYWORD(uint64_t, TK_LOCAL_UINT64_T);
 	ADD_KEYWORD(uint8_t, TK_LOCAL_UINT8_T);
 	ADD_KEYWORD(uint_t, TK_LOCAL_UINT_T);
+	ADD_KEYWORD(using, TK_USING);
 	ADD_KEYWORD(var, TK_LOCAL);
 	ADD_KEYWORD(virtual, TK_VIRTUAL);
 	ADD_KEYWORD(void_ptr_t, TK_LOCAL_VOIDPTR_T);