public BinOpNode(ExprNode left, ExprNode right, BinOpType operation) { Left = left; Right = right; Op = operation; }
/// <summary> /// Генерация /// </summary> /// <param name="isPredTrue">должно ли условие быть истинным</param> /// <returns>искомое выражение в виде строки</returns> public virtual string generate(bool isPredTrue) { // формирование условного выражения Cond = prGen.getPred(isPredTrue); // формирование 1-го выражения if(nResult == 0 && ((xId.eval() & 1) == 0 || (yId.eval() & 1) != 0) || (nResult == 1 && ((xId.eval() & 1) != 0) && (yId.eval() & 1) == 0)) Expr1 = new BinOpNode(// x * x * (x + y) * (x + y) % 4 new BinOpNode( new BinOpNode( new BinOpNode(xId, xId, BinOpType.MULT), new BinOpNode(yId, xId, BinOpType.PLUS), BinOpType.MULT), new BinOpNode(yId, xId, BinOpType.PLUS), BinOpType.MULT), new IntNumNode(4), BinOpType.MOD); else if (yId.eval() != 0) Expr1 = new BinOpNode(// y * (x - (x - nResult)) / y; new BinOpNode( yId, new BinOpNode( xId, new BinOpNode(xId, new IntNumNode(nResult), BinOpType.MINUS), BinOpType.MINUS), BinOpType.MULT), yId, BinOpType.DIV); else Expr1 = new BinOpNode(yId, new IntNumNode(nResult),BinOpType.PLUS); // формирование 2-го выражения Expr2 = new BinOpNode(// x * x - c * x + nResult new BinOpNode( new BinOpNode(xId,xId,BinOpType.MULT), new BinOpNode(new IntNumNode(xId.eval()),xId,BinOpType.MULT), BinOpType.MINUS), new IntNumNode(nResult), BinOpType.PLUS); int a, b; if (hasLinearSln(xId.eval(), yId.eval(), nResult, out a, out b)) if (a != 0 && b != 0) // есть неоднородные решения Expr2 = new BinOpNode(// a * x + b * y new BinOpNode(new IntNumNode(a), xId, BinOpType.MULT), new BinOpNode(new IntNumNode(b), yId, BinOpType.MULT), BinOpType.PLUS); return String.Format("({0} ? {1} : {2})", Cond, isPredTrue ? Expr1 : Expr2, isPredTrue ? Expr2 : Expr1); }
public UnOpNode(ExprNode e, UnOpType operation) { expr = e; Op = operation; }