diff --git a/libconlang/src/lexer.rs b/libconlang/src/lexer.rs index 3e9ef2e..acaa726 100644 --- a/libconlang/src/lexer.rs +++ b/libconlang/src/lexer.rs @@ -100,13 +100,13 @@ impl<'t> Lexer<'t> { '\\' => self.consume()?.produce(Type::Backslash, ()), '!' => self.consume()?.bang(), '|' => self.consume()?.bar(), - ':' => self.consume()?.produce(Type::Colon, ()), + ':' => self.consume()?.colon(), ',' => self.consume()?.produce(Type::Comma, ()), '.' => self.consume()?.dot(), '=' => self.consume()?.equal(), '`' => self.consume()?.produce(Type::Grave, ()), '>' => self.consume()?.greater(), - '#' => self.consume()?.produce(Type::Hash, ()), + '#' => self.consume()?.hash(), '<' => self.consume()?.less(), '-' => self.consume()?.minus(), '+' => self.consume()?.plus(), @@ -203,6 +203,12 @@ impl<'t> Lexer<'t> { _ => self.produce(Type::Bar, ()), } } + fn colon(&mut self) -> LResult { + match self.peek() { + Ok(':') => self.consume()?.produce(Type::ColonColon, ()), + _ => self.produce(Type::Colon, ()), + } + } fn dot(&mut self) -> LResult { match self.peek() { Ok('.') => { @@ -235,6 +241,12 @@ impl<'t> Lexer<'t> { _ => self.produce(Type::Gt, ()), } } + fn hash(&mut self) -> LResult { + match self.peek() { + Ok('!') => self.consume()?.produce(Type::HashBang, ()), + _ => self.produce(Type::Hash, ()), + } + } fn less(&mut self) -> LResult { match self.peek() { Ok('=') => self.consume()?.produce(Type::LtEq, ()), diff --git a/libconlang/src/token/token_type.rs b/libconlang/src/token/token_type.rs index 47b44ec..2821de6 100644 --- a/libconlang/src/token/token_type.rs +++ b/libconlang/src/token/token_type.rs @@ -17,58 +17,60 @@ pub enum Type { String, Character, // Delimiters and punctuation - LCurly, // { - RCurly, // } - LBrack, // [ - RBrack, // ] - LParen, // ( - RParen, // ) - Amp, // & - AmpAmp, // && - AmpEq, // &= - Arrow, // -> - At, // @ - Backslash, // \ - Bang, // ! - BangBang, // !! - BangEq, // != - Bar, // | - BarBar, // || - BarEq, // |= - Colon, // : - Comma, // , - Dot, // . - DotDot, // .. - DotDotEq, // ..= - Eq, // = - EqEq, // == - FatArrow, // => - Grave, // ` - Gt, // > - GtEq, // >= - GtGt, // >> - GtGtEq, // >>= - Hash, // # - Lt, // < - LtEq, // <= - LtLt, // << - LtLtEq, // <<= - Minus, // - - MinusEq, // -= - Plus, // + - PlusEq, // += - Question, // ? - Rem, // % - RemEq, // %= - Semi, // ; - Slash, // / - SlashEq, // /= - Star, // * - StarEq, // *= - Tilde, // ~ - Xor, // ^ - XorEq, // ^= - XorXor, // ^^ + LCurly, // { + RCurly, // } + LBrack, // [ + RBrack, // ] + LParen, // ( + RParen, // ) + Amp, // & + AmpAmp, // && + AmpEq, // &= + Arrow, // -> + At, // @ + Backslash, // \ + Bang, // ! + BangBang, // !! + BangEq, // != + Bar, // | + BarBar, // || + BarEq, // |= + Colon, // : + ColonColon, // :: + Comma, // , + Dot, // . + DotDot, // .. + DotDotEq, // ..= + Eq, // = + EqEq, // == + FatArrow, // => + Grave, // ` + Gt, // > + GtEq, // >= + GtGt, // >> + GtGtEq, // >>= + Hash, // # + HashBang, // #! + Lt, // < + LtEq, // <= + LtLt, // << + LtLtEq, // <<= + Minus, // - + MinusEq, // -= + Plus, // + + PlusEq, // += + Question, // ? + Rem, // % + RemEq, // %= + Semi, // ; + Slash, // / + SlashEq, // /= + Star, // * + StarEq, // *= + Tilde, // ~ + Xor, // ^ + XorEq, // ^= + XorXor, // ^^ } /// Represents a reserved word. @@ -119,6 +121,7 @@ impl Display for Type { Type::BarBar => "or-or".fmt(f), Type::BarEq => "or-assign".fmt(f), Type::Colon => "colon".fmt(f), + Type::ColonColon => "path separator".fmt(f), Type::Comma => "comma".fmt(f), Type::Dot => "dot".fmt(f), Type::DotDot => "exclusive range".fmt(f), @@ -132,6 +135,7 @@ impl Display for Type { Type::GtGt => "shift right".fmt(f), Type::GtGtEq => "shift right-assign".fmt(f), Type::Hash => "hash".fmt(f), + Type::HashBang => "shebang".fmt(f), Type::Lt => "less than".fmt(f), Type::LtEq => "less than or equal to".fmt(f), Type::LtLt => "shift left".fmt(f),