1#[derive(Debug, Clone, PartialEq)]
3pub struct CRoot {
4 pub translation_unit: TranslationUnit,
5 pub span: core::range::Range<usize>,
6}
7
8#[derive(Debug, Clone, PartialEq)]
10pub struct TranslationUnit {
11 pub external_declarations: Vec<ExternalDeclaration>,
12 pub span: core::range::Range<usize>,
13}
14
15#[derive(Debug, Clone, PartialEq)]
17pub enum ExternalDeclaration {
18 FunctionDefinition(FunctionDefinition),
20 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#[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#[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#[derive(Debug, Clone, PartialEq)]
52pub enum DeclarationSpecifier {
53 StorageClassSpecifier(StorageClassSpecifier),
55 TypeSpecifier(TypeSpecifier),
57 TypeQualifier(TypeQualifier),
59 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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[derive(Debug, Clone, PartialEq)]
350pub enum Statement {
351 Labeled(LabeledStatement),
353 Compound(CompoundStatement),
355 Expression(ExpressionStatement),
357 Selection(SelectionStatement),
359 Iteration(IterationStatement),
361 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#[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#[derive(Debug, Clone, PartialEq)]
398pub struct CompoundStatement {
399 pub block_items: Vec<BlockItem>,
400 pub span: core::range::Range<usize>,
401}
402
403#[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#[derive(Debug, Clone, PartialEq)]
421pub struct ExpressionStatement {
422 pub expression: Option<Expression>,
423 pub span: core::range::Range<usize>,
424}
425
426#[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#[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#[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#[derive(Debug, Clone, PartialEq)]
482pub struct Expression {
483 pub kind: Box<ExpressionKind>,
484 pub span: core::range::Range<usize>,
485}
486
487#[derive(Debug, Clone, PartialEq)]
489pub enum ExpressionKind {
490 Identifier(String, core::range::Range<usize>),
492 Constant(Constant, core::range::Range<usize>),
494 StringLiteral(String, core::range::Range<usize>),
496 ArraySubscript { array: Box<Expression>, index: Box<Expression>, span: core::range::Range<usize> },
498 FunctionCall { function: Box<Expression>, arguments: Vec<Expression>, span: core::range::Range<usize> },
500 MemberAccess {
502 object: Box<Expression>,
503 member: String,
504 is_pointer: bool, span: core::range::Range<usize>,
506 },
507 PostfixIncDec { operand: Box<Expression>, is_increment: bool, span: core::range::Range<usize> },
509 PrefixIncDec { operand: Box<Expression>, is_increment: bool, span: core::range::Range<usize> },
511 Unary { operator: UnaryOperator, operand: Box<Expression>, span: core::range::Range<usize> },
513 Cast { type_name: Box<TypeName>, expression: Box<Expression>, span: core::range::Range<usize> },
515 Binary { left: Box<Expression>, operator: BinaryOperator, right: Box<Expression>, span: core::range::Range<usize> },
517 Conditional { condition: Box<Expression>, then_expr: Box<Expression>, else_expr: Box<Expression>, span: core::range::Range<usize> },
519 Assignment { left: Box<Expression>, operator: AssignmentOperator, right: Box<Expression>, span: core::range::Range<usize> },
521 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#[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#[derive(Debug, Clone, PartialEq)]
566pub enum UnaryOperator {
567 AddressOf { span: core::range::Range<usize> }, Dereference { span: core::range::Range<usize> }, Plus { span: core::range::Range<usize> }, Minus { span: core::range::Range<usize> }, BitwiseNot { span: core::range::Range<usize> }, LogicalNot { span: core::range::Range<usize> }, Sizeof { span: core::range::Range<usize> }, }
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#[derive(Debug, Clone, PartialEq)]
592pub enum BinaryOperator {
593 Add { span: core::range::Range<usize> }, Subtract { span: core::range::Range<usize> }, Multiply { span: core::range::Range<usize> }, Divide { span: core::range::Range<usize> }, Modulo { span: core::range::Range<usize> }, BitwiseAnd { span: core::range::Range<usize> }, BitwiseOr { span: core::range::Range<usize> }, BitwiseXor { span: core::range::Range<usize> }, LeftShift { span: core::range::Range<usize> }, RightShift { span: core::range::Range<usize> }, Equal { span: core::range::Range<usize> }, NotEqual { span: core::range::Range<usize> }, Less { span: core::range::Range<usize> }, Greater { span: core::range::Range<usize> }, LessEqual { span: core::range::Range<usize> }, GreaterEqual { span: core::range::Range<usize> }, LogicalAnd { span: core::range::Range<usize> }, LogicalOr { span: core::range::Range<usize> }, }
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#[derive(Debug, Clone, PartialEq)]
647pub enum AssignmentOperator {
648 Assign { span: core::range::Range<usize> }, AddAssign { span: core::range::Range<usize> }, SubAssign { span: core::range::Range<usize> }, MulAssign { span: core::range::Range<usize> }, DivAssign { span: core::range::Range<usize> }, ModAssign { span: core::range::Range<usize> }, AndAssign { span: core::range::Range<usize> }, OrAssign { span: core::range::Range<usize> }, XorAssign { span: core::range::Range<usize> }, LeftShiftAssign { span: core::range::Range<usize> }, RightShiftAssign { span: core::range::Range<usize> }, }
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#[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 pub fn new(translation_unit: TranslationUnit, span: core::range::Range<usize>) -> Self {
690 Self { translation_unit, span }
691 }
692}
693
694impl TranslationUnit {
695 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: core::range::Range<usize>) -> Self {
697 Self { external_declarations, span }
698 }
699}