1#![doc = include_str!("readme.md")]
2#[derive(Debug, Clone, PartialEq)]
4pub struct CRoot {
5 pub translation_unit: TranslationUnit,
7 pub span: core::range::Range<usize>,
9}
10
11#[derive(Debug, Clone, PartialEq)]
13pub struct TranslationUnit {
14 pub external_declarations: Vec<ExternalDeclaration>,
16 pub span: core::range::Range<usize>,
18}
19
20#[derive(Debug, Clone, PartialEq)]
22pub enum ExternalDeclaration {
23 FunctionDefinition(FunctionDefinition),
25 Declaration(Declaration),
27}
28
29impl ExternalDeclaration {
30 pub fn span(&self) -> core::range::Range<usize> {
32 match self {
33 Self::FunctionDefinition(n) => n.span.clone(),
34 Self::Declaration(n) => n.span.clone(),
35 }
36 }
37}
38
39#[derive(Debug, Clone, PartialEq)]
41pub struct FunctionDefinition {
42 pub declaration_specifiers: Vec<DeclarationSpecifier>,
44 pub declarator: Declarator,
46 pub compound_statement: CompoundStatement,
48 pub span: core::range::Range<usize>,
50}
51
52#[derive(Debug, Clone, PartialEq)]
54pub struct Declaration {
55 pub declaration_specifiers: Vec<DeclarationSpecifier>,
57 pub init_declarators: Vec<InitDeclarator>,
59 pub span: core::range::Range<usize>,
61}
62
63#[derive(Debug, Clone, PartialEq)]
65pub enum DeclarationSpecifier {
66 StorageClassSpecifier(StorageClassSpecifier),
68 TypeSpecifier(TypeSpecifier),
70 TypeQualifier(TypeQualifier),
72 FunctionSpecifier(FunctionSpecifier),
74}
75
76impl DeclarationSpecifier {
77 pub fn span(&self) -> core::range::Range<usize> {
79 match self {
80 Self::StorageClassSpecifier(n) => n.span(),
81 Self::TypeSpecifier(n) => n.span(),
82 Self::TypeQualifier(n) => n.span(),
83 Self::FunctionSpecifier(n) => n.span(),
84 }
85 }
86}
87
88#[derive(Debug, Clone, PartialEq)]
90pub enum StorageClassSpecifier {
91 Typedef {
93 span: core::range::Range<usize>,
95 },
96 Extern {
98 span: core::range::Range<usize>,
100 },
101 Static {
103 span: core::range::Range<usize>,
105 },
106 Auto {
108 span: core::range::Range<usize>,
110 },
111 Register {
113 span: core::range::Range<usize>,
115 },
116}
117
118impl StorageClassSpecifier {
119 pub fn span(&self) -> core::range::Range<usize> {
121 match self {
122 Self::Typedef { span } => span.clone(),
123 Self::Extern { span } => span.clone(),
124 Self::Static { span } => span.clone(),
125 Self::Auto { span } => span.clone(),
126 Self::Register { span } => span.clone(),
127 }
128 }
129}
130
131#[derive(Debug, Clone, PartialEq)]
133pub enum TypeSpecifier {
134 Void {
136 span: core::range::Range<usize>,
138 },
139 Char {
141 span: core::range::Range<usize>,
143 },
144 Short {
145 span: core::range::Range<usize>,
146 },
147 Int {
148 span: core::range::Range<usize>,
149 },
150 Long {
151 span: core::range::Range<usize>,
152 },
153 Float {
154 span: core::range::Range<usize>,
155 },
156 Double {
157 span: core::range::Range<usize>,
158 },
159 Signed {
160 span: core::range::Range<usize>,
161 },
162 Unsigned {
163 span: core::range::Range<usize>,
164 },
165 Bool {
166 span: core::range::Range<usize>,
167 },
168 Complex {
169 span: core::range::Range<usize>,
170 },
171 Imaginary {
172 span: core::range::Range<usize>,
173 },
174 StructOrUnion(StructOrUnionSpecifier),
175 Enum(EnumSpecifier),
176 TypedefName(String, core::range::Range<usize>),
177}
178
179impl TypeSpecifier {
180 pub fn span(&self) -> core::range::Range<usize> {
182 match self {
183 Self::Void { span } => span.clone(),
184 Self::Char { span } => span.clone(),
185 Self::Short { span } => span.clone(),
186 Self::Int { span } => span.clone(),
187 Self::Long { span } => span.clone(),
188 Self::Float { span } => span.clone(),
189 Self::Double { span } => span.clone(),
190 Self::Signed { span } => span.clone(),
191 Self::Unsigned { span } => span.clone(),
192 Self::Bool { span } => span.clone(),
193 Self::Complex { span } => span.clone(),
194 Self::Imaginary { span } => span.clone(),
195 Self::StructOrUnion(n) => n.span.clone(),
196 Self::Enum(n) => n.span.clone(),
197 Self::TypedefName(_, span) => span.clone(),
198 }
199 }
200}
201
202#[derive(Debug, Clone, PartialEq)]
204pub enum TypeQualifier {
205 Const {
207 span: core::range::Range<usize>,
209 },
210 Restrict {
212 span: core::range::Range<usize>,
214 },
215 Volatile {
217 span: core::range::Range<usize>,
219 },
220}
221
222impl TypeQualifier {
223 pub fn span(&self) -> core::range::Range<usize> {
225 match self {
226 Self::Const { span } => span.clone(),
227 Self::Restrict { span } => span.clone(),
228 Self::Volatile { span } => span.clone(),
229 }
230 }
231}
232
233#[derive(Debug, Clone, PartialEq)]
235pub enum FunctionSpecifier {
236 Inline {
238 span: core::range::Range<usize>,
240 },
241}
242
243impl FunctionSpecifier {
244 pub fn span(&self) -> core::range::Range<usize> {
246 match self {
247 Self::Inline { span } => span.clone(),
248 }
249 }
250}
251
252#[derive(Debug, Clone, PartialEq)]
254pub struct StructOrUnionSpecifier {
255 pub kind: StructOrUnion,
257 pub identifier: Option<String>,
259 pub struct_declarations: Vec<StructDeclaration>,
261 pub span: core::range::Range<usize>,
263}
264
265#[derive(Debug, Clone, PartialEq)]
267pub enum StructOrUnion {
268 Struct {
270 span: core::range::Range<usize>,
272 },
273 Union {
275 span: core::range::Range<usize>,
277 },
278}
279
280impl StructOrUnion {
281 pub fn span(&self) -> core::range::Range<usize> {
282 match self {
283 Self::Struct { span } => span.clone(),
284 Self::Union { span } => span.clone(),
285 }
286 }
287}
288
289#[derive(Debug, Clone, PartialEq)]
291pub struct StructDeclaration {
292 pub specifier_qualifier_list: Vec<SpecifierQualifier>,
294 pub struct_declarator_list: Vec<StructDeclarator>,
296 pub span: core::range::Range<usize>,
298}
299
300#[derive(Debug, Clone, PartialEq)]
302pub enum SpecifierQualifier {
303 TypeSpecifier(TypeSpecifier),
305 TypeQualifier(TypeQualifier),
307}
308
309impl SpecifierQualifier {
310 pub fn span(&self) -> core::range::Range<usize> {
311 match self {
312 Self::TypeSpecifier(n) => n.span(),
313 Self::TypeQualifier(n) => n.span(),
314 }
315 }
316}
317
318#[derive(Debug, Clone, PartialEq)]
320pub struct StructDeclarator {
321 pub declarator: Option<Declarator>,
323 pub constant_expression: Option<Expression>,
325 pub span: core::range::Range<usize>,
327}
328
329#[derive(Debug, Clone, PartialEq)]
331pub struct EnumSpecifier {
332 pub identifier: Option<String>,
334 pub enumerators: Vec<Enumerator>,
336 pub span: core::range::Range<usize>,
338}
339
340#[derive(Debug, Clone, PartialEq)]
342pub struct Enumerator {
343 pub identifier: String,
345 pub constant_expression: Option<Expression>,
347 pub span: core::range::Range<usize>,
349}
350
351#[derive(Debug, Clone, PartialEq)]
353pub struct InitDeclarator {
354 pub declarator: Declarator,
356 pub initializer: Option<Initializer>,
358 pub span: core::range::Range<usize>,
360}
361
362#[derive(Debug, Clone, PartialEq)]
364pub struct Declarator {
365 pub pointer: Option<Pointer>,
367 pub direct_declarator: DirectDeclarator,
369 pub span: core::range::Range<usize>,
371}
372
373#[derive(Debug, Clone, PartialEq)]
375pub struct Pointer {
376 pub type_qualifiers: Vec<TypeQualifier>,
378 pub pointer: Option<Box<Pointer>>,
380 pub span: core::range::Range<usize>,
382}
383
384#[derive(Debug, Clone, PartialEq)]
386pub enum DirectDeclarator {
387 Identifier(String, core::range::Range<usize>),
389 Declarator(Box<Declarator>, core::range::Range<usize>),
391 Array {
393 direct_declarator: Box<DirectDeclarator>,
395 type_qualifiers: Vec<TypeQualifier>,
397 assignment_expression: Option<Box<Expression>>,
399 span: core::range::Range<usize>,
401 },
402 Function {
404 direct_declarator: Box<DirectDeclarator>,
406 parameter_list: ParameterList,
408 span: core::range::Range<usize>,
410 },
411}
412
413impl DirectDeclarator {
414 pub fn span(&self) -> core::range::Range<usize> {
416 match self {
417 Self::Identifier(_, span) => span.clone(),
418 Self::Declarator(n, _) => n.span.clone(),
419 Self::Array { span, .. } => span.clone(),
420 Self::Function { span, .. } => span.clone(),
421 }
422 }
423}
424
425#[derive(Debug, Clone, PartialEq)]
427pub struct ParameterList {
428 pub parameter_declarations: Vec<ParameterDeclaration>,
430 pub variadic: bool,
432 pub span: core::range::Range<usize>,
434}
435
436#[derive(Debug, Clone, PartialEq)]
438pub struct ParameterDeclaration {
439 pub declaration_specifiers: Vec<DeclarationSpecifier>,
441 pub declarator: Option<Declarator>,
443 pub abstract_declarator: Option<AbstractDeclarator>,
445 pub span: core::range::Range<usize>,
447}
448
449#[derive(Debug, Clone, PartialEq)]
451pub struct AbstractDeclarator {
452 pub pointer: Option<Pointer>,
454 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
456 pub span: core::range::Range<usize>,
458}
459
460#[derive(Debug, Clone, PartialEq)]
462pub enum DirectAbstractDeclarator {
463 AbstractDeclarator(Box<AbstractDeclarator>),
465 Array {
467 declarator: Option<Box<DirectAbstractDeclarator>>,
469 assignment_expression: Option<Box<Expression>>,
471 span: core::range::Range<usize>,
473 },
474 Function {
476 declarator: Option<Box<DirectAbstractDeclarator>>,
478 parameter_list: Option<ParameterList>,
480 span: core::range::Range<usize>,
482 },
483}
484
485impl DirectAbstractDeclarator {
486 pub fn span(&self) -> core::range::Range<usize> {
488 match self {
489 Self::AbstractDeclarator(n) => n.span.clone(),
490 Self::Array { span, .. } => span.clone(),
491 Self::Function { span, .. } => span.clone(),
492 }
493 }
494}
495
496#[derive(Debug, Clone, PartialEq)]
498pub enum Initializer {
499 AssignmentExpression(Expression),
501 InitializerList(Vec<Initializer>, core::range::Range<usize>),
503}
504
505impl Initializer {
506 pub fn span(&self) -> core::range::Range<usize> {
508 match self {
509 Self::AssignmentExpression(n) => n.span.clone(),
510 Self::InitializerList(_, span) => span.clone(),
511 }
512 }
513}
514
515#[derive(Debug, Clone, PartialEq)]
517pub enum Statement {
518 Labeled(LabeledStatement),
520 Compound(CompoundStatement),
522 Expression(ExpressionStatement),
524 Selection(SelectionStatement),
526 Iteration(IterationStatement),
528 Jump(JumpStatement),
530}
531
532impl Statement {
533 pub fn span(&self) -> core::range::Range<usize> {
535 match self {
536 Self::Labeled(n) => n.span(),
537 Self::Compound(n) => n.span.clone(),
538 Self::Expression(n) => n.span.clone(),
539 Self::Selection(n) => n.span(),
540 Self::Iteration(n) => n.span(),
541 Self::Jump(n) => n.span(),
542 }
543 }
544}
545
546#[derive(Debug, Clone, PartialEq)]
548pub enum LabeledStatement {
549 Label {
551 identifier: String,
553 statement: Box<Statement>,
555 span: core::range::Range<usize>,
557 },
558 Case {
560 constant_expression: Expression,
562 statement: Box<Statement>,
564 span: core::range::Range<usize>,
566 },
567 Default {
569 statement: Box<Statement>,
571 span: core::range::Range<usize>,
573 },
574}
575
576impl LabeledStatement {
577 pub fn span(&self) -> core::range::Range<usize> {
579 match self {
580 Self::Label { span, .. } => span.clone(),
581 Self::Case { span, .. } => span.clone(),
582 Self::Default { span, .. } => span.clone(),
583 }
584 }
585}
586
587#[derive(Debug, Clone, PartialEq)]
589pub struct CompoundStatement {
590 pub block_items: Vec<BlockItem>,
592 pub span: core::range::Range<usize>,
594}
595
596#[derive(Debug, Clone, PartialEq)]
598pub enum BlockItem {
599 Declaration(Declaration),
601 Statement(Statement),
603}
604
605impl BlockItem {
606 pub fn span(&self) -> core::range::Range<usize> {
608 match self {
609 Self::Declaration(n) => n.span.clone(),
610 Self::Statement(n) => n.span(),
611 }
612 }
613}
614
615#[derive(Debug, Clone, PartialEq)]
617pub struct ExpressionStatement {
618 pub expression: Option<Expression>,
620 pub span: core::range::Range<usize>,
622}
623
624#[derive(Debug, Clone, PartialEq)]
626pub enum SelectionStatement {
627 If {
629 condition: Expression,
631 then_statement: Box<Statement>,
633 else_statement: Option<Box<Statement>>,
635 span: core::range::Range<usize>,
637 },
638 Switch {
640 expression: Expression,
642 statement: Box<Statement>,
644 span: core::range::Range<usize>,
646 },
647}
648
649impl SelectionStatement {
650 pub fn span(&self) -> core::range::Range<usize> {
652 match self {
653 Self::If { span, .. } => span.clone(),
654 Self::Switch { span, .. } => span.clone(),
655 }
656 }
657}
658
659#[derive(Debug, Clone, PartialEq)]
661pub enum IterationStatement {
662 While {
664 condition: Expression,
666 statement: Box<Statement>,
668 span: core::range::Range<usize>,
670 },
671 DoWhile {
673 statement: Box<Statement>,
675 condition: Expression,
677 span: core::range::Range<usize>,
679 },
680 For {
682 init: Option<Expression>,
684 condition: Option<Expression>,
686 update: Option<Expression>,
688 statement: Box<Statement>,
690 span: core::range::Range<usize>,
692 },
693}
694
695impl IterationStatement {
696 pub fn span(&self) -> core::range::Range<usize> {
698 match self {
699 Self::While { span, .. } => span.clone(),
700 Self::DoWhile { span, .. } => span.clone(),
701 Self::For { span, .. } => span.clone(),
702 }
703 }
704}
705
706#[derive(Debug, Clone, PartialEq)]
708pub enum JumpStatement {
709 Goto(String, core::range::Range<usize>),
711 Continue(core::range::Range<usize>),
713 Break(core::range::Range<usize>),
715 Return(Option<Expression>, core::range::Range<usize>),
717}
718
719impl JumpStatement {
720 pub fn span(&self) -> core::range::Range<usize> {
722 match self {
723 Self::Goto(_, span) => span.clone(),
724 Self::Continue(span) => span.clone(),
725 Self::Break(span) => span.clone(),
726 Self::Return(_, span) => span.clone(),
727 }
728 }
729}
730
731#[derive(Debug, Clone, PartialEq)]
733pub struct Expression {
734 pub kind: Box<ExpressionKind>,
736 pub span: core::range::Range<usize>,
738}
739
740#[derive(Debug, Clone, PartialEq)]
742pub enum ExpressionKind {
743 Identifier(String, core::range::Range<usize>),
745 Constant(Constant, core::range::Range<usize>),
747 StringLiteral(String, core::range::Range<usize>),
749 ArraySubscript {
751 array: Box<Expression>,
753 index: Box<Expression>,
755 span: core::range::Range<usize>,
757 },
758 FunctionCall {
760 function: Box<Expression>,
762 arguments: Vec<Expression>,
764 span: core::range::Range<usize>,
766 },
767 MemberAccess {
769 object: Box<Expression>,
771 member: String,
773 is_pointer: bool,
775 span: core::range::Range<usize>,
777 },
778 PostfixIncDec {
780 operand: Box<Expression>,
782 is_increment: bool,
784 span: core::range::Range<usize>,
786 },
787 PrefixIncDec {
789 operand: Box<Expression>,
791 is_increment: bool,
793 span: core::range::Range<usize>,
795 },
796 Unary {
798 operator: UnaryOperator,
800 operand: Box<Expression>,
802 span: core::range::Range<usize>,
804 },
805 Cast {
807 type_name: Box<TypeName>,
809 expression: Box<Expression>,
811 span: core::range::Range<usize>,
813 },
814 Binary {
816 left: Box<Expression>,
818 operator: BinaryOperator,
820 right: Box<Expression>,
822 span: core::range::Range<usize>,
824 },
825 Conditional {
827 condition: Box<Expression>,
829 then_expr: Box<Expression>,
831 else_expr: Box<Expression>,
833 span: core::range::Range<usize>,
835 },
836 Assignment {
838 left: Box<Expression>,
840 operator: AssignmentOperator,
842 right: Box<Expression>,
844 span: core::range::Range<usize>,
846 },
847 Comma {
849 expressions: Vec<Expression>,
851 span: core::range::Range<usize>,
853 },
854}
855
856impl ExpressionKind {
857 pub fn span(&self) -> core::range::Range<usize> {
859 match self {
860 Self::Identifier(_, span) => span.clone(),
861 Self::Constant(_, span) => span.clone(),
862 Self::StringLiteral(_, span) => span.clone(),
863 Self::ArraySubscript { span, .. } => span.clone(),
864 Self::FunctionCall { span, .. } => span.clone(),
865 Self::MemberAccess { span, .. } => span.clone(),
866 Self::PostfixIncDec { span, .. } => span.clone(),
867 Self::PrefixIncDec { span, .. } => span.clone(),
868 Self::Unary { span, .. } => span.clone(),
869 Self::Cast { span, .. } => span.clone(),
870 Self::Binary { span, .. } => span.clone(),
871 Self::Conditional { span, .. } => span.clone(),
872 Self::Assignment { span, .. } => span.clone(),
873 Self::Comma { span, .. } => span.clone(),
874 }
875 }
876}
877
878#[derive(Debug, Clone, PartialEq)]
880pub enum Constant {
881 Integer(i64, core::range::Range<usize>),
883 Float(f64, core::range::Range<usize>),
885 Character(char, core::range::Range<usize>),
887}
888
889impl Constant {
890 pub fn span(&self) -> core::range::Range<usize> {
892 match self {
893 Self::Integer(_, span) => span.clone(),
894 Self::Float(_, span) => span.clone(),
895 Self::Character(_, span) => span.clone(),
896 }
897 }
898}
899
900#[derive(Debug, Clone, Copy, PartialEq, Eq)]
902pub enum UnaryOperator {
903 AddressOf,
905 Indirection,
907 Plus,
909 Minus,
911 BitNot,
913 LogicalNot,
915 Sizeof,
917}
918
919#[derive(Debug, Clone, Copy, PartialEq, Eq)]
921pub enum BinaryOperator {
922 Multiply,
924 Divide,
926 Modulo,
928 Add,
930 Subtract,
932 ShiftLeft,
934 ShiftRight,
936 Less,
938 Greater,
940 LessEqual,
942 GreaterEqual,
944 Equal,
946 NotEqual,
948 BitAnd,
950 BitXor,
952 BitOr,
954 LogicalAnd,
956 LogicalOr,
958}
959
960#[derive(Debug, Clone, Copy, PartialEq, Eq)]
962pub enum AssignmentOperator {
963 Assign,
965 MulAssign,
967 DivAssign,
969 ModAssign,
971 AddAssign,
973 SubAssign,
975 ShlAssign,
977 ShrAssign,
979 AndAssign,
981 XorAssign,
983 OrAssign,
985}
986
987#[derive(Debug, Clone, PartialEq)]
989pub struct TypeName {
990 pub specifier_qualifiers: Vec<SpecifierQualifier>,
992 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
994 pub span: core::range::Range<usize>,
996}
997
998impl TypeName {
999 pub fn span(&self) -> core::range::Range<usize> {
1001 self.span.clone()
1002 }
1003}
1004
1005impl CRoot {
1006 pub fn new(translation_unit: TranslationUnit, span: core::range::Range<usize>) -> Self {
1008 Self { translation_unit, span }
1009 }
1010}
1011
1012impl TranslationUnit {
1013 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: core::range::Range<usize>) -> Self {
1015 Self { external_declarations, span }
1016 }
1017}