//<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())); }
//<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())); }
//<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); }
/// <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); }
//<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); }