diff --git a/src/lex/token.rs b/src/lex/token.rs index 37f7b27..ad9af33 100644 --- a/src/lex/token.rs +++ b/src/lex/token.rs @@ -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 { + 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!(