Example #1
0
        public bool VisitExprMul(ExprMul expr, TCtx arg)
        {
            var res = this.Visit(expr, "Mul", arg, out var argOut) && this.Accept("Left", expr.Left, argOut) && this.Accept("Right", expr.Right, argOut);

            this._visitor.EndVisitExpr(expr, arg);
            return(res);
        }
Example #2
0
 public bool VisitExprMul(ExprMul exprMul, IExpr?parent)
 {
     this.CheckPlusMinusParenthesizes(exprMul.Left, exprMul);
     this.Builder.Append('*');
     this.CheckPlusMinusParenthesizes(exprMul.Right, exprMul);
     return(true);
 }
Example #3
0
        public Expr VisitExprMul(ExprMul expr)
        {
            //x*(z+y) = x*z+x*y
            if (ExtractPlus(expr.Right, out var plus))
            {
                return(new ExprPlus(new ExprMul(expr.Left, plus !.Left).ToSubExprIfComplex(), new ExprMul(expr.Left, plus.Right).ToSubExprIfComplex()).ToSubExprIfComplex());
            }
            //(z+y)*x = z*x+y*x
            if (ExtractPlus(expr.Left, out var plusL))
            {
                return(new ExprPlus(new ExprMul(plusL !.Left, expr.Right).ToSubExprIfComplex(), new ExprMul(plusL.Right, expr.Right).ToSubExprIfComplex()).ToSubExprIfComplex());
            }
            //x*(z-y) = x*z-x*y
            if (ExtractMinus(expr.Right, out var minus))
            {
                return(new ExprMinus(new ExprMul(expr.Left, minus !.Left).ToSubExprIfComplex(), new ExprMul(expr.Left, minus.Right).ToSubExprIfComplex()).ToSubExprIfComplex());
            }
            //(z-y)*x = z*x-y*x
            if (ExtractMinus(expr.Left, out var minusL))
            {
                return(new ExprMinus(new ExprMul(minusL !.Left, expr.Right).ToSubExprIfComplex(), new ExprMul(minusL.Right, expr.Right).ToSubExprIfComplex()).ToSubExprIfComplex());
            }

            //x*(z*y) = x*z*y
            if (expr.Right is ExprSubExpr subExprMul && subExprMul.SubExpression is ExprMul mul)
            {
                return(new ExprMul(expr.Left, mul));
            }
            //(x*z)*y = x*z*y
            if (expr.Left is ExprSubExpr subExprMulL && subExprMulL.SubExpression is ExprMul mulL)
            {
                return(new ExprMul(mulL, expr.Right));
            }
            return(expr);
        }
Example #4
0
        public Node ExprMul()
        {
            var n1 = ExprUnary();

            while (firstOfExprMul.Contains(CurrentToken))
            {
                var n2 = new ExprMul();
                switch (CurrentToken)
                {
                case TokenCategory.MULTIPLICATION:
                    n2.AnchorToken = Expect(TokenCategory.MULTIPLICATION);
                    break;

                case TokenCategory.MODULO:
                    n2.AnchorToken = Expect(TokenCategory.MODULO);
                    break;

                case TokenCategory.DIVIDE:
                    n2.AnchorToken = Expect(TokenCategory.DIVIDE);
                    break;

                default:
                    throw new SyntaxError(firstOfExprMul, tokenStream.Current);
                }
                n2.Add(n1);
                n2.Add(ExprUnary());
                n1 = n2;
            }
            return(n1);
        }
Example #5
0
        public Expr VisitExprMul(ExprMul 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 ExprMul(newLeft, newRight));
            }
            return(expr);
        }
Example #6
0
        public string Visit(ExprMul node)
        {
            switch (node.AnchorToken.Category)
            {
            case TokenCategory.MODULO:
                return(VisitChildren(node) +
                       Line(Indent() + "rem"));

            case TokenCategory.MULTIPLICATION:
                return(VisitChildren(node) +
                       Line(Indent() + "mul.ovf"));

            case TokenCategory.DIVIDE:
                return(VisitChildren(node) +
                       Line(Indent() + "div"));

            default:
                return(null);
            }
        }
Example #7
0
 public static ExprMul WithRight(this ExprMul original, ExprValue newRight)
 => new ExprMul(left: original.Left, right: newRight);
Example #8
0
 public string VisitExprMul(ExprMul expr)
 => $"{this.CheckPlusMinusParenthesizes(expr.Left)}*{this.CheckPlusMinusParenthesizes(expr.Right)}";
 public void Visit(ExprMul node)
 {
     VisitChildren(node);
 }
Example #10
0
 public int VisitExprMul(ExprMul expr)
 => expr.Left.Accept(this) * expr.Right.Accept(this);
 public TRes VisitExprMul(ExprMul exprMul, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprMul.Left.Accept(this, ctx));
 }