1#[derive(Clone, Debug, PartialEq)]
3pub enum Lexeme {
4 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 FieldTy,
30 XFieldTy,
31 BoolTy,
32 U32Ty,
33 DigestTy,
34
35 LParen, RParen, LBrace, RBrace, LBracket, RBracket, Comma, Colon, Semicolon, Dot, DotDot, Arrow, Eq, FatArrow, EqEq, Plus, Star, StarDot, Lt, Gt, Amp, Caret, SlashPercent, Hash, Underscore, Integer(u64),
64 Ident(String),
65
66 AsmBlock {
68 body: String,
69 effect: i32,
70 target: Option<String>,
71 },
72
73 Eof,
75}
76
77impl Lexeme {
78 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}