コード例 #1
0
 /// <summary>
 /// Builds concrete binary operation
 /// </summary>
 /// <param name="binOpExpr">Binary operation node</param>
 private void BuildBinOpExpr(IASTBinOpNode binOpExpr)
 {
     //arithm
     if (binOpExpr is ASTAddOpNode addNode)
     {
         BuildAddOpExpr(addNode);
     }
     if (binOpExpr is ASTSubOpNode subOpNode)
     {
         BuildSubOpExpr(subOpNode);
     }
     if (binOpExpr is ASTMulOpNode mulOpNode)
     {
         BuildMulOpExpr(mulOpNode);
     }
     if (binOpExpr is ASTDivOpNode divOpNode)
     {
         BuildDivOpExpr(divOpNode);
     }
     //comparing
     if (binOpExpr is ASTEqualOpNode equalNode)
     {
         BuildEqualOpExpr(equalNode);
     }
     if (binOpExpr is ASTNotEqualOpNode notEqualNode)
     {
         BuildNotEqualOpExpr(notEqualNode);
     }
     if (binOpExpr is ASTGreaterOpNode greaterNode)
     {
         BuildGreaterOpExpr(greaterNode);
     }
     if (binOpExpr is ASTLessOpNode lessNode)
     {
         BuildLessOpExpr(lessNode);
     }
     if (binOpExpr is ASTLessOrEqualOpNode lessOrEqNode)
     {
         BuildLessOrEqualOpExpr(lessOrEqNode);
     }
     if (binOpExpr is ASTGreaterOrEqualOpNode greaterOrEqNode)
     {
         BuildGreaterOrEqualOpExpr(greaterOrEqNode);
     }
     //logic
     if (binOpExpr is ASTLogicAndOpNode logicAndNode)
     {
         BuildLogicAndOpExpr(logicAndNode);
     }
     if (binOpExpr is ASTLogicOrOpNode logicOrNode)
     {
         BuildLogicOrOpExpr(logicOrNode);
     }
 }
コード例 #2
0
 private static Type GetBinOpType(IASTBinOpNode binOp)
 {
     if (binOp is IASTArithmOpNode)
     {
         return(typeof(decimal));
     }
     else
     {
         return(typeof(bool)); //logical operations
     }
 }
コード例 #3
0
        private void CheckBinOp(IASTBinOpNode binOpNode)
        {
            CheckExpression(binOpNode.Left);
            CheckExpression(binOpNode.Right);
            if (binOpNode is IASTArithmOpNode arithmOpNode)
            {
                CheckImplicitCast(binOpNode.Left, typeof(decimal));
                CheckImplicitCast(binOpNode.Right, typeof(decimal));
            }
            else
            {
                if ((binOpNode is ASTLessOpNode) ||
                    (binOpNode is ASTLessOrEqualOpNode) ||
                    (binOpNode is ASTGreaterOpNode) ||
                    (binOpNode is ASTGreaterOrEqualOpNode))
                {
                    CheckImplicitCast(binOpNode.Left, typeof(decimal));
                    CheckImplicitCast(binOpNode.Right, typeof(decimal));
                }

                if ((binOpNode is ASTLogicAndOpNode) ||
                    (binOpNode is ASTLogicOrOpNode)
                    )
                {
                    CheckImplicitCast(binOpNode.Left, typeof(bool));
                    CheckImplicitCast(binOpNode.Right, typeof(bool));
                }
            }

            /*//equal and not equal - exception
             * if (!(binOpNode is ASTEqualOpNode))
             * {
             *  CheckImplicitCast(binOpNode.Left, typeof(decimal));
             *  CheckImplicitCast(binOpNode.Right, typeof(decimal));
             * }
             * else
             * {
             *  CheckImplicitCast(binOpNode.Left, typeof(bool));
             *  CheckImplicitCast(binOpNode.Right, typeof(bool));
             * }*/
        }
コード例 #4
0
 private void ProcessBinOp(IASTBinOpNode binOpNode)
 {
     binOpNode.Right = (IASTExprNode)_nodes.Pop();
     binOpNode.Left  = (IASTExprNode)_nodes.Pop();
 }