1use std::fmt;
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub enum Token
5{
6 Word(String),
8 Symbol(&'static str),
10 String(String),
12 Integer(i64),
14 EndOfLine,
15 EndOfFile,
16}
17
18impl Token
19{
20 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}