/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.ast;
/**
* <h1>12 ECMAScript Language: Expressions</h1><br>
* <h2>12.6 Multiplicative Operators</h2><br>
* <h2>12.7 Additive Operators</h2>
* <ul>
* <li>12.7.3 The Addition operator ( + )
* <li>12.7.4 The Subtraction Operator ( - )
* </ul>
* <h2>12.8 Bitwise Shift Operators</h2>
* <ul>
* <li>12.8.3 The Left Shift Operator ( {@literal <<} )
* <li>12.8.4 The Signed Right Shift Operator ( {@literal <<} )
* <li>12.8.5 The Unsigned Right Shift Operator ( {@literal >>>} )
* </ul>
* <h2>12.9 Relational Operators</h2><br>
* <h2>12.10 Equality Operators</h2><br>
* <h2>12.11 Binary Bitwise Operators</h2><br>
* <h2>12.12 Binary Logical Operators</h2><br>
*/
public final class BinaryExpression extends Expression {
public enum Operator {/* @formatter:off */
EXP("**", 10),
MUL("*", 9), MOD("%", 9), DIV("/", 9),
ADD("+", 8), SUB("-", 8),
SHL("<<", 7), SHR(">>", 7), USHR(">>>", 7),
LT("<", 6), GT(">", 6), LE("<=", 6), GE(">=", 6), IN("in", 6), INSTANCEOF("instanceof", 6),
EQ("==", 5), NE("!=", 5), SHEQ("===", 5), SHNE("!==", 5),
BITAND("&", 4),
BITXOR("^", 3),
BITOR("|", 2),
AND("&&", 1),
OR("||", 0);
/* @formatter:on */
private String name;
private int precedence;
private Operator(String name, int precedence) {
this.name = name;
this.precedence = precedence;
}
/**
* Returns the binary operator name.
*
* @return the operator name
*/
public String getName() {
// TODO: This is not a 'name'.
return name;
}
/**
* Returns the operator precedence level.
*
* @return the operator precedence
*/
public int getPrecedence() {
return precedence;
}
/**
* Returns {@code true} if the operator is right-associative.
*
* @return {@code true} if right-associative
*/
public boolean isRightAssociative() {
return this == EXP;
}
}
private final Operator operator;
private Expression left;
private Expression right;
private boolean completion = true;
public BinaryExpression(Operator operator, Expression left, Expression right) {
super(left.getBeginPosition(), right.getEndPosition());
this.operator = operator;
this.left = left;
this.right = right;
}
/**
* Returns the binary operator.
*
* @return the operator
*/
public Operator getOperator() {
return operator;
}
/**
* Returns the left-hand side expression.
*
* @return the left-hand side expression
*/
public Expression getLeft() {
return left;
}
/**
* Sets the left-hand side expression.
*
* @param left
* the left-hand side expression
*/
public void setLeft(Expression left) {
this.left = left;
}
/**
* Returns the right-hand side expression.
*
* @return the right-hand side expression
*/
public Expression getRight() {
return right;
}
/**
* Sets the right-hand side expression.
*
* @param right
* the right-hand side expression
*/
public void setRight(Expression right) {
this.right = right;
}
@Override
public Expression emptyCompletion() {
completion = false;
return this;
}
/**
* Returns {@code true} if the completion value is used.
*
* @return {@code true} if the completion value is used
* @see #emptyCompletion()
*/
public boolean hasCompletion() {
return completion;
}
@Override
public <R, V> R accept(NodeVisitor<R, V> visitor, V value) {
return visitor.visit(this, value);
}
@Override
public <V> int accept(IntNodeVisitor<V> visitor, V value) {
return visitor.visit(this, value);
}
@Override
public <V> void accept(VoidNodeVisitor<V> visitor, V value) {
visitor.visit(this, value);
}
}