Skip to main content

trident/syntax/
lexeme.rs

1/// All lexemes in the Trident language.
2#[derive(Clone, Debug, PartialEq)]
3pub enum Lexeme {
4    // Keywords
5    Program,
6    Module,
7    Use,
8    Fn,
9    Pub,
10    Sec,
11    Let,
12    Mut,
13    Const,
14    Struct,
15    If,
16    Else,
17    For,
18    In,
19    Bounded,
20    Return,
21    True,
22    False,
23    Event,
24    Reveal,
25    Seal,
26    Match,
27
28    // Type keywords
29    FieldTy,
30    XFieldTy,
31    BoolTy,
32    U32Ty,
33    DigestTy,
34
35    // Symbols
36    LParen,       // (
37    RParen,       // )
38    LBrace,       // {
39    RBrace,       // }
40    LBracket,     // [
41    RBracket,     // ]
42    Comma,        // ,
43    Colon,        // :
44    Semicolon,    // ;
45    Dot,          // .
46    DotDot,       // ..
47    Arrow,        // ->
48    Eq,           // =
49    FatArrow,     // =>
50    EqEq,         // ==
51    Plus,         // +
52    Star,         // *
53    StarDot,      // *.
54    Lt,           // <
55    Gt,           // >
56    Amp,          // &
57    Caret,        // ^
58    SlashPercent, // /%
59    Hash,         // #
60    Underscore,   // _
61
62    // Literals
63    Integer(u64),
64    Ident(String),
65
66    // Inline assembly
67    AsmBlock {
68        body: String,
69        effect: i32,
70        target: Option<String>,
71    },
72
73    // End of file
74    Eof,
75}
76
77impl Lexeme {
78    /// Try to match an identifier string to a keyword or type lexeme.
79    pub fn from_keyword(s: &str) -> Option<Lexeme> {
80        match s {
81            "program" => Some(Lexeme::Program),
82            "module" => Some(Lexeme::Module),
83            "use" => Some(Lexeme::Use),
84            "fn" => Some(Lexeme::Fn),
85            "pub" => Some(Lexeme::Pub),
86            "sec" => Some(Lexeme::Sec),
87            "let" => Some(Lexeme::Let),
88            "mut" => Some(Lexeme::Mut),
89            "const" => Some(Lexeme::Const),
90            "struct" => Some(Lexeme::Struct),
91            "if" => Some(Lexeme::If),
92            "else" => Some(Lexeme::Else),
93            "for" => Some(Lexeme::For),
94            "in" => Some(Lexeme::In),
95            "bounded" => Some(Lexeme::Bounded),
96            "return" => Some(Lexeme::Return),
97            "true" => Some(Lexeme::True),
98            "false" => Some(Lexeme::False),
99            "event" => Some(Lexeme::Event),
100            "reveal" => Some(Lexeme::Reveal),
101            "seal" => Some(Lexeme::Seal),
102            "match" => Some(Lexeme::Match),
103            "Field" => Some(Lexeme::FieldTy),
104            "XField" => Some(Lexeme::XFieldTy),
105            "Bool" => Some(Lexeme::BoolTy),
106            "U32" => Some(Lexeme::U32Ty),
107            "Digest" => Some(Lexeme::DigestTy),
108            "_" => Some(Lexeme::Underscore),
109            _ => None,
110        }
111    }
112
113    pub fn description(&self) -> &'static str {
114        match self {
115            Lexeme::Program => "'program'",
116            Lexeme::Module => "'module'",
117            Lexeme::Use => "'use'",
118            Lexeme::Fn => "'fn'",
119            Lexeme::Pub => "'pub'",
120            Lexeme::Sec => "'sec'",
121            Lexeme::Let => "'let'",
122            Lexeme::Mut => "'mut'",
123            Lexeme::Const => "'const'",
124            Lexeme::Struct => "'struct'",
125            Lexeme::If => "'if'",
126            Lexeme::Else => "'else'",
127            Lexeme::For => "'for'",
128            Lexeme::In => "'in'",
129            Lexeme::Bounded => "'bounded'",
130            Lexeme::Return => "'return'",
131            Lexeme::True => "'true'",
132            Lexeme::False => "'false'",
133            Lexeme::Event => "'event'",
134            Lexeme::Reveal => "'reveal'",
135            Lexeme::Seal => "'seal'",
136            Lexeme::Match => "'match'",
137            Lexeme::FieldTy => "'Field'",
138            Lexeme::XFieldTy => "'XField'",
139            Lexeme::BoolTy => "'Bool'",
140            Lexeme::U32Ty => "'U32'",
141            Lexeme::DigestTy => "'Digest'",
142            Lexeme::LParen => "'('",
143            Lexeme::RParen => "')'",
144            Lexeme::LBrace => "'{'",
145            Lexeme::RBrace => "'}'",
146            Lexeme::LBracket => "'['",
147            Lexeme::RBracket => "']'",
148            Lexeme::Comma => "','",
149            Lexeme::Colon => "':'",
150            Lexeme::Semicolon => "';'",
151            Lexeme::Dot => "'.'",
152            Lexeme::DotDot => "'..'",
153            Lexeme::Arrow => "'->'",
154            Lexeme::Eq => "'='",
155            Lexeme::FatArrow => "'=>'",
156            Lexeme::EqEq => "'=='",
157            Lexeme::Plus => "'+'",
158            Lexeme::Star => "'*'",
159            Lexeme::StarDot => "'*.'",
160            Lexeme::Lt => "'<'",
161            Lexeme::Gt => "'>'",
162            Lexeme::Amp => "'&'",
163            Lexeme::Caret => "'^'",
164            Lexeme::SlashPercent => "'/%'",
165            Lexeme::Hash => "'#'",
166            Lexeme::Underscore => "'_'",
167            Lexeme::Integer(_) => "integer literal",
168            Lexeme::Ident(_) => "identifier",
169            Lexeme::AsmBlock { .. } => "asm block",
170            Lexeme::Eof => "end of file",
171        }
172    }
173}