Skip to main content

oak_graphql/ast/
mod.rs

1use core::range::Range;
2
3type SourceSpan = Range<usize>;
4
5/// GraphQL 根节点
6#[derive(Debug, Clone, PartialEq)]
7pub struct GraphQLRoot {
8    pub document: Document,
9}
10
11/// GraphQL 文档
12#[derive(Debug, Clone, PartialEq)]
13pub struct Document {
14    pub definitions: Vec<Definition>,
15    pub span: SourceSpan,
16}
17
18/// GraphQL 定义
19#[derive(Debug, Clone, PartialEq)]
20pub enum Definition {
21    Operation(OperationDefinition),
22    Fragment(FragmentDefinition),
23    Schema(SchemaDefinition),
24    Type(TypeDefinition),
25}
26
27/// GraphQL 操作定义
28#[derive(Debug, Clone, PartialEq)]
29pub struct OperationDefinition {
30    pub operation_type: OperationType,
31    pub name: Option<String>,
32    pub span: SourceSpan,
33}
34
35/// GraphQL 操作类型
36#[derive(Debug, Clone, PartialEq)]
37pub enum OperationType {
38    Query,
39    Mutation,
40    Subscription,
41}
42
43/// GraphQL 片段定义
44#[derive(Debug, Clone, PartialEq)]
45pub struct FragmentDefinition {
46    pub name: String,
47    pub span: SourceSpan,
48}
49
50/// GraphQL 模式定义
51#[derive(Debug, Clone, PartialEq)]
52pub struct SchemaDefinition {
53    pub span: SourceSpan,
54}
55
56/// GraphQL 类型定义
57#[derive(Debug, Clone, PartialEq)]
58pub struct TypeDefinition {
59    pub name: String,
60    pub span: SourceSpan,
61}
62
63/// C AST 根节点
64#[derive(Debug, Clone, PartialEq)]
65pub struct CAst {
66    pub translation_unit: TranslationUnit,
67}
68
69/// 翻译单元
70#[derive(Debug, Clone, PartialEq)]
71pub struct TranslationUnit {
72    pub external_declarations: Vec<ExternalDeclaration>,
73    pub span: SourceSpan,
74}
75
76/// 外部声明
77#[derive(Debug, Clone, PartialEq)]
78pub enum ExternalDeclaration {
79    FunctionDefinition(FunctionDefinition),
80    Declaration(Declaration),
81}
82
83/// 函数定义
84#[derive(Debug, Clone, PartialEq)]
85pub struct FunctionDefinition {
86    pub declaration_specifiers: Vec<DeclarationSpecifier>,
87    pub declarator: Declarator,
88    pub compound_statement: CompoundStatement,
89    pub span: SourceSpan,
90}
91
92/// 声明
93#[derive(Debug, Clone, PartialEq)]
94pub struct Declaration {
95    pub declaration_specifiers: Vec<DeclarationSpecifier>,
96    pub init_declarators: Vec<InitDeclarator>,
97    pub span: SourceSpan,
98}
99
100/// 声明说明符
101#[derive(Debug, Clone, PartialEq)]
102pub enum DeclarationSpecifier {
103    StorageClassSpecifier(StorageClassSpecifier),
104    TypeSpecifier(TypeSpecifier),
105    TypeQualifier(TypeQualifier),
106    FunctionSpecifier(FunctionSpecifier),
107}
108
109/// 存储类说明符
110#[derive(Debug, Clone, PartialEq)]
111pub enum StorageClassSpecifier {
112    Typedef,
113    Extern,
114    Static,
115    Auto,
116    Register,
117}
118
119/// 类型说明符
120#[derive(Debug, Clone, PartialEq)]
121pub enum TypeSpecifier {
122    Void,
123    Char,
124    Short,
125    Int,
126    Long,
127    Float,
128    Double,
129    Signed,
130    Unsigned,
131    Bool,
132    Complex,
133    Imaginary,
134    StructOrUnion(StructOrUnionSpecifier),
135    Enum(EnumSpecifier),
136    TypedefName(String),
137}
138
139/// 类型限定符
140#[derive(Debug, Clone, PartialEq)]
141pub enum TypeQualifier {
142    Const,
143    Restrict,
144    Volatile,
145}
146
147/// 函数说明符
148#[derive(Debug, Clone, PartialEq)]
149pub enum FunctionSpecifier {
150    Inline,
151    Noreturn,
152}
153
154/// 结构体或联合体说明符
155#[derive(Debug, Clone, PartialEq)]
156pub struct StructOrUnionSpecifier {
157    pub struct_or_union: StructOrUnion,
158    pub identifier: Option<String>,
159    pub struct_declarations: Option<Vec<StructDeclaration>>,
160    pub span: SourceSpan,
161}
162
163/// 结构体或联合体
164#[derive(Debug, Clone, PartialEq)]
165pub enum StructOrUnion {
166    Struct,
167    Union,
168}
169
170/// 结构体声明
171#[derive(Debug, Clone, PartialEq)]
172pub struct StructDeclaration {
173    pub specifier_qualifiers: Vec<SpecifierQualifier>,
174    pub struct_declarators: Vec<StructDeclarator>,
175    pub span: SourceSpan,
176}
177
178/// 说明符限定符
179#[derive(Debug, Clone, PartialEq)]
180pub enum SpecifierQualifier {
181    TypeSpecifier(TypeSpecifier),
182    TypeQualifier(TypeQualifier),
183}
184
185/// 结构体声明符
186#[derive(Debug, Clone, PartialEq)]
187pub struct StructDeclarator {
188    pub declarator: Option<Declarator>,
189    pub constant_expression: Option<Expression>,
190    pub span: SourceSpan,
191}
192
193/// 枚举说明符
194#[derive(Debug, Clone, PartialEq)]
195pub struct EnumSpecifier {
196    pub identifier: Option<String>,
197    pub enumerators: Option<Vec<Enumerator>>,
198    pub span: SourceSpan,
199}
200
201/// 枚举器
202#[derive(Debug, Clone, PartialEq)]
203pub struct Enumerator {
204    pub identifier: String,
205    pub constant_expression: Option<Expression>,
206    pub span: SourceSpan,
207}
208
209/// 初始化声明符
210#[derive(Debug, Clone, PartialEq)]
211pub struct InitDeclarator {
212    pub declarator: Declarator,
213    pub initializer: Option<Initializer>,
214    pub span: SourceSpan,
215}
216
217/// 声明符
218#[derive(Debug, Clone, PartialEq)]
219pub struct Declarator {
220    pub pointer: Option<Pointer>,
221    pub direct_declarator: DirectDeclarator,
222    pub span: SourceSpan,
223}
224
225/// 指针
226#[derive(Debug, Clone, PartialEq)]
227pub struct Pointer {
228    pub type_qualifiers: Vec<TypeQualifier>,
229    pub pointer: Option<Box<Pointer>>,
230    pub span: SourceSpan,
231}
232
233/// 直接声明符
234#[derive(Debug, Clone, PartialEq)]
235pub enum DirectDeclarator {
236    Identifier(String),
237    Declarator(Box<Declarator>),
238    Array { declarator: Box<DirectDeclarator>, assignment_expression: Option<Expression> },
239    Function { declarator: Box<DirectDeclarator>, parameter_type_list: Option<ParameterTypeList>, identifier_list: Option<Vec<String>> },
240}
241
242/// 参数类型列表
243#[derive(Debug, Clone, PartialEq)]
244pub struct ParameterTypeList {
245    pub parameter_list: Vec<ParameterDeclaration>,
246    pub variadic: bool,
247    pub span: SourceSpan,
248}
249
250/// 参数声明
251#[derive(Debug, Clone, PartialEq)]
252pub struct ParameterDeclaration {
253    pub declaration_specifiers: Vec<DeclarationSpecifier>,
254    pub declarator: Option<Declarator>,
255    pub abstract_declarator: Option<AbstractDeclarator>,
256    pub span: SourceSpan,
257}
258
259/// 抽象声明符
260#[derive(Debug, Clone, PartialEq)]
261pub struct AbstractDeclarator {
262    pub pointer: Option<Pointer>,
263    pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
264    pub span: SourceSpan,
265}
266
267/// 直接抽象声明符
268#[derive(Debug, Clone, PartialEq)]
269pub enum DirectAbstractDeclarator {
270    AbstractDeclarator(Box<AbstractDeclarator>),
271    Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>> },
272    Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList> },
273}
274
275/// 初始化器
276#[derive(Debug, Clone, PartialEq)]
277pub enum Initializer {
278    AssignmentExpression(Expression),
279    InitializerList(Vec<Initializer>),
280}
281
282/// 语句
283#[derive(Debug, Clone, PartialEq)]
284pub enum Statement {
285    Labeled(LabeledStatement),
286    Compound(CompoundStatement),
287    Expression(ExpressionStatement),
288    Selection(SelectionStatement),
289    Iteration(IterationStatement),
290    Jump(JumpStatement),
291}
292
293/// 标签语句
294#[derive(Debug, Clone, PartialEq)]
295pub enum LabeledStatement {
296    Label { identifier: String, statement: Box<Statement> },
297    Case { constant_expression: Expression, statement: Box<Statement> },
298    Default { statement: Box<Statement> },
299}
300
301/// 复合语句
302#[derive(Debug, Clone, PartialEq)]
303pub struct CompoundStatement {
304    pub block_items: Vec<BlockItem>,
305    pub span: SourceSpan,
306}
307
308/// 块项
309#[derive(Debug, Clone, PartialEq)]
310pub enum BlockItem {
311    Declaration(Declaration),
312    Statement(Statement),
313}
314
315/// 表达式语句
316#[derive(Debug, Clone, PartialEq)]
317pub struct ExpressionStatement {
318    pub expression: Option<Expression>,
319    pub span: SourceSpan,
320}
321
322/// 选择语句
323#[derive(Debug, Clone, PartialEq)]
324pub enum SelectionStatement {
325    If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>> },
326    Switch { expression: Expression, statement: Box<Statement> },
327}
328
329/// 迭代语句
330#[derive(Debug, Clone, PartialEq)]
331pub enum IterationStatement {
332    While { condition: Expression, statement: Box<Statement> },
333    DoWhile { statement: Box<Statement>, condition: Expression },
334    For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement> },
335}
336
337/// 跳转语句
338#[derive(Debug, Clone, PartialEq)]
339pub enum JumpStatement {
340    Goto(String),
341    Continue,
342    Break,
343    Return(Option<Expression>),
344}
345
346/// 表达式
347#[derive(Debug, Clone, PartialEq)]
348pub struct Expression {
349    pub kind: Box<ExpressionKind>,
350    pub span: SourceSpan,
351}
352
353/// 表达式类型
354#[derive(Debug, Clone, PartialEq)]
355pub enum ExpressionKind {
356    Identifier(String),
357    Constant(Constant),
358    StringLiteral(String),
359    ArraySubscript {
360        array: Box<Expression>,
361        index: Box<Expression>,
362    },
363    FunctionCall {
364        function: Box<Expression>,
365        arguments: Vec<Expression>,
366    },
367    MemberAccess {
368        object: Box<Expression>,
369        member: String,
370        is_pointer: bool, // true for ->, false for .
371    },
372    PostfixIncDec {
373        operand: Box<Expression>,
374        is_increment: bool,
375    },
376    PrefixIncDec {
377        operand: Box<Expression>,
378        is_increment: bool,
379    },
380    Unary {
381        operator: UnaryOperator,
382        operand: Box<Expression>,
383    },
384    Cast {
385        type_name: Box<TypeName>,
386        expression: Box<Expression>,
387    },
388    Binary {
389        left: Box<Expression>,
390        operator: BinaryOperator,
391        right: Box<Expression>,
392    },
393    Conditional {
394        condition: Box<Expression>,
395        then_expr: Box<Expression>,
396        else_expr: Box<Expression>,
397    },
398    Assignment {
399        left: Box<Expression>,
400        operator: AssignmentOperator,
401        right: Box<Expression>,
402    },
403    Comma {
404        expressions: Vec<Expression>,
405    },
406}
407
408/// 常量
409#[derive(Debug, Clone, PartialEq)]
410pub enum Constant {
411    Integer(i64),
412    Float(f64),
413    Character(char),
414}
415
416/// 一元运算符
417#[derive(Debug, Clone, PartialEq)]
418pub enum UnaryOperator {
419    AddressOf,   // &
420    Dereference, // *
421    Plus,        // +
422    Minus,       // -
423    BitwiseNot,  // ~
424    LogicalNot,  // !
425    Sizeof,      // sizeof
426}
427
428/// 二元运算符
429#[derive(Debug, Clone, PartialEq)]
430pub enum BinaryOperator {
431    // 算术运算符
432    Add,      // +
433    Subtract, // -
434    Multiply, // *
435    Divide,   // /
436    Modulo,   // %
437
438    // 位运算符
439    BitwiseAnd, // &
440    BitwiseOr,  // |
441    BitwiseXor, // ^
442    LeftShift,  // <<
443    RightShift, // >>
444
445    // 比较运算符
446    Equal,        // ==
447    NotEqual,     // !=
448    Less,         // <
449    Greater,      // >
450    LessEqual,    // <=
451    GreaterEqual, // >=
452
453    // 逻辑运算符
454    LogicalAnd, // &&
455    LogicalOr,  // ||
456}
457
458/// 赋值运算符
459#[derive(Debug, Clone, PartialEq)]
460pub enum AssignmentOperator {
461    Assign,           // =
462    AddAssign,        // +=
463    SubAssign,        // -=
464    MulAssign,        // *=
465    DivAssign,        // /=
466    ModAssign,        // %=
467    AndAssign,        // &=
468    OrAssign,         // |=
469    XorAssign,        // ^=
470    LeftShiftAssign,  // <<=
471    RightShiftAssign, // >>=
472}
473
474/// 类型名
475#[derive(Debug, Clone, PartialEq)]
476pub struct TypeName {
477    pub specifier_qualifiers: Vec<SpecifierQualifier>,
478    pub abstract_declarator: Option<Box<AbstractDeclarator>>,
479    pub span: SourceSpan,
480}
481
482impl CAst {
483    pub fn new(translation_unit: TranslationUnit) -> Self {
484        Self { translation_unit }
485    }
486}
487
488impl TranslationUnit {
489    pub fn new(external_declarations: Vec<ExternalDeclaration>, span: SourceSpan) -> Self {
490        Self { external_declarations, span }
491    }
492}