protected ObjectDef EmitAdditiveExpression(CParser.AdditiveExpressionContext additiveExpression) { ObjectDef returnObjectDef = null; if (additiveExpression.multiplicativeExpression() != null) { returnObjectDef = EmitMultiplicativeExpression(additiveExpression.multiplicativeExpression()); } if (additiveExpression.multiplicativeExpression() != null && additiveExpression.additiveExpression() != null) { var additiveObj = EmitAdditiveExpression(additiveExpression.additiveExpression()); additiveObj.Load(); returnObjectDef.Load(); if (additiveExpression.Plus() != null) { _generatorIL.Emit(OpCodes.Add); } else if (additiveExpression.Minus() != null) { _generatorIL.Emit(OpCodes.Sub); } returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitMultiplicativeExpression(CParser.MultiplicativeExpressionContext multiplicativeExpression) { ObjectDef returnObjectDef = null; if (multiplicativeExpression.castExpression() != null) { returnObjectDef = EmitCastExpression(multiplicativeExpression.castExpression()); } if (multiplicativeExpression.castExpression() != null && multiplicativeExpression.multiplicativeExpression() != null) { var multiplicativeObj = EmitMultiplicativeExpression(multiplicativeExpression.multiplicativeExpression()); multiplicativeObj.Load(); returnObjectDef.Load(); if (multiplicativeExpression.Star() != null) { _generatorIL.Emit(OpCodes.Mul); } else if (multiplicativeExpression.Div() != null) { _generatorIL.Emit(OpCodes.Div); } else if (multiplicativeExpression.Mod() != null) { _generatorIL.Emit(OpCodes.Rem); } returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitShiftExpression(CParser.ShiftExpressionContext shiftExpression) { ObjectDef returnObjectDef = null; if (shiftExpression.additiveExpression() != null) { returnObjectDef = EmitAdditiveExpression(shiftExpression.additiveExpression()); } if (shiftExpression.additiveExpression() != null && shiftExpression.shiftExpression() != null) { var shiftObj = EmitShiftExpression(shiftExpression.shiftExpression()); shiftObj.Load(); returnObjectDef.Load(); if (shiftExpression.LeftShift() != null) { _generatorIL.Emit(OpCodes.Shl); } else if (shiftExpression.RightShift() != null) { _generatorIL.Emit(OpCodes.Shr); } returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitEqualityExpression(CParser.EqualityExpressionContext equalityExpression) { ObjectDef returnObjectDef = null; if (equalityExpression.relationalExpression() != null) { returnObjectDef = EmitRelationalExpression(equalityExpression.relationalExpression()); } if (equalityExpression.relationalExpression() != null && equalityExpression.equalityExpression() != null) { var equalityObj = EmitEqualityExpression(equalityExpression.equalityExpression()); equalityObj.Load(); returnObjectDef.Load(); if (equalityExpression.Equal() != null) { _generatorIL.Emit(OpCodes.Ceq); } else if (equalityExpression.NotEqual() != null) { var zero = new ValueObjectDef(typeof(int), 0); _generatorIL.Emit(OpCodes.Ceq); zero.Load(); _generatorIL.Emit(OpCodes.Ceq); } returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitAndExpression(CParser.AndExpressionContext andExpression) { ObjectDef returnObjectDef = null; if (andExpression.equalityExpression() != null) { returnObjectDef = EmitEqualityExpression(andExpression.equalityExpression()); } if (andExpression.equalityExpression() != null && andExpression.andExpression() != null) { var andObj = EmitAndExpression(andExpression.andExpression()); andObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.And); returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitExclusiveOrExpression(CParser.ExclusiveOrExpressionContext exclusiveOrExpression) { ObjectDef returnObjectDef = null; if (exclusiveOrExpression.andExpression() != null) { returnObjectDef = EmitAndExpression(exclusiveOrExpression.andExpression()); } if (exclusiveOrExpression.andExpression() != null && exclusiveOrExpression.exclusiveOrExpression() != null) { var orObj = EmitExclusiveOrExpression(exclusiveOrExpression.exclusiveOrExpression()); orObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Xor); returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }
protected ObjectDef EmitRelationalExpression(CParser.RelationalExpressionContext relationalExpression) { ObjectDef returnObjectDef = null; if (relationalExpression.shiftExpression() != null) { returnObjectDef = EmitShiftExpression(relationalExpression.shiftExpression()); } if (relationalExpression.shiftExpression() != null && relationalExpression.relationalExpression() != null) { var relationalObj = EmitRelationalExpression(relationalExpression.relationalExpression()); if (relationalExpression.Less() != null) { relationalObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Clt); } else if (relationalExpression.LessEqual() != null) { ObjectDef less; ObjectDef equal; relationalObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Clt); less = LocalObjectDef.AllocateLocal(typeof(int)); returnObjectDef.Load(); relationalObj.Load(); _generatorIL.Emit(OpCodes.Ceq); equal = LocalObjectDef.AllocateLocal(typeof(int)); less.Load(); equal.Load(); _generatorIL.Emit(OpCodes.Or); } else if (relationalExpression.Greater() != null) { relationalObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Cgt); } else if (relationalExpression.GreaterEqual() != null) { ObjectDef greater; ObjectDef equal; relationalObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Cgt); greater = LocalObjectDef.AllocateLocal(typeof(int)); relationalObj.Load(); returnObjectDef.Load(); _generatorIL.Emit(OpCodes.Ceq); equal = LocalObjectDef.AllocateLocal(typeof(int)); greater.Load(); equal.Load(); _generatorIL.Emit(OpCodes.Or); } returnObjectDef = LocalObjectDef.AllocateLocal(typeof(int)); } return(returnObjectDef); }