rubic/parse/
token.rs

1use std::fmt;
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub enum Token
5{
6    /// A standalone work.
7    Word(String),
8    /// A symbol.
9    Symbol(&'static str),
10    /// A string in quotes.
11    String(String),
12    /// An integer.
13    Integer(i64),
14    EndOfLine,
15    EndOfFile,
16}
17
18impl Token
19{
20    /// The `class` keyword.
21    pub fn class() -> Token { Token::Word("class".to_owned()) }
22    pub fn module() -> Token { Token::Word("module".to_owned()) }
23    pub fn def() -> Token { Token::Word("def".to_owned()) }
24    pub fn end() -> Token { Token::Word("end".to_owned()) }
25
26    pub fn left_paren() -> Token { Token::Symbol("(") }
27    pub fn right_paren() -> Token { Token::Symbol(")") }
28
29    pub fn less_than() -> Token { Token::Symbol("<") }
30    pub fn greater_than() -> Token { Token::Symbol(">") }
31
32    pub fn colon() -> Token { Token::Symbol(":") }
33    pub fn comma() -> Token { Token::Symbol(",") }
34    pub fn negate() -> Token { Token::Symbol("-") }
35
36    pub fn rocket() -> Token { Token::Symbol("=>") }
37    pub fn equals() -> Token { Token::Symbol("=") }
38
39    pub fn is_terminator(&self) -> bool {
40        match *self {
41            Token::EndOfLine |
42                Token::Symbol(";") => true,
43            _ => false,
44        }
45    }
46}
47
48impl fmt::Display for Token
49{
50    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
51        match *self {
52            Token::Word(ref word) => word.fmt(fmt),
53            Token::Symbol(sym) => sym.fmt(fmt),
54            Token::String(ref s) => write!(fmt, "\"{}\"", s),
55            Token::Integer(i) => i.fmt(fmt),
56            Token::EndOfLine => "end-of-line".fmt(fmt),
57            Token::EndOfFile => "end-of-file".fmt(fmt),
58        }
59    }
60}