Skip to main content

oak_c/ast/
mod.rs

1/// C 语言抽象语法
2#[derive(Debug, Clone, PartialEq)]
3pub struct CRoot {
4    pub translation_unit: TranslationUnit,
5    pub span: core::range::Range<usize>,
6}
7
8/// 翻译单元(C 程序的顶层结构)
9#[derive(Debug, Clone, PartialEq)]
10pub struct TranslationUnit {
11    pub external_declarations: Vec<ExternalDeclaration>,
12    pub span: core::range::Range<usize>,
13}
14
15/// 外部声明
16#[derive(Debug, Clone, PartialEq)]
17pub enum ExternalDeclaration {
18    /// 函数定义
19    FunctionDefinition(FunctionDefinition),
20    /// 声明
21    Declaration(Declaration),
22}
23
24impl ExternalDeclaration {
25    pub fn span(&self) -> core::range::Range<usize> {
26        match self {
27            Self::FunctionDefinition(n) => n.span.clone(),
28            Self::Declaration(n) => n.span.clone(),
29        }
30    }
31}
32
33/// 函数定义
34#[derive(Debug, Clone, PartialEq)]
35pub struct FunctionDefinition {
36    pub declaration_specifiers: Vec<DeclarationSpecifier>,
37    pub declarator: Declarator,
38    pub compound_statement: CompoundStatement,
39    pub span: core::range::Range<usize>,
40}
41
42/// 声明
43#[derive(Debug, Clone, PartialEq)]
44pub struct Declaration {
45    pub declaration_specifiers: Vec<DeclarationSpecifier>,
46    pub init_declarators: Vec<InitDeclarator>,
47    pub span: core::range::Range<usize>,
48}
49
50/// 声明说明
51#[derive(Debug, Clone, PartialEq)]
52pub enum DeclarationSpecifier {
53    /// 存储类说明符
54    StorageClassSpecifier(StorageClassSpecifier),
55    /// 类型说明
56    TypeSpecifier(TypeSpecifier),
57    /// 类型限定
58    TypeQualifier(TypeQualifier),
59    /// 函数说明
60    FunctionSpecifier(FunctionSpecifier),
61}
62
63impl DeclarationSpecifier {
64    pub fn span(&self) -> core::range::Range<usize> {
65        match self {
66            Self::StorageClassSpecifier(n) => n.span(),
67            Self::TypeSpecifier(n) => n.span(),
68            Self::TypeQualifier(n) => n.span(),
69            Self::FunctionSpecifier(n) => n.span(),
70        }
71    }
72}
73
74/// 存储类说明符
75#[derive(Debug, Clone, PartialEq)]
76pub enum StorageClassSpecifier {
77    Typedef { span: core::range::Range<usize> },
78    Extern { span: core::range::Range<usize> },
79    Static { span: core::range::Range<usize> },
80    Auto { span: core::range::Range<usize> },
81    Register { span: core::range::Range<usize> },
82}
83
84impl StorageClassSpecifier {
85    pub fn span(&self) -> core::range::Range<usize> {
86        match self {
87            Self::Typedef { span } => span.clone(),
88            Self::Extern { span } => span.clone(),
89            Self::Static { span } => span.clone(),
90            Self::Auto { span } => span.clone(),
91            Self::Register { span } => span.clone(),
92        }
93    }
94}
95
96/// 类型说明
97#[derive(Debug, Clone, PartialEq)]
98pub enum TypeSpecifier {
99    Void { span: core::range::Range<usize> },
100    Char { span: core::range::Range<usize> },
101    Short { span: core::range::Range<usize> },
102    Int { span: core::range::Range<usize> },
103    Long { span: core::range::Range<usize> },
104    Float { span: core::range::Range<usize> },
105    Double { span: core::range::Range<usize> },
106    Signed { span: core::range::Range<usize> },
107    Unsigned { span: core::range::Range<usize> },
108    Bool { span: core::range::Range<usize> },
109    Complex { span: core::range::Range<usize> },
110    Imaginary { span: core::range::Range<usize> },
111    StructOrUnion(StructOrUnionSpecifier),
112    Enum(EnumSpecifier),
113    TypedefName(String, core::range::Range<usize>),
114}
115
116impl TypeSpecifier {
117    pub fn span(&self) -> core::range::Range<usize> {
118        match self {
119            Self::Void { span } => span.clone(),
120            Self::Char { span } => span.clone(),
121            Self::Short { span } => span.clone(),
122            Self::Int { span } => span.clone(),
123            Self::Long { span } => span.clone(),
124            Self::Float { span } => span.clone(),
125            Self::Double { span } => span.clone(),
126            Self::Signed { span } => span.clone(),
127            Self::Unsigned { span } => span.clone(),
128            Self::Bool { span } => span.clone(),
129            Self::Complex { span } => span.clone(),
130            Self::Imaginary { span } => span.clone(),
131            Self::StructOrUnion(n) => n.span.clone(),
132            Self::Enum(n) => n.span.clone(),
133            Self::TypedefName(_, span) => span.clone(),
134        }
135    }
136}
137
138/// 类型限定
139#[derive(Debug, Clone, PartialEq)]
140pub enum TypeQualifier {
141    Const { span: core::range::Range<usize> },
142    Restrict { span: core::range::Range<usize> },
143    Volatile { span: core::range::Range<usize> },
144}
145
146impl TypeQualifier {
147    pub fn span(&self) -> core::range::Range<usize> {
148        match self {
149            Self::Const { span } => span.clone(),
150            Self::Restrict { span } => span.clone(),
151            Self::Volatile { span } => span.clone(),
152        }
153    }
154}
155
156/// 函数说明
157#[derive(Debug, Clone, PartialEq)]
158pub enum FunctionSpecifier {
159    Inline { span: core::range::Range<usize> },
160    Noreturn { span: core::range::Range<usize> },
161}
162
163impl FunctionSpecifier {
164    pub fn span(&self) -> core::range::Range<usize> {
165        match self {
166            Self::Inline { span } => span.clone(),
167            Self::Noreturn { span } => span.clone(),
168        }
169    }
170}
171
172/// 结构体或联合体说明符
173#[derive(Debug, Clone, PartialEq)]
174pub struct StructOrUnionSpecifier {
175    pub struct_or_union: StructOrUnion,
176    pub identifier: Option<String>,
177    pub struct_declarations: Option<Vec<StructDeclaration>>,
178    pub span: core::range::Range<usize>,
179}
180
181/// 结构体或联合
182#[derive(Debug, Clone, PartialEq)]
183pub enum StructOrUnion {
184    Struct { span: core::range::Range<usize> },
185    Union { span: core::range::Range<usize> },
186}
187
188impl StructOrUnion {
189    pub fn span(&self) -> core::range::Range<usize> {
190        match self {
191            Self::Struct { span } => span.clone(),
192            Self::Union { span } => span.clone(),
193        }
194    }
195}
196
197/// 结构体声
198#[derive(Debug, Clone, PartialEq)]
199pub struct StructDeclaration {
200    pub specifier_qualifiers: Vec<SpecifierQualifier>,
201    pub struct_declarators: Vec<StructDeclarator>,
202    pub span: core::range::Range<usize>,
203}
204
205/// 说明符限定符
206#[derive(Debug, Clone, PartialEq)]
207pub enum SpecifierQualifier {
208    TypeSpecifier(TypeSpecifier),
209    TypeQualifier(TypeQualifier),
210}
211
212impl SpecifierQualifier {
213    pub fn span(&self) -> core::range::Range<usize> {
214        match self {
215            Self::TypeSpecifier(n) => n.span(),
216            Self::TypeQualifier(n) => n.span(),
217        }
218    }
219}
220
221/// 结构体声明符
222#[derive(Debug, Clone, PartialEq)]
223pub struct StructDeclarator {
224    pub declarator: Option<Declarator>,
225    pub constant_expression: Option<Expression>,
226    pub span: core::range::Range<usize>,
227}
228
229/// 枚举说明
230#[derive(Debug, Clone, PartialEq)]
231pub struct EnumSpecifier {
232    pub identifier: Option<String>,
233    pub enumerators: Option<Vec<Enumerator>>,
234    pub span: core::range::Range<usize>,
235}
236
237/// 枚举
238#[derive(Debug, Clone, PartialEq)]
239pub struct Enumerator {
240    pub identifier: String,
241    pub constant_expression: Option<Expression>,
242    pub span: core::range::Range<usize>,
243}
244
245/// 初始化声明符
246#[derive(Debug, Clone, PartialEq)]
247pub struct InitDeclarator {
248    pub declarator: Declarator,
249    pub initializer: Option<Initializer>,
250    pub span: core::range::Range<usize>,
251}
252
253/// 声明
254#[derive(Debug, Clone, PartialEq)]
255pub struct Declarator {
256    pub pointer: Option<Pointer>,
257    pub direct_declarator: DirectDeclarator,
258    pub span: core::range::Range<usize>,
259}
260
261/// 指针
262#[derive(Debug, Clone, PartialEq)]
263pub struct Pointer {
264    pub type_qualifiers: Vec<TypeQualifier>,
265    pub pointer: Option<Box<Pointer>>,
266    pub span: core::range::Range<usize>,
267}
268
269/// 直接声明
270#[derive(Debug, Clone, PartialEq)]
271pub enum DirectDeclarator {
272    Identifier(String, core::range::Range<usize>),
273    Declarator(Box<Declarator>),
274    Array { declarator: Box<DirectDeclarator>, assignment_expression: Option<Expression>, span: core::range::Range<usize> },
275    Function { declarator: Box<DirectDeclarator>, parameter_type_list: Option<ParameterTypeList>, identifier_list: Option<Vec<String>>, span: core::range::Range<usize> },
276}
277
278impl DirectDeclarator {
279    pub fn span(&self) -> core::range::Range<usize> {
280        match self {
281            Self::Identifier(_, span) => span.clone(),
282            Self::Declarator(n) => n.span.clone(),
283            Self::Array { span, .. } => span.clone(),
284            Self::Function { span, .. } => span.clone(),
285        }
286    }
287}
288
289/// 参数类型列表
290#[derive(Debug, Clone, PartialEq)]
291pub struct ParameterTypeList {
292    pub parameter_list: Vec<ParameterDeclaration>,
293    pub variadic: bool,
294    pub span: core::range::Range<usize>,
295}
296
297/// 参数声明
298#[derive(Debug, Clone, PartialEq)]
299pub struct ParameterDeclaration {
300    pub declaration_specifiers: Vec<DeclarationSpecifier>,
301    pub declarator: Option<Declarator>,
302    pub abstract_declarator: Option<AbstractDeclarator>,
303    pub span: core::range::Range<usize>,
304}
305
306/// 抽象声明
307#[derive(Debug, Clone, PartialEq)]
308pub struct AbstractDeclarator {
309    pub pointer: Option<Pointer>,
310    pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
311    pub span: core::range::Range<usize>,
312}
313
314/// 直接抽象声明
315#[derive(Debug, Clone, PartialEq)]
316pub enum DirectAbstractDeclarator {
317    AbstractDeclarator(Box<AbstractDeclarator>),
318    Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>>, span: core::range::Range<usize> },
319    Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList>, span: core::range::Range<usize> },
320}
321
322impl DirectAbstractDeclarator {
323    pub fn span(&self) -> core::range::Range<usize> {
324        match self {
325            Self::AbstractDeclarator(n) => n.span.clone(),
326            Self::Array { span, .. } => span.clone(),
327            Self::Function { span, .. } => span.clone(),
328        }
329    }
330}
331
332/// 初始化器
333#[derive(Debug, Clone, PartialEq)]
334pub enum Initializer {
335    AssignmentExpression(Expression),
336    InitializerList(Vec<Initializer>, core::range::Range<usize>),
337}
338
339impl Initializer {
340    pub fn span(&self) -> core::range::Range<usize> {
341        match self {
342            Self::AssignmentExpression(n) => n.span.clone(),
343            Self::InitializerList(_, span) => span.clone(),
344        }
345    }
346}
347
348/// 语句
349#[derive(Debug, Clone, PartialEq)]
350pub enum Statement {
351    /// 标号语句
352    Labeled(LabeledStatement),
353    /// 复合语句
354    Compound(CompoundStatement),
355    /// 表达式语
356    Expression(ExpressionStatement),
357    /// 选择语句
358    Selection(SelectionStatement),
359    /// 迭代语句
360    Iteration(IterationStatement),
361    /// 跳转语句
362    Jump(JumpStatement),
363}
364
365impl Statement {
366    pub fn span(&self) -> core::range::Range<usize> {
367        match self {
368            Self::Labeled(n) => n.span(),
369            Self::Compound(n) => n.span.clone(),
370            Self::Expression(n) => n.span.clone(),
371            Self::Selection(n) => n.span(),
372            Self::Iteration(n) => n.span(),
373            Self::Jump(n) => n.span(),
374        }
375    }
376}
377
378/// 标号语句
379#[derive(Debug, Clone, PartialEq)]
380pub enum LabeledStatement {
381    Label { identifier: String, statement: Box<Statement>, span: core::range::Range<usize> },
382    Case { constant_expression: Expression, statement: Box<Statement>, span: core::range::Range<usize> },
383    Default { statement: Box<Statement>, span: core::range::Range<usize> },
384}
385
386impl LabeledStatement {
387    pub fn span(&self) -> core::range::Range<usize> {
388        match self {
389            Self::Label { span, .. } => span.clone(),
390            Self::Case { span, .. } => span.clone(),
391            Self::Default { span, .. } => span.clone(),
392        }
393    }
394}
395
396/// 复合语句
397#[derive(Debug, Clone, PartialEq)]
398pub struct CompoundStatement {
399    pub block_items: Vec<BlockItem>,
400    pub span: core::range::Range<usize>,
401}
402
403/// 块项
404#[derive(Debug, Clone, PartialEq)]
405pub enum BlockItem {
406    Declaration(Declaration),
407    Statement(Statement),
408}
409
410impl BlockItem {
411    pub fn span(&self) -> core::range::Range<usize> {
412        match self {
413            Self::Declaration(n) => n.span.clone(),
414            Self::Statement(n) => n.span(),
415        }
416    }
417}
418
419/// 表达式语
420#[derive(Debug, Clone, PartialEq)]
421pub struct ExpressionStatement {
422    pub expression: Option<Expression>,
423    pub span: core::range::Range<usize>,
424}
425
426/// 选择语句
427#[derive(Debug, Clone, PartialEq)]
428pub enum SelectionStatement {
429    If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>>, span: core::range::Range<usize> },
430    Switch { expression: Expression, statement: Box<Statement>, span: core::range::Range<usize> },
431}
432
433impl SelectionStatement {
434    pub fn span(&self) -> core::range::Range<usize> {
435        match self {
436            Self::If { span, .. } => span.clone(),
437            Self::Switch { span, .. } => span.clone(),
438        }
439    }
440}
441
442/// 迭代语句
443#[derive(Debug, Clone, PartialEq)]
444pub enum IterationStatement {
445    While { condition: Expression, statement: Box<Statement>, span: core::range::Range<usize> },
446    DoWhile { statement: Box<Statement>, condition: Expression, span: core::range::Range<usize> },
447    For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement>, span: core::range::Range<usize> },
448}
449
450impl IterationStatement {
451    pub fn span(&self) -> core::range::Range<usize> {
452        match self {
453            Self::While { span, .. } => span.clone(),
454            Self::DoWhile { span, .. } => span.clone(),
455            Self::For { span, .. } => span.clone(),
456        }
457    }
458}
459
460/// 跳转语句
461#[derive(Debug, Clone, PartialEq)]
462pub enum JumpStatement {
463    Goto(String, core::range::Range<usize>),
464    Continue(core::range::Range<usize>),
465    Break(core::range::Range<usize>),
466    Return(Option<Expression>, core::range::Range<usize>),
467}
468
469impl JumpStatement {
470    pub fn span(&self) -> core::range::Range<usize> {
471        match self {
472            Self::Goto(_, span) => span.clone(),
473            Self::Continue(span) => span.clone(),
474            Self::Break(span) => span.clone(),
475            Self::Return(_, span) => span.clone(),
476        }
477    }
478}
479
480/// 表达
481#[derive(Debug, Clone, PartialEq)]
482pub struct Expression {
483    pub kind: Box<ExpressionKind>,
484    pub span: core::range::Range<usize>,
485}
486
487/// 表达式种
488#[derive(Debug, Clone, PartialEq)]
489pub enum ExpressionKind {
490    /// 标识
491    Identifier(String, core::range::Range<usize>),
492    /// 常量
493    Constant(Constant, core::range::Range<usize>),
494    /// 字符串字面量
495    StringLiteral(String, core::range::Range<usize>),
496    /// 数组下标
497    ArraySubscript { array: Box<Expression>, index: Box<Expression>, span: core::range::Range<usize> },
498    /// 函数调用
499    FunctionCall { function: Box<Expression>, arguments: Vec<Expression>, span: core::range::Range<usize> },
500    /// 成员访问
501    MemberAccess {
502        object: Box<Expression>,
503        member: String,
504        is_pointer: bool, // true for ->, false for .
505        span: core::range::Range<usize>,
506    },
507    /// 后缀递增/递减
508    PostfixIncDec { operand: Box<Expression>, is_increment: bool, span: core::range::Range<usize> },
509    /// 前缀递增/递减
510    PrefixIncDec { operand: Box<Expression>, is_increment: bool, span: core::range::Range<usize> },
511    /// 一元操作符
512    Unary { operator: UnaryOperator, operand: Box<Expression>, span: core::range::Range<usize> },
513    /// 类型转换
514    Cast { type_name: Box<TypeName>, expression: Box<Expression>, span: core::range::Range<usize> },
515    /// 二元操作
516    Binary { left: Box<Expression>, operator: BinaryOperator, right: Box<Expression>, span: core::range::Range<usize> },
517    /// 条件表达
518    Conditional { condition: Box<Expression>, then_expr: Box<Expression>, else_expr: Box<Expression>, span: core::range::Range<usize> },
519    /// 赋值表达式
520    Assignment { left: Box<Expression>, operator: AssignmentOperator, right: Box<Expression>, span: core::range::Range<usize> },
521    /// 逗号表达
522    Comma { expressions: Vec<Expression>, span: core::range::Range<usize> },
523}
524
525impl ExpressionKind {
526    pub fn span(&self) -> core::range::Range<usize> {
527        match self {
528            Self::Identifier(_, span) => span.clone(),
529            Self::Constant(_, span) => span.clone(),
530            Self::StringLiteral(_, span) => span.clone(),
531            Self::ArraySubscript { span, .. } => span.clone(),
532            Self::FunctionCall { span, .. } => span.clone(),
533            Self::MemberAccess { span, .. } => span.clone(),
534            Self::PostfixIncDec { span, .. } => span.clone(),
535            Self::PrefixIncDec { span, .. } => span.clone(),
536            Self::Unary { span, .. } => span.clone(),
537            Self::Cast { span, .. } => span.clone(),
538            Self::Binary { span, .. } => span.clone(),
539            Self::Conditional { span, .. } => span.clone(),
540            Self::Assignment { span, .. } => span.clone(),
541            Self::Comma { span, .. } => span.clone(),
542        }
543    }
544}
545
546/// 常量
547#[derive(Debug, Clone, PartialEq)]
548pub enum Constant {
549    Integer(i64, core::range::Range<usize>),
550    Float(f64, core::range::Range<usize>),
551    Character(char, core::range::Range<usize>),
552}
553
554impl Constant {
555    pub fn span(&self) -> core::range::Range<usize> {
556        match self {
557            Self::Integer(_, span) => span.clone(),
558            Self::Float(_, span) => span.clone(),
559            Self::Character(_, span) => span.clone(),
560        }
561    }
562}
563
564/// 一元操作符
565#[derive(Debug, Clone, PartialEq)]
566pub enum UnaryOperator {
567    AddressOf { span: core::range::Range<usize> },   // &
568    Dereference { span: core::range::Range<usize> }, // *
569    Plus { span: core::range::Range<usize> },        // +
570    Minus { span: core::range::Range<usize> },       // -
571    BitwiseNot { span: core::range::Range<usize> },  // ~
572    LogicalNot { span: core::range::Range<usize> },  // !
573    Sizeof { span: core::range::Range<usize> },      // sizeof
574}
575
576impl UnaryOperator {
577    pub fn span(&self) -> core::range::Range<usize> {
578        match self {
579            Self::AddressOf { span } => span.clone(),
580            Self::Dereference { span } => span.clone(),
581            Self::Plus { span } => span.clone(),
582            Self::Minus { span } => span.clone(),
583            Self::BitwiseNot { span } => span.clone(),
584            Self::LogicalNot { span } => span.clone(),
585            Self::Sizeof { span } => span.clone(),
586        }
587    }
588}
589
590/// 二元操作
591#[derive(Debug, Clone, PartialEq)]
592pub enum BinaryOperator {
593    // 算术操作
594    Add { span: core::range::Range<usize> },      // +
595    Subtract { span: core::range::Range<usize> }, // -
596    Multiply { span: core::range::Range<usize> }, // *
597    Divide { span: core::range::Range<usize> },   // /
598    Modulo { span: core::range::Range<usize> },   // %
599
600    // 位操作符
601    BitwiseAnd { span: core::range::Range<usize> }, // &
602    BitwiseOr { span: core::range::Range<usize> },  // |
603    BitwiseXor { span: core::range::Range<usize> }, // ^
604    LeftShift { span: core::range::Range<usize> },  // <<
605    RightShift { span: core::range::Range<usize> }, // >>
606
607    // 比较操作
608    Equal { span: core::range::Range<usize> },        // ==
609    NotEqual { span: core::range::Range<usize> },     // !=
610    Less { span: core::range::Range<usize> },         // <
611    Greater { span: core::range::Range<usize> },      // >
612    LessEqual { span: core::range::Range<usize> },    // <=
613    GreaterEqual { span: core::range::Range<usize> }, // >=
614
615    // 逻辑操作
616    LogicalAnd { span: core::range::Range<usize> }, // &&
617    LogicalOr { span: core::range::Range<usize> },  // ||
618}
619
620impl BinaryOperator {
621    pub fn span(&self) -> core::range::Range<usize> {
622        match self {
623            Self::Add { span } => span.clone(),
624            Self::Subtract { span } => span.clone(),
625            Self::Multiply { span } => span.clone(),
626            Self::Divide { span } => span.clone(),
627            Self::Modulo { span } => span.clone(),
628            Self::BitwiseAnd { span } => span.clone(),
629            Self::BitwiseOr { span } => span.clone(),
630            Self::BitwiseXor { span } => span.clone(),
631            Self::LeftShift { span } => span.clone(),
632            Self::RightShift { span } => span.clone(),
633            Self::Equal { span } => span.clone(),
634            Self::NotEqual { span } => span.clone(),
635            Self::Less { span } => span.clone(),
636            Self::Greater { span } => span.clone(),
637            Self::LessEqual { span } => span.clone(),
638            Self::GreaterEqual { span } => span.clone(),
639            Self::LogicalAnd { span } => span.clone(),
640            Self::LogicalOr { span } => span.clone(),
641        }
642    }
643}
644
645/// 赋值操作符
646#[derive(Debug, Clone, PartialEq)]
647pub enum AssignmentOperator {
648    Assign { span: core::range::Range<usize> },           // =
649    AddAssign { span: core::range::Range<usize> },        // +=
650    SubAssign { span: core::range::Range<usize> },        // -=
651    MulAssign { span: core::range::Range<usize> },        // *=
652    DivAssign { span: core::range::Range<usize> },        // /=
653    ModAssign { span: core::range::Range<usize> },        // %=
654    AndAssign { span: core::range::Range<usize> },        // &=
655    OrAssign { span: core::range::Range<usize> },         // |=
656    XorAssign { span: core::range::Range<usize> },        // ^=
657    LeftShiftAssign { span: core::range::Range<usize> },  // <<=
658    RightShiftAssign { span: core::range::Range<usize> }, // >>=
659}
660
661impl AssignmentOperator {
662    pub fn span(&self) -> core::range::Range<usize> {
663        match self {
664            Self::Assign { span } => span.clone(),
665            Self::AddAssign { span } => span.clone(),
666            Self::SubAssign { span } => span.clone(),
667            Self::MulAssign { span } => span.clone(),
668            Self::DivAssign { span } => span.clone(),
669            Self::ModAssign { span } => span.clone(),
670            Self::AndAssign { span } => span.clone(),
671            Self::OrAssign { span } => span.clone(),
672            Self::XorAssign { span } => span.clone(),
673            Self::LeftShiftAssign { span } => span.clone(),
674            Self::RightShiftAssign { span } => span.clone(),
675        }
676    }
677}
678
679/// 类型
680#[derive(Debug, Clone, PartialEq)]
681pub struct TypeName {
682    pub specifier_qualifiers: Vec<SpecifierQualifier>,
683    pub abstract_declarator: Option<Box<AbstractDeclarator>>,
684    pub span: core::range::Range<usize>,
685}
686
687impl CRoot {
688    /// 创建新的 AST
689    pub fn new(translation_unit: TranslationUnit, span: core::range::Range<usize>) -> Self {
690        Self { translation_unit, span }
691    }
692}
693
694impl TranslationUnit {
695    /// 创建新的翻译单元
696    pub fn new(external_declarations: Vec<ExternalDeclaration>, span: core::range::Range<usize>) -> Self {
697        Self { external_declarations, span }
698    }
699}