示例#1
0
 public BinOpNode(ExprNode left, ExprNode right, BinOpType operation)
 {
     Left = left;
     Right = right;
     Op = operation;
 }
示例#2
0
 /// <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);
 }
示例#3
0
 public UnOpNode(ExprNode e, UnOpType operation)
 {
     expr = e;
     Op = operation;
 }