Skip to main content

oak_graphql/ast/
mod.rs

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