1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
pub trait GetPrecedence {
fn precedence(&self) -> Precedence;
}
/// Operator Precedence
///
/// The following values are meaningful relative position, not their individual values.
/// The relative positions are derived from the ECMA Spec by following the grammar bottom up, starting from the "Comma Operator".
///
/// Note: This differs from the the operator precedence table
/// <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table>
/// but the relative positions are the same, as both are derived from the ECMA specification.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
#[repr(u8)]
pub enum Precedence {
Comma,
Assign,
Arrow,
Yield,
Conditional,
Coalesce,
LogicalOr,
LogicalAnd,
BitwiseOr,
BitwiseXor,
BitwiseAnd,
Equality,
Relational,
Shift,
Add,
Multiply,
Exponential,
Prefix,
Postfix,
NewWithoutArgs,
Call,
Member,
Grouping,
}
impl Precedence {
pub fn lowest() -> Self {
Self::Comma
}
pub fn is_right_associative(&self) -> bool {
matches!(self, Self::Exponential)
}
}