src/Parser.cc

changeset 98
ea02b78a737a
parent 97
49e38433b9fd
child 99
44c0c7f31ae8
--- a/src/Parser.cc	Tue Feb 04 22:00:43 2014 +0200
+++ b/src/Parser.cc	Sun Feb 09 04:13:15 2014 +0200
@@ -1077,7 +1077,9 @@
 		tkSubAssign,
 		tkMultiplyAssign,
 		tkDivideAssign,
-		tkModulusAssign
+		tkModulusAssign,
+		tkDoublePlus,
+		tkDoubleMinus,
 	};
 
 	mLexer->MustGetAnyOf (tokens);
@@ -1090,6 +1092,8 @@
 		case tkMultiplyAssign:	return EAssignMul;
 		case tkDivideAssign:	return EAssignDiv;
 		case tkModulusAssign:	return EAssignMod;
+		case tkDoublePlus:		return EAssignIncrement;
+		case tkDoubleMinus:		return EAssignDecrement;
 		default: break;
 	}
 
@@ -1105,23 +1109,27 @@
 	{
 		switch (op)
 		{
-			case EAssign:		return dhAssignGlobalVar;
-			case EAssignAdd:	return dhAddGlobalVar;
-			case EAssignSub:	return dhSubtractGlobalVar;
-			case EAssignMul:	return dhMultiplyGlobalVar;
-			case EAssignDiv:	return dhDivideGlobalVar;
-			case EAssignMod:	return dhModGlobalVar;
+			case EAssign:			return dhAssignGlobalVar;
+			case EAssignAdd:		return dhAddGlobalVar;
+			case EAssignSub:		return dhSubtractGlobalVar;
+			case EAssignMul:		return dhMultiplyGlobalVar;
+			case EAssignDiv:		return dhDivideGlobalVar;
+			case EAssignMod:		return dhModGlobalVar;
+			case EAssignIncrement:	return dhIncreaseGlobalVar;
+			case EAssignDecrement:	return dhDecreaseGlobalVar;
 		}
 	}
 
 	switch (op)
 	{
-		case EAssign:		return dhAssignLocalVar;
-		case EAssignAdd:	return dhAddLocalVar;
-		case EAssignSub:	return dhSubtractLocalVar;
-		case EAssignMul:	return dhMultiplyLocalVar;
-		case EAssignDiv:	return dhDivideLocalVar;
-		case EAssignMod:	return dhModLocalVar;
+		case EAssign:			return dhAssignLocalVar;
+		case EAssignAdd:		return dhAddLocalVar;
+		case EAssignSub:		return dhSubtractLocalVar;
+		case EAssignMul:		return dhMultiplyLocalVar;
+		case EAssignDiv:		return dhDivideLocalVar;
+		case EAssignMod:		return dhModLocalVar;
+		case EAssignIncrement:	return dhIncreaseLocalVar;
+		case EAssignDecrement:	return dhDecreaseLocalVar;
 	}
 
 	assert (false);
@@ -1138,38 +1146,33 @@
 {
 	// Get an operator
 	EAssignmentOperator oper = ParseAssignmentOperator();
+	DataBuffer* retbuf = new DataBuffer;
 
 	if (mCurrentMode == ETopLevelMode)
 		Error ("can't alter variables at top level");
 
 	// Parse the right operand
-	DataBuffer* retbuf = new DataBuffer;
-	DataBuffer* expr = ParseExpression (var->type);
+	if (oper != EAssignIncrement && oper != EAssignDecrement)
+	{
+		DataBuffer* expr = ParseExpression (var->type);
+		retbuf->MergeAndDestroy (expr);
+	}
 
 #if 0
 	// <<= and >>= do not have data headers. Solution: expand them.
 	// a <<= b -> a = a << b
 	// a >>= b -> a = a >> b
-	if (oper == OPER_ASSIGNLEFTSHIFT || oper == OPER_ASSIGNRIGHTSHIFT)
-	{
-		retbuf->WriteDWord (var->IsGlobal() ? dhPushGlobalVar : dhPushLocalVar);
-		retbuf->WriteDWord (var->index);
-		retbuf->MergeAndDestroy (expr);
-		retbuf->WriteDWord ((oper == OPER_ASSIGNLEFTSHIFT) ? dhLeftShift : dhRightShift);
-		retbuf->WriteDWord (var->IsGlobal() ? dhAssignGlobalVar : dhAssignLocalVar);
-		retbuf->WriteDWord (var->index);
-	}
-	else
-	{
-#endif
-		retbuf->MergeAndDestroy (expr);
-		EDataHeader dh = GetAssigmentDataHeader (oper, var);
-		retbuf->WriteDWord (dh);
-		retbuf->WriteDWord (var->index);
-#if 0
-	}
+	retbuf->WriteDWord (var->IsGlobal() ? dhPushGlobalVar : dhPushLocalVar);
+	retbuf->WriteDWord (var->index);
+	retbuf->MergeAndDestroy (expr);
+	retbuf->WriteDWord ((oper == OPER_ASSIGNLEFTSHIFT) ? dhLeftShift : dhRightShift);
+	retbuf->WriteDWord (var->IsGlobal() ? dhAssignGlobalVar : dhAssignLocalVar);
+	retbuf->WriteDWord (var->index);
 #endif
 
+	EDataHeader dh = GetAssigmentDataHeader (oper, var);
+	retbuf->WriteDWord (dh);
+	retbuf->WriteDWord (var->index);
 	return retbuf;
 }
 
@@ -1367,7 +1370,7 @@
 		for (int i = 0; i < 4; ++i)
 			mMainBuffer->GetBuffer()[ref->pos + i] = (ref->target->pos >> (8 * i)) & 0xFF;
 
-		Print ("reference at %1 resolved to mark at %2\n", ref->pos, ref->target->pos);
+		// Print ("reference at %1 resolved to mark at %2\n", ref->pos, ref->target->pos);
 	}
 
 	// Then, dump the main buffer to the file

mercurial