|
|
|
@ -82,6 +82,82 @@ pub enum Kind {
|
|
|
|
|
Comment,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Kind {
|
|
|
|
|
pub fn is_start_of_lhs_expr(&self) -> bool {
|
|
|
|
|
match self {
|
|
|
|
|
Kind::Ident => true,
|
|
|
|
|
Kind::IntLiteral => true,
|
|
|
|
|
Kind::StringLiteral => true,
|
|
|
|
|
_ => false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn is_start_of_expr(&self) -> bool {
|
|
|
|
|
match self {
|
|
|
|
|
k if k.is_start_of_lhs_expr() => true,
|
|
|
|
|
Kind::Minus => true,
|
|
|
|
|
_ => false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn is_assignment_op(&self) -> bool {
|
|
|
|
|
match self {
|
|
|
|
|
Kind::Eq => true,
|
|
|
|
|
Kind::PlusEq => true,
|
|
|
|
|
Kind::MinusEq => true,
|
|
|
|
|
Kind::AsteriskEq => true,
|
|
|
|
|
Kind::AsteriskAsteriskEq => true,
|
|
|
|
|
Kind::SlashEq => true,
|
|
|
|
|
Kind::PercentEq => true,
|
|
|
|
|
Kind::GtGtEq => true,
|
|
|
|
|
Kind::LtLtEq => true,
|
|
|
|
|
Kind::PipeEq => true,
|
|
|
|
|
Kind::AmpEq => true,
|
|
|
|
|
Kind::CaretEq => true,
|
|
|
|
|
_ => false,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// If this token is a binary operator, return its precedence value when
|
|
|
|
|
/// interpreted as such. See `operator-precedence.txt` for details.
|
|
|
|
|
pub fn binary_op_precedence(&self) -> Option<u32> {
|
|
|
|
|
match self {
|
|
|
|
|
Kind::Eq => Some(2),
|
|
|
|
|
Kind::PlusEq => Some(2),
|
|
|
|
|
Kind::MinusEq => Some(2),
|
|
|
|
|
Kind::AsteriskEq => Some(2),
|
|
|
|
|
Kind::AsteriskAsteriskEq => Some(2),
|
|
|
|
|
Kind::SlashEq => Some(2),
|
|
|
|
|
Kind::PercentEq => Some(2),
|
|
|
|
|
Kind::AmpEq => Some(2),
|
|
|
|
|
Kind::PipeEq => Some(2),
|
|
|
|
|
Kind::CaretEq => Some(2),
|
|
|
|
|
Kind::GtGtEq => Some(2),
|
|
|
|
|
Kind::LtLtEq => Some(2),
|
|
|
|
|
Kind::PipePipe => Some(3),
|
|
|
|
|
Kind::AmpAmp => Some(4),
|
|
|
|
|
Kind::EqEq => Some(5),
|
|
|
|
|
Kind::BangEq => Some(5),
|
|
|
|
|
Kind::Gt => Some(5),
|
|
|
|
|
Kind::GtEq => Some(5),
|
|
|
|
|
Kind::Lt => Some(5),
|
|
|
|
|
Kind::LtEq => Some(5),
|
|
|
|
|
Kind::Pipe => Some(6),
|
|
|
|
|
Kind::Caret => Some(7),
|
|
|
|
|
Kind::Amp => Some(8),
|
|
|
|
|
Kind::GtGt => Some(9),
|
|
|
|
|
Kind::LtLt => Some(9),
|
|
|
|
|
Kind::Plus => Some(10),
|
|
|
|
|
Kind::Minus => Some(10),
|
|
|
|
|
Kind::Asterisk => Some(11),
|
|
|
|
|
Kind::Slash => Some(11),
|
|
|
|
|
Kind::Percent => Some(11),
|
|
|
|
|
Kind::AsteriskAsterisk => Some(12),
|
|
|
|
|
_ => None
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl fmt::Display for Kind {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
|
write!(
|
|
|
|
|