public Expr VisitExprPlus(ExprPlus expr) { //x+(y+z) = x+y+z if (expr.Right is ExprSubExpr subExprPlus && subExprPlus.SubExpression is ExprPlus plus) { return(new ExprPlus(expr.Left, plus)); } //(x+y)+z = x+y+z if (expr.Left is ExprSubExpr subExprL && subExprL.SubExpression is ExprPlus plusL) { return(new ExprPlus(plusL, expr.Right)); } //x+(y-z) = x+y-z if (expr.Right is ExprSubExpr subExprMinus && subExprMinus.SubExpression is ExprMinus minus) { return(new ExprPlus(expr.Left, minus)); } //(y-z)+x = y-z+x if (expr.Left is ExprSubExpr subExprMinusL && subExprMinusL.SubExpression is ExprMinus minusL) { return(new ExprPlus(minusL, expr.Right)); } //x+(y*z) = x+y*z if (expr.Right is ExprSubExpr subExprMul && subExprMul.SubExpression is ExprMul mul) { return(new ExprPlus(expr.Left, mul)); } //(x*y)+z = x*y+z if (expr.Left is ExprSubExpr subExprMulL && subExprMulL.SubExpression is ExprMul mulL) { return(new ExprPlus(mulL, expr.Right)); } return(expr); }
public Expr VisitExprPlus(ExprPlus expr) { var newLeft = expr.Left.Accept(this).Accept(this._modifier); var newRight = expr.Right.Accept(this).Accept(this._modifier); if (!ReferenceEquals(newLeft, expr.Left) || !ReferenceEquals(newRight, expr.Right)) { return(new ExprPlus(newLeft, newRight)); } return(expr); }
public string VisitExprPlus(ExprPlus expr) => $"{expr.Left.Accept(this)}+{expr.Right.Accept(this)}";
public int VisitExprPlus(ExprPlus expr) => expr.Left.Accept(this) + expr.Right.Accept(this);