/// <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); } }
private static Type GetBinOpType(IASTBinOpNode binOp) { if (binOp is IASTArithmOpNode) { return(typeof(decimal)); } else { return(typeof(bool)); //logical operations } }
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)); * }*/ }
private void ProcessBinOp(IASTBinOpNode binOpNode) { binOpNode.Right = (IASTExprNode)_nodes.Pop(); binOpNode.Left = (IASTExprNode)_nodes.Pop(); }