Skip to main content

oak_wat/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::Serialize;
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize)]
5pub enum WatSyntaxKind {
6    // 基础 kind
7    Whitespace,
8    Newline,
9    Comment,
10    Error,
11    Eof,
12    Text,
13
14    // 字面量
15    IntegerLiteral,
16    FloatLiteral,
17    StringLiteral,
18    Identifier,
19
20    // 关键字 - 模块结构
21    ModuleKw,
22    FuncKw,
23    ExportKw,
24    ImportKw,
25    TypeKw,
26    ParamKw,
27    ResultKw,
28    LocalKw,
29    GlobalKw,
30    MemoryKw,
31    TableKw,
32    ElemKw,
33    DataKw,
34    StartKw,
35
36    // 关键字 - 控制流
37    BlockKw,
38    LoopKw,
39    IfKw,
40    ThenKw,
41    ElseKw,
42    EndKw,
43    BrKw,
44    BrIfKw,
45    BrTableKw,
46    ReturnKw,
47    CallKw,
48    CallIndirectKw,
49
50    // 关键字 - 变量操作
51    LocalGetKw,
52    LocalSetKw,
53    LocalTeeKw,
54    GlobalGetKw,
55    GlobalSetKw,
56
57    // 关键字 - 内存操作
58    I32LoadKw,
59    I64LoadKw,
60    F32LoadKw,
61    F64LoadKw,
62    I32Load8SKw,
63    I32Load8UKw,
64    I32Load16SKw,
65    I32Load16UKw,
66    I64Load8SKw,
67    I64Load8UKw,
68    I64Load16SKw,
69    I64Load16UKw,
70    I64Load32SKw,
71    I64Load32UKw,
72    I32StoreKw,
73    I64StoreKw,
74    F32StoreKw,
75    F64StoreKw,
76    I32Store8Kw,
77    I32Store16Kw,
78    I64Store8Kw,
79    I64Store16Kw,
80    I64Store32Kw,
81    MemorySizeKw,
82    MemoryGrowKw,
83
84    // 关键字 - 常量
85    I32ConstKw,
86    I64ConstKw,
87    F32ConstKw,
88    F64ConstKw,
89
90    // 关键字 - 算术运算
91    I32AddKw,
92    I64AddKw,
93    F32AddKw,
94    F64AddKw,
95    I32SubKw,
96    I64SubKw,
97    F32SubKw,
98    F64SubKw,
99    I32MulKw,
100    I64MulKw,
101    F32MulKw,
102    F64MulKw,
103    I32DivSKw,
104    I32DivUKw,
105    I64DivSKw,
106    I64DivUKw,
107    F32DivKw,
108    F64DivKw,
109    I32RemSKw,
110    I32RemUKw,
111    I64RemSKw,
112    I64RemUKw,
113
114    // 关键字 - 比较运算
115    I32EqKw,
116    I64EqKw,
117    F32EqKw,
118    F64EqKw,
119    I32NeKw,
120    I64NeKw,
121    F32NeKw,
122    F64NeKw,
123    I32LtSKw,
124    I32LtUKw,
125    I64LtSKw,
126    I64LtUKw,
127    F32LtKw,
128    F64LtKw,
129    I32GtSKw,
130    I32GtUKw,
131    I64GtSKw,
132    I64GtUKw,
133    F32GtKw,
134    F64GtKw,
135    I32LeSKw,
136    I32LeUKw,
137    I64LeSKw,
138    I64LeUKw,
139    F32LeKw,
140    F64LeKw,
141    I32GeSKw,
142    I32GeUKw,
143    I64GeSKw,
144    I64GeUKw,
145    F32GeKw,
146    F64GeKw,
147
148    // 关键字 - 位运算
149    I32AndKw,
150    I64AndKw,
151    I32OrKw,
152    I64OrKw,
153    I32XorKw,
154    I64XorKw,
155    I32ShlKw,
156    I64ShlKw,
157    I32ShrSKw,
158    I32ShrUKw,
159    I64ShrSKw,
160    I64ShrUKw,
161    I32RotlKw,
162    I64RotlKw,
163    I32RotrKw,
164    I64RotrKw,
165
166    // 关键字 - 类型转换
167    I32WrapI64Kw,
168    I64ExtendI32SKw,
169    I64ExtendI32UKw,
170    I32TruncF32SKw,
171    I32TruncF32UKw,
172    I32TruncF64SKw,
173    I32TruncF64UKw,
174    I64TruncF32SKw,
175    I64TruncF32UKw,
176    I64TruncF64SKw,
177    I64TruncF64UKw,
178    F32ConvertI32SKw,
179    F32ConvertI32UKw,
180    F32ConvertI64SKw,
181    F32ConvertI64UKw,
182    F64ConvertI32SKw,
183    F64ConvertI32UKw,
184    F64ConvertI64SKw,
185    F64ConvertI64UKw,
186    F32DemoteF64Kw,
187    F64PromoteF32Kw,
188
189    // 关键字 - 其他指令
190    DropKw,
191    SelectKw,
192    UnreachableKw,
193    NopKw,
194
195    // 关键字 - 类型
196    I32Kw,
197    I64Kw,
198    F32Kw,
199    F64Kw,
200    FuncrefKw,
201    ExternrefKw,
202
203    // 关键字 - 其他
204    MutKw,
205    OffsetKw,
206    AlignKw,
207
208    // 标点符号
209    LeftParen,
210    RightParen,
211    LeftBracket,
212    RightBracket,
213    LeftBrace,
214    RightBrace,
215    Semicolon,
216    Comma,
217    Dot,
218    Quote,
219    Dollar,
220    Plus,
221    Minus,
222    Star,
223    Slash,
224    Eq,
225    Colon,
226    Question,
227    Bang,
228    At,
229    Hash,
230    Percent,
231    Caret,
232    Ampersand,
233    LessThan,
234    GreaterThan,
235    Backslash,
236    Pipe,
237    Tilde,
238    // Special
239    Root,
240    SourceFile,
241    Module,
242    Item,
243}
244
245impl TokenType for WatSyntaxKind {
246    const END_OF_STREAM: Self = Self::Eof;
247    type Role = UniversalTokenRole;
248
249    fn role(&self) -> Self::Role {
250        match self {
251            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
252            Self::Comment => UniversalTokenRole::Comment,
253            Self::Eof => UniversalTokenRole::Eof,
254            _ => UniversalTokenRole::None,
255        }
256    }
257}
258
259impl ElementType for WatSyntaxKind {
260    type Role = UniversalElementRole;
261
262    fn role(&self) -> Self::Role {
263        match self {
264            Self::Root | Self::SourceFile => UniversalElementRole::Root,
265            Self::Error => UniversalElementRole::Error,
266            _ => UniversalElementRole::None,
267        }
268    }
269}