コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        protected void EmitFunction(
            CParser.TypeSpecifierContext typeSpecifier,
            ITerminalNode identifier,
            CParser.ParameterTypeListContext parameters,
            CParser.CompoundStatementContext compoundStatement)
        {
            var functionName = identifier.ToString();

            //CurrentArgs_ = Functions_[CurrentTypeBuilder_.Name][functionName].Args;
            _generatorIL = _functions[functionName].MethodBuilder.GetILGenerator();

            LocalObjectDef.InitGenerator(_generatorIL);

            if (compoundStatement.blockItemList() != null)
            {
                var returnObjectDef = EmitCompoundStatement(compoundStatement);

                returnObjectDef.Load();

                if (_functions[functionName].MethodBuilder.ReturnType == typeof(void))
                {
                    _generatorIL.Emit(OpCodes.Pop);
                }

                _generatorIL.Emit(OpCodes.Ret);

                returnObjectDef.Remove();
            }
            else
            {
                _generatorIL.Emit(OpCodes.Ret);
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }