mimium_lang/compiler/parser/
token.rs

1use std::fmt;
2
3use crate::ast::operators::Op;
4use crate::interner::Symbol;
5#[derive(Debug, Clone, PartialEq, Eq, Hash)]
6pub enum Comment {
7    SingleLine(String),
8    MultiLine(String),
9}
10
11#[derive(Clone, Debug, PartialEq, Eq, Hash)]
12pub enum Token {
13    Ident(Symbol),
14    MacroExpand(Symbol),
15
16    FloatType,
17    IntegerType,
18    StringType,
19    StructType,
20
21    Float(String),
22    Int(i64),
23    Str(String),
24
25    Op(Op),
26    SelfLit,
27    Now,
28    SampleRate,
29    Comma,
30    /// Dot operator, used for field access, which may be concatenated with left associativity
31    Dot, // .
32    /// Double dot, used for omitting default values in record literals and function calls
33    DoubleDot, // ..
34    Colon,
35    SemiColon,
36
37    Let,
38    LetRec,
39    Assign,
40
41    ParenBegin,
42    ParenEnd,
43    ArrayBegin,
44    ArrayEnd,
45    BlockBegin,
46    BlockEnd,
47    LambdaArgBeginEnd,
48    BackQuote,
49    Dollar,
50
51    Function,    //"fn"
52    Macro,       //"macro"
53    Arrow,       // ->
54    LeftArrow,   // <-
55    PlaceHolder, // _
56
57    If,
58    Else,
59
60    // Type,
61    // Alias,
62    Include,
63    Sharp,    // "#"
64    StageKwd, // "stage"
65    Main,     // "main"
66
67    LineBreak,
68
69    Comment(Comment),
70}
71
72impl fmt::Display for Token {
73    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
74        match self {
75            Token::Ident(x) => write!(f, "{x}"),
76            Token::MacroExpand(x) => write!(f, "{x}!"),
77            Token::FloatType => write!(f, "float"),
78            Token::IntegerType => write!(f, "int"),
79            Token::StringType => write!(f, "string"),
80            Token::StructType => write!(f, "struct"),
81            Token::Int(x) => write!(f, "{x}"),
82            Token::Float(x) => write!(f, "{x}"),
83            Token::Str(x) => write!(f, "\"{x}\""),
84            Token::Op(x) => write!(f, "{x}"),
85            Token::SelfLit => write!(f, "self"),
86            Token::Now => write!(f, "now"),
87            Token::SampleRate => write!(f, "samplerate"),
88            Token::Comma => write!(f, ","),
89            Token::Dot => write!(f, "."),
90            Token::DoubleDot => write!(f, ".."),
91            Token::Colon => write!(f, ":"),
92            Token::SemiColon => write!(f, ";"),
93            Token::Let => write!(f, "let"),
94            Token::LetRec => write!(f, "letrec"),
95            Token::Assign => write!(f, "="),
96            Token::ParenBegin => write!(f, "("),
97            Token::ParenEnd => write!(f, ")"),
98            Token::ArrayBegin => write!(f, "["),
99            Token::ArrayEnd => write!(f, "]"),
100            Token::BlockBegin => write!(f, "{{"),
101            Token::BlockEnd => write!(f, "}}"),
102            Token::LambdaArgBeginEnd => write!(f, "|"),
103            Token::Function => write!(f, "fn"),
104            Token::Macro => write!(f, "macro"),
105            Token::Arrow => write!(f, "->"),
106            Token::LeftArrow => write!(f, "<-"),
107            Token::PlaceHolder => write!(f, "_"),
108            Token::If => write!(f, "if"),
109            Token::Else => write!(f, "else"),
110            Token::Include => write!(f, "include"),
111            Token::LineBreak => write!(f, "linebreak"),
112            Token::Comment(_) => write!(f, "comment"),
113            Token::BackQuote => write!(f, "`"),
114            Token::Dollar => write!(f, "$"),
115            Token::StageKwd => write!(f, "stage"),
116            Token::Main => write!(f, "main"),
117            Token::Sharp => write!(f, "#"),
118        }
119    }
120}