Ejemplo n.º 1
0
    //<MULTIPLICATION> ::= <UNARY> | <MULTIPLICATION> <MULTIPLICATION_OPERATOR> <UNARY>
    //<MULTIPLICATION_OPERATOR> ::= "*" | "/" | "%"
    private Expression parseMultiplication()
    {
        Expression left = parseUnary();

        while (true)
        {
            if (!(accept(TokenType.OP_MULT) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_MULT, left, parseUnary());
            }
            else if (!(accept(TokenType.OP_DIV) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_DIV, left, parseUnary());
            }
            else if (!(accept(TokenType.OP_MOD) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_MOD, left, parseUnary());
            }
            else
            {
                break;
            }
        }
        return(left);
    }
        public override AstNode VisitMultiplicative_expression([NotNull] GLSL_ES300Parser.Multiplicative_expressionContext context)
        {
            if (context.Mul() != null || context.Div() != null || context.Percent() != null)
            {
                var result = new ExpressionBinary();
                result.Left  = (Expression)this.Visit(context.multiplicative_expression());
                result.Right = (Expression)this.Visit(context.unary_expression());
                if (context.Mul() != null)
                {
                    result.Operator = Operator.Mul;
                }

                if (context.Div() != null)
                {
                    result.Operator = Operator.Div;
                }

                if (context.Percent() != null)
                {
                    result.Operator = Operator.Percent;
                }
                return(result);
            }

            return(this.Visit(context.unary_expression()));
        }
Ejemplo n.º 3
0
    //<RELATION_GROUP2> ::= <ADDITION> | <RELATION_GROUP2> <RELATIONAL_OPERATOR_GROUP2> <ADDITION>
    //<RELATIONAL_OPERATOR_GROUP2> ::= "<" | ">" | "<=" |  ">="
    private Expression parseExpressionRelGroup2()
    {
        Expression left = parseAddition();

        while (true)
        {
            if (!(accept(TokenType.OP_G) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_G, left, parseAddition());
            }
            else if (!(accept(TokenType.OP_L) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_L, left, parseAddition());
            }
            else if (!(accept(TokenType.OP_G_EQ) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_G_EQ, left, parseAddition());
            }
            else if (!(accept(TokenType.OP_L_EQ) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_L_EQ, left, parseAddition());
            }
            else
            {
                break;
            }
        }
        return(left);
    }
        public override AstNode VisitRelational_expression([NotNull] GLSL_ES300Parser.Relational_expressionContext context)
        {
            if (context.Less() != null || context.Greater() != null || context.LessOrEqual() != null || context.GreaterOrEqual() != null)
            {
                var result = new ExpressionBinary();
                result.Left  = (Expression)this.Visit(context.relational_expression());
                result.Right = (Expression)this.Visit(context.shift_expression());
                if (context.Less() != null)
                {
                    result.Operator = Operator.Less;
                }

                if (context.Greater() != null)
                {
                    result.Operator = Operator.Greater;
                }

                if (context.LessOrEqual() != null)
                {
                    result.Operator = Operator.LessOrEqual;
                }

                if (context.GreaterOrEqual() != null)
                {
                    result.Operator = Operator.GreaterOrEqual;
                }

                return(result);
            }

            return(this.Visit(context.shift_expression()));
        }
 public override void VisitExpressionBinary(ExpressionBinary node, AstPrinterContext context)
 {
     this.Visit(node.Left, context);
     context.Write(" ");
     context.Write(this.GetOperatorString(node.Operator));
     context.Write(" ");
     this.Visit(node.Right, context);
 }
 public override void VisitExpressionBinary(ExpressionBinary node, CloningAstVisitorContext context)
 {
     context.Result = new ExpressionBinary()
     {
         Left     = this.CloneNode(node.Left, context),
         Right    = this.CloneNode(node.Right, context),
         Operator = node.Operator
     };
 }
        public override AstNode VisitLogical_and_expression([NotNull] GLSL_ES300Parser.Logical_and_expressionContext context)
        {
            if (context.And() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.logical_and_expression());
                result.Right    = (Expression)this.Visit(context.inclusive_or_expression());
                result.Operator = Operator.And;
                return(result);
            }

            return(this.Visit(context.inclusive_or_expression()));
        }
        public override AstNode VisitAdditive_expression([NotNull] GLSL_ES300Parser.Additive_expressionContext context)
        {
            if (context.Plus() != null || context.Minus() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.additive_expression());
                result.Right    = (Expression)this.Visit(context.multiplicative_expression());
                result.Operator = context.Plus() != null ? Operator.Plus : Operator.Minus;
                return(result);
            }

            return(this.Visit(context.multiplicative_expression()));
        }
        public override AstNode VisitEquality_expression([NotNull] GLSL_ES300Parser.Equality_expressionContext context)
        {
            if (context.Equal() != null || context.NotEqual() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.equality_expression());
                result.Right    = (Expression)this.Visit(context.relational_expression());
                result.Operator = context.Equal() != null ? Operator.Equal : Operator.NotEqual;
                return(result);
            }

            return(this.Visit(context.relational_expression()));
        }
        public override AstNode VisitShift_expression([NotNull] GLSL_ES300Parser.Shift_expressionContext context)
        {
            if (context.Left() != null || context.Right() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.shift_expression());
                result.Right    = (Expression)this.Visit(context.additive_expression());
                result.Operator = context.Left() != null ? Operator.Left : Operator.Right;
                return(result);
            }

            return(this.Visit(context.additive_expression()));
        }
        public override AstNode VisitAnd_expression([NotNull] GLSL_ES300Parser.And_expressionContext context)
        {
            if (context.Ampersand() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.and_expression());
                result.Right    = (Expression)this.Visit(context.equality_expression());
                result.Operator = Operator.Ampersand;
                return(result);
            }

            return(this.Visit(context.equality_expression()));
        }
        public override AstNode VisitExclusive_or_expression([NotNull] GLSL_ES300Parser.Exclusive_or_expressionContext context)
        {
            if (context.Caret() != null)
            {
                var result = new ExpressionBinary();
                result.Left     = (Expression)this.Visit(context.exclusive_or_expression());
                result.Right    = (Expression)this.Visit(context.and_expression());
                result.Operator = Operator.Caret;
                return(result);
            }

            return(this.Visit(context.and_expression()));
        }
Ejemplo n.º 13
0
    //<LOGICAL_AND> ::= <RELATION_GROUP1> | <LOGICAL_AND> "&&" <RELATION_GROUP1>
    private Expression parseExpressionAnd()
    {
        Expression left = parseExpressionRelGroup1();

        while (true)
        {
            if (!(accept(TokenType.OP_L_AND) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_L_AND, left, parseExpressionRelGroup1());
            }
            else
            {
                break;
            }
        }
        return(left);
    }
Ejemplo n.º 14
0
        /// <summary>
        /// Идея: Expression Parser::parse_binary_expression(int min_priority) {
        /// https://ru.stackoverflow.com/questions/23842/%D0%9F%D0%B0%D1%80%D1%81%D0%B5%D1%80-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9
        /// </summary>
        /// <param name="priorPriority"></param>
        /// <returns></returns>
        IExpression ParseBinary(int priorPriority = 0)
        {
            var left = ParseUnary();

            while (_lexicalScanner.Current != null)
            {
                var currentPriority = OperationPriority(_lexicalScanner.Current.Value);
                if (currentPriority <= priorPriority)
                {
                    return(left);
                }

                var op = _lexicalScanner.Current.Value[0];
                _lexicalScanner.Next();
                var right = ParseBinary(currentPriority);
                left = new ExpressionBinary(op, left, right);
            }

            return(left);
        }
Ejemplo n.º 15
0
    //<ADDITION> ::= <MULTIPLICATION> | <ADDITION> <ADDITION_OPERATOR> <MULTIPLICATION>
    //<ADDITION_OPERATOR> ::= "+" | "-"
    private Expression parseAddition()
    {
        Expression left = parseMultiplication();

        while (true)
        {
            if (!(accept(TokenType.OP_ADD) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_ADD, left, parseMultiplication());
            }
            else if (!(accept(TokenType.OP_SUB) == null))
            {
                left = new ExpressionBinary(BinaryOpKind.OP_SUB, left, parseMultiplication());
            }
            else
            {
                break;
            }
        }
        return(left);
    }
 public virtual void VisitExpressionBinary(ExpressionBinary node, TContext context)
 {
     this.Visit(node.Left, context);
     this.Visit(node.Right, context);
 }
        public override AstNode VisitAssignment_expression([NotNull] GLSL_ES300Parser.Assignment_expressionContext context)
        {
            var cond = context.conditional_expression();

            if (cond != null)
            {
                return(this.Visit(cond));
            }

            var result = new ExpressionBinary();

            result.Left  = (Expression)this.Visit(context.unary_expression());
            result.Right = (Expression)this.Visit(context.assignment_expression());

            var op = context.assignment_operator();

            if (op.Assign() != null)
            {
                result.Operator = Operator.Assign;
            }

            if (op.MulAssign() != null)
            {
                result.Operator = Operator.MulAssign;
            }

            if (op.DivAssign() != null)
            {
                result.Operator = Operator.DivAssign;
            }

            if (op.ModAssign() != null)
            {
                result.Operator = Operator.ModAssign;
            }

            if (op.AddAssign() != null)
            {
                result.Operator = Operator.AddAssign;
            }

            if (op.SubAssign() != null)
            {
                result.Operator = Operator.SubAssign;
            }

            if (op.LeftAssign() != null)
            {
                result.Operator = Operator.LeftAssign;
            }

            if (op.RightAssign() != null)
            {
                result.Operator = Operator.RightAssign;
            }

            if (op.AndAssign() != null)
            {
                result.Operator = Operator.AndAssign;
            }

            if (op.XorAssign() != null)
            {
                result.Operator = Operator.XorAssign;
            }

            if (op.OrAssign() != null)
            {
                result.Operator = Operator.OrAssign;
            }

            return(result);
        }