oak_graphql/ast/
mod.rs

1use std::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 {
239        declarator: Box<DirectDeclarator>,
240        assignment_expression: Option<Expression>,
241    },
242    Function {
243        declarator: Box<DirectDeclarator>,
244        parameter_type_list: Option<ParameterTypeList>,
245        identifier_list: Option<Vec<String>>,
246    },
247}
248
249/// 参数类型列表
250#[derive(Debug, Clone, PartialEq)]
251pub struct ParameterTypeList {
252    pub parameter_list: Vec<ParameterDeclaration>,
253    pub variadic: bool,
254    pub span: SourceSpan,
255}
256
257/// 参数声明
258#[derive(Debug, Clone, PartialEq)]
259pub struct ParameterDeclaration {
260    pub declaration_specifiers: Vec<DeclarationSpecifier>,
261    pub declarator: Option<Declarator>,
262    pub abstract_declarator: Option<AbstractDeclarator>,
263    pub span: SourceSpan,
264}
265
266/// 抽象声明符
267#[derive(Debug, Clone, PartialEq)]
268pub struct AbstractDeclarator {
269    pub pointer: Option<Pointer>,
270    pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
271    pub span: SourceSpan,
272}
273
274/// 直接抽象声明符
275#[derive(Debug, Clone, PartialEq)]
276pub enum DirectAbstractDeclarator {
277    AbstractDeclarator(Box<AbstractDeclarator>),
278    Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>> },
279    Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList> },
280}
281
282/// 初始化器
283#[derive(Debug, Clone, PartialEq)]
284pub enum Initializer {
285    AssignmentExpression(Expression),
286    InitializerList(Vec<Initializer>),
287}
288
289/// 语句
290#[derive(Debug, Clone, PartialEq)]
291pub enum Statement {
292    Labeled(LabeledStatement),
293    Compound(CompoundStatement),
294    Expression(ExpressionStatement),
295    Selection(SelectionStatement),
296    Iteration(IterationStatement),
297    Jump(JumpStatement),
298}
299
300/// 标签语句
301#[derive(Debug, Clone, PartialEq)]
302pub enum LabeledStatement {
303    Label { identifier: String, statement: Box<Statement> },
304    Case { constant_expression: Expression, statement: Box<Statement> },
305    Default { statement: Box<Statement> },
306}
307
308/// 复合语句
309#[derive(Debug, Clone, PartialEq)]
310pub struct CompoundStatement {
311    pub block_items: Vec<BlockItem>,
312    pub span: SourceSpan,
313}
314
315/// 块项
316#[derive(Debug, Clone, PartialEq)]
317pub enum BlockItem {
318    Declaration(Declaration),
319    Statement(Statement),
320}
321
322/// 表达式语句
323#[derive(Debug, Clone, PartialEq)]
324pub struct ExpressionStatement {
325    pub expression: Option<Expression>,
326    pub span: SourceSpan,
327}
328
329/// 选择语句
330#[derive(Debug, Clone, PartialEq)]
331pub enum SelectionStatement {
332    If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>> },
333    Switch { expression: Expression, statement: Box<Statement> },
334}
335
336/// 迭代语句
337#[derive(Debug, Clone, PartialEq)]
338pub enum IterationStatement {
339    While { condition: Expression, statement: Box<Statement> },
340    DoWhile { statement: Box<Statement>, condition: Expression },
341    For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement> },
342}
343
344/// 跳转语句
345#[derive(Debug, Clone, PartialEq)]
346pub enum JumpStatement {
347    Goto(String),
348    Continue,
349    Break,
350    Return(Option<Expression>),
351}
352
353/// 表达式
354#[derive(Debug, Clone, PartialEq)]
355pub struct Expression {
356    pub kind: Box<ExpressionKind>,
357    pub span: SourceSpan,
358}
359
360/// 表达式类型
361#[derive(Debug, Clone, PartialEq)]
362pub enum ExpressionKind {
363    Identifier(String),
364    Constant(Constant),
365    StringLiteral(String),
366    ArraySubscript {
367        array: Box<Expression>,
368        index: Box<Expression>,
369    },
370    FunctionCall {
371        function: Box<Expression>,
372        arguments: Vec<Expression>,
373    },
374    MemberAccess {
375        object: Box<Expression>,
376        member: String,
377        is_pointer: bool, // true for ->, false for .
378    },
379    PostfixIncDec {
380        operand: Box<Expression>,
381        is_increment: bool,
382    },
383    PrefixIncDec {
384        operand: Box<Expression>,
385        is_increment: bool,
386    },
387    Unary {
388        operator: UnaryOperator,
389        operand: Box<Expression>,
390    },
391    Cast {
392        type_name: Box<TypeName>,
393        expression: Box<Expression>,
394    },
395    Binary {
396        left: Box<Expression>,
397        operator: BinaryOperator,
398        right: Box<Expression>,
399    },
400    Conditional {
401        condition: Box<Expression>,
402        then_expr: Box<Expression>,
403        else_expr: Box<Expression>,
404    },
405    Assignment {
406        left: Box<Expression>,
407        operator: AssignmentOperator,
408        right: Box<Expression>,
409    },
410    Comma {
411        expressions: Vec<Expression>,
412    },
413}
414
415/// 常量
416#[derive(Debug, Clone, PartialEq)]
417pub enum Constant {
418    Integer(i64),
419    Float(f64),
420    Character(char),
421}
422
423/// 一元运算符
424#[derive(Debug, Clone, PartialEq)]
425pub enum UnaryOperator {
426    AddressOf,   // &
427    Dereference, // *
428    Plus,        // +
429    Minus,       // -
430    BitwiseNot,  // ~
431    LogicalNot,  // !
432    Sizeof,      // sizeof
433}
434
435/// 二元运算符
436#[derive(Debug, Clone, PartialEq)]
437pub enum BinaryOperator {
438    // 算术运算符
439    Add,      // +
440    Subtract, // -
441    Multiply, // *
442    Divide,   // /
443    Modulo,   // %
444
445    // 位运算符
446    BitwiseAnd, // &
447    BitwiseOr,  // |
448    BitwiseXor, // ^
449    LeftShift,  // <<
450    RightShift, // >>
451
452    // 比较运算符
453    Equal,        // ==
454    NotEqual,     // !=
455    Less,         // <
456    Greater,      // >
457    LessEqual,    // <=
458    GreaterEqual, // >=
459
460    // 逻辑运算符
461    LogicalAnd, // &&
462    LogicalOr,  // ||
463}
464
465/// 赋值运算符
466#[derive(Debug, Clone, PartialEq)]
467pub enum AssignmentOperator {
468    Assign,           // =
469    AddAssign,        // +=
470    SubAssign,        // -=
471    MulAssign,        // *=
472    DivAssign,        // /=
473    ModAssign,        // %=
474    AndAssign,        // &=
475    OrAssign,         // |=
476    XorAssign,        // ^=
477    LeftShiftAssign,  // <<=
478    RightShiftAssign, // >>=
479}
480
481/// 类型名
482#[derive(Debug, Clone, PartialEq)]
483pub struct TypeName {
484    pub specifier_qualifiers: Vec<SpecifierQualifier>,
485    pub abstract_declarator: Option<Box<AbstractDeclarator>>,
486    pub span: SourceSpan,
487}
488
489impl CAst {
490    pub fn new(translation_unit: TranslationUnit) -> Self {
491        Self { translation_unit }
492    }
493}
494
495impl TranslationUnit {
496    pub fn new(external_declarations: Vec<ExternalDeclaration>, span: SourceSpan) -> Self {
497        Self { external_declarations, span }
498    }
499}