Skip to main content

virtual_rust/
token.rs

1//! Token definitions for the Rust subset supported by VirtualRust.
2//!
3//! Each token represents an atomic syntactic element produced by the lexer.
4
5/// All token types recognized by the lexer.
6#[derive(Debug, Clone, PartialEq)]
7pub enum Token {
8    // ── Literals ────────────────────────────────────────────────────
9    IntLiteral(i64),
10    FloatLiteral(f64),
11    StringLiteral(String),
12    CharLiteral(char),
13    BoolLiteral(bool),
14
15    // ── Identifier ──────────────────────────────────────────────────
16    Ident(String),
17
18    // ── Keywords ────────────────────────────────────────────────────
19    Let,
20    Mut,
21    Fn,
22    Return,
23    If,
24    Else,
25    While,
26    Loop,
27    For,
28    In,
29    Break,
30    Continue,
31    Struct,
32    Impl,
33    Self_,
34    Enum,
35    Match,
36    Pub,
37    Use,
38    Mod,
39    As,
40    Ref,
41
42    // ── Type keywords ────────────────────────────────────────────────
43    I8,
44    I16,
45    I32,
46    I64,
47    I128,
48    U8,
49    U16,
50    U32,
51    U64,
52    U128,
53    F32,
54    F64,
55    Bool,
56    Char,
57    Str,
58    String_,
59    Usize,
60    Isize,
61
62    // ── Operators ───────────────────────────────────────────────────
63    Plus,
64    Minus,
65    Star,
66    Slash,
67    Percent,
68    Eq,
69    EqEq,
70    NotEq,
71    Lt,
72    LtEq,
73    Gt,
74    GtEq,
75    And,
76    Or,
77    Not,
78    Ampersand,
79    Pipe,
80    Caret,
81    Tilde,
82    Shl,
83    Shr,
84    PlusEq,
85    MinusEq,
86    StarEq,
87    SlashEq,
88    PercentEq,
89
90    // ── Delimiters ──────────────────────────────────────────────────
91    LParen,
92    RParen,
93    LBrace,
94    RBrace,
95    LBracket,
96    RBracket,
97
98    // ── Punctuation ─────────────────────────────────────────────────
99    Comma,
100    Semicolon,
101    Colon,
102    ColonColon,
103    Arrow,    // ->
104    FatArrow, // =>
105    Dot,
106    DotDot,     // ..
107    DotDotEq,   // ..=
108    Hash,       // #
109    Underscore, // _
110
111    // ── Special ─────────────────────────────────────────────────────
112    Eof,
113}
114
115impl Token {
116    /// Returns the keyword `Token` for a given string, or `None` if not a keyword.
117    pub fn keyword_from_str(s: &str) -> Option<Token> {
118        match s {
119            "let" => Some(Token::Let),
120            "mut" => Some(Token::Mut),
121            "fn" => Some(Token::Fn),
122            "return" => Some(Token::Return),
123            "if" => Some(Token::If),
124            "else" => Some(Token::Else),
125            "while" => Some(Token::While),
126            "loop" => Some(Token::Loop),
127            "for" => Some(Token::For),
128            "in" => Some(Token::In),
129            "break" => Some(Token::Break),
130            "continue" => Some(Token::Continue),
131            "struct" => Some(Token::Struct),
132            "impl" => Some(Token::Impl),
133            "self" => Some(Token::Self_),
134            "enum" => Some(Token::Enum),
135            "match" => Some(Token::Match),
136            "pub" => Some(Token::Pub),
137            "use" => Some(Token::Use),
138            "mod" => Some(Token::Mod),
139            "as" => Some(Token::As),
140            "ref" => Some(Token::Ref),
141            "true" => Some(Token::BoolLiteral(true)),
142            "false" => Some(Token::BoolLiteral(false)),
143            "i8" => Some(Token::I8),
144            "i16" => Some(Token::I16),
145            "i32" => Some(Token::I32),
146            "i64" => Some(Token::I64),
147            "i128" => Some(Token::I128),
148            "u8" => Some(Token::U8),
149            "u16" => Some(Token::U16),
150            "u32" => Some(Token::U32),
151            "u64" => Some(Token::U64),
152            "u128" => Some(Token::U128),
153            "f32" => Some(Token::F32),
154            "f64" => Some(Token::F64),
155            "bool" => Some(Token::Bool),
156            "char" => Some(Token::Char),
157            "str" => Some(Token::Str),
158            "String" => Some(Token::String_),
159            "usize" => Some(Token::Usize),
160            "isize" => Some(Token::Isize),
161            "_" => Some(Token::Underscore),
162            _ => None,
163        }
164    }
165}
166
167impl std::fmt::Display for Token {
168    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
169        match self {
170            Token::IntLiteral(n) => write!(f, "{}", n),
171            Token::FloatLiteral(n) => write!(f, "{}", n),
172            Token::StringLiteral(s) => write!(f, "\"{}\"", s),
173            Token::CharLiteral(c) => write!(f, "'{}'", c),
174            Token::BoolLiteral(b) => write!(f, "{}", b),
175            Token::Ident(s) => write!(f, "{}", s),
176            Token::Let => write!(f, "let"),
177            Token::Mut => write!(f, "mut"),
178            Token::Fn => write!(f, "fn"),
179            Token::Return => write!(f, "return"),
180            Token::If => write!(f, "if"),
181            Token::Else => write!(f, "else"),
182            Token::While => write!(f, "while"),
183            Token::Loop => write!(f, "loop"),
184            Token::For => write!(f, "for"),
185            Token::In => write!(f, "in"),
186            Token::Break => write!(f, "break"),
187            Token::Continue => write!(f, "continue"),
188            Token::Struct => write!(f, "struct"),
189            Token::Impl => write!(f, "impl"),
190            Token::Self_ => write!(f, "self"),
191            Token::Enum => write!(f, "enum"),
192            Token::Match => write!(f, "match"),
193            _ => write!(f, "{:?}", self),
194        }
195    }
196}