cl-token: Break operators into their own separate enum, to make future pratt parsing easier
This commit is contained in:
@@ -42,6 +42,12 @@ pub enum TokenKind {
|
||||
String,
|
||||
Character,
|
||||
// Delimiters and punctuation
|
||||
Op(Op),
|
||||
}
|
||||
|
||||
/// An operator character (delimiter, punctuation)
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||
pub enum Op {
|
||||
LCurly, // {
|
||||
RCurly, // }
|
||||
LBrack, // [
|
||||
@@ -136,60 +142,7 @@ impl Display for TokenKind {
|
||||
TokenKind::String => "string literal".fmt(f),
|
||||
TokenKind::Character => "char literal".fmt(f),
|
||||
|
||||
TokenKind::LCurly => "left curly".fmt(f),
|
||||
TokenKind::RCurly => "right curly".fmt(f),
|
||||
TokenKind::LBrack => "left brack".fmt(f),
|
||||
TokenKind::RBrack => "right brack".fmt(f),
|
||||
TokenKind::LParen => "left paren".fmt(f),
|
||||
TokenKind::RParen => "right paren".fmt(f),
|
||||
TokenKind::Amp => "and".fmt(f),
|
||||
TokenKind::AmpAmp => "and-and".fmt(f),
|
||||
TokenKind::AmpEq => "and-assign".fmt(f),
|
||||
TokenKind::Arrow => "arrow".fmt(f),
|
||||
TokenKind::At => "at".fmt(f),
|
||||
TokenKind::Backslash => "backslash".fmt(f),
|
||||
TokenKind::Bang => "bang".fmt(f),
|
||||
TokenKind::BangBang => "not-not".fmt(f),
|
||||
TokenKind::BangEq => "not equal to".fmt(f),
|
||||
TokenKind::Bar => "or".fmt(f),
|
||||
TokenKind::BarBar => "or-or".fmt(f),
|
||||
TokenKind::BarEq => "or-assign".fmt(f),
|
||||
TokenKind::Colon => "colon".fmt(f),
|
||||
TokenKind::ColonColon => "path separator".fmt(f),
|
||||
TokenKind::Comma => "comma".fmt(f),
|
||||
TokenKind::Dot => "dot".fmt(f),
|
||||
TokenKind::DotDot => "exclusive range".fmt(f),
|
||||
TokenKind::DotDotEq => "inclusive range".fmt(f),
|
||||
TokenKind::Eq => "assign".fmt(f),
|
||||
TokenKind::EqEq => "equal to".fmt(f),
|
||||
TokenKind::FatArrow => "fat arrow".fmt(f),
|
||||
TokenKind::Grave => "grave".fmt(f),
|
||||
TokenKind::Gt => "greater than".fmt(f),
|
||||
TokenKind::GtEq => "greater than or equal to".fmt(f),
|
||||
TokenKind::GtGt => "shift right".fmt(f),
|
||||
TokenKind::GtGtEq => "shift right-assign".fmt(f),
|
||||
TokenKind::Hash => "hash".fmt(f),
|
||||
TokenKind::HashBang => "shebang".fmt(f),
|
||||
TokenKind::Lt => "less than".fmt(f),
|
||||
TokenKind::LtEq => "less than or equal to".fmt(f),
|
||||
TokenKind::LtLt => "shift left".fmt(f),
|
||||
TokenKind::LtLtEq => "shift left-assign".fmt(f),
|
||||
TokenKind::Minus => "sub".fmt(f),
|
||||
TokenKind::MinusEq => "sub-assign".fmt(f),
|
||||
TokenKind::Plus => "add".fmt(f),
|
||||
TokenKind::PlusEq => "add-assign".fmt(f),
|
||||
TokenKind::Question => "huh?".fmt(f),
|
||||
TokenKind::Rem => "rem".fmt(f),
|
||||
TokenKind::RemEq => "rem-assign".fmt(f),
|
||||
TokenKind::Semi => "ignore".fmt(f),
|
||||
TokenKind::Slash => "div".fmt(f),
|
||||
TokenKind::SlashEq => "div-assign".fmt(f),
|
||||
TokenKind::Star => "star".fmt(f),
|
||||
TokenKind::StarEq => "star-assign".fmt(f),
|
||||
TokenKind::Tilde => "tilde".fmt(f),
|
||||
TokenKind::Xor => "xor".fmt(f),
|
||||
TokenKind::XorEq => "xor-assign".fmt(f),
|
||||
TokenKind::XorXor => "cat-ears".fmt(f),
|
||||
TokenKind::Op(op) => op.fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -228,3 +181,64 @@ impl FromStr for TokenKind {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Op {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
Op::LCurly => "left curly".fmt(f),
|
||||
Op::RCurly => "right curly".fmt(f),
|
||||
Op::LBrack => "left brack".fmt(f),
|
||||
Op::RBrack => "right brack".fmt(f),
|
||||
Op::LParen => "left paren".fmt(f),
|
||||
Op::RParen => "right paren".fmt(f),
|
||||
Op::Amp => "and".fmt(f),
|
||||
Op::AmpAmp => "and-and".fmt(f),
|
||||
Op::AmpEq => "and-assign".fmt(f),
|
||||
Op::Arrow => "arrow".fmt(f),
|
||||
Op::At => "at".fmt(f),
|
||||
Op::Backslash => "backslash".fmt(f),
|
||||
Op::Bang => "bang".fmt(f),
|
||||
Op::BangBang => "not-not".fmt(f),
|
||||
Op::BangEq => "not equal to".fmt(f),
|
||||
Op::Bar => "or".fmt(f),
|
||||
Op::BarBar => "or-or".fmt(f),
|
||||
Op::BarEq => "or-assign".fmt(f),
|
||||
Op::Colon => "colon".fmt(f),
|
||||
Op::ColonColon => "path separator".fmt(f),
|
||||
Op::Comma => "comma".fmt(f),
|
||||
Op::Dot => "dot".fmt(f),
|
||||
Op::DotDot => "exclusive range".fmt(f),
|
||||
Op::DotDotEq => "inclusive range".fmt(f),
|
||||
Op::Eq => "assign".fmt(f),
|
||||
Op::EqEq => "equal to".fmt(f),
|
||||
Op::FatArrow => "fat arrow".fmt(f),
|
||||
Op::Grave => "grave".fmt(f),
|
||||
Op::Gt => "greater than".fmt(f),
|
||||
Op::GtEq => "greater than or equal to".fmt(f),
|
||||
Op::GtGt => "shift right".fmt(f),
|
||||
Op::GtGtEq => "shift right-assign".fmt(f),
|
||||
Op::Hash => "hash".fmt(f),
|
||||
Op::HashBang => "shebang".fmt(f),
|
||||
Op::Lt => "less than".fmt(f),
|
||||
Op::LtEq => "less than or equal to".fmt(f),
|
||||
Op::LtLt => "shift left".fmt(f),
|
||||
Op::LtLtEq => "shift left-assign".fmt(f),
|
||||
Op::Minus => "sub".fmt(f),
|
||||
Op::MinusEq => "sub-assign".fmt(f),
|
||||
Op::Plus => "add".fmt(f),
|
||||
Op::PlusEq => "add-assign".fmt(f),
|
||||
Op::Question => "huh?".fmt(f),
|
||||
Op::Rem => "rem".fmt(f),
|
||||
Op::RemEq => "rem-assign".fmt(f),
|
||||
Op::Semi => "ignore".fmt(f),
|
||||
Op::Slash => "div".fmt(f),
|
||||
Op::SlashEq => "div-assign".fmt(f),
|
||||
Op::Star => "star".fmt(f),
|
||||
Op::StarEq => "star-assign".fmt(f),
|
||||
Op::Tilde => "tilde".fmt(f),
|
||||
Op::Xor => "xor".fmt(f),
|
||||
Op::XorEq => "xor-assign".fmt(f),
|
||||
Op::XorXor => "cat-ears".fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user