Skip to main content

neutron_engine/iris/
token.rs

1use std::fmt;
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum TokenType {
5    // Single char tokens (legacy names kept for parser/lexer compatibility)
6    LParen, RParen, LBrace, RBrace,
7    LeftParen, RightParen, LeftBrace, RightBrace,
8    Comma, Colon, Dot, Minus, Plus, Semicolon, Slash, Star,
9    LBracket, RBracket,
10
11    // One or two char tokens
12    Bang, BangEqual,
13    Equal, EqualEqual,
14    Greater, GreaterEqual, Gt, Gte,
15    Less, LessEqual, Lt, Lte,
16    Percent,
17    Arrow, FatArrow, Scope,
18    AndAnd, OrOr,
19    Assign,
20
21    // Literals
22    String(String),
23    Number(f64),
24    Identifier(String),
25
26    True, False, Null,
27    Bool(bool),
28
29    // Helpers / parsing tokens
30    Newline,
31    Import,
32    System,
33
34
35    // Compound assignments
36    PlusAssign, MinusAssign, StarAssign, SlashAssign,
37
38    // Equality operators
39    Eq, Neq,
40
41    // Unary operator tokens
42    Not,
43
44    // Keywords
45    And, Class, Else, Elif, Fn, For, If, In,
46    Let, Const, Or, Print, Return,
47    Super, This, Var, While, Break, Continue,
48
49    Comment(String),
50
51    Eof,
52}
53
54#[derive(Debug, Clone)]
55pub struct Token {
56    pub token_type: TokenType,
57    pub lexeme: String,
58    pub line: usize,
59    // lexer provides column sometimes; parser/interp here don't need it.
60    // Keeping compatible with existing lexer token struct usage elsewhere.
61    pub column: usize,
62}
63
64impl fmt::Display for TokenType {
65    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66        match self {
67            TokenType::String(s) => write!(f, "STRING({})", s),
68            TokenType::Number(n) => write!(f, "NUMBER({})", n),
69            TokenType::Comment(s) => write!(f, "COMMENT({})", s),
70            TokenType::Identifier(_) => write!(f, "IDENTIFIER"),
71
72            _ => write!(f, "{:?}", self),
73        }
74    }
75}
76