1use core::range::Range;
2
3type SourceSpan = Range<usize>;
5
6
7#[derive(Debug, Clone, PartialEq)]
9pub struct CppRoot {
10 pub translation_unit: TranslationUnit,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15pub struct TranslationUnit {
16 pub external_declarations: Vec<ExternalDeclaration>,
17 pub span: Range<usize>,
18}
19
20#[derive(Debug, Clone, PartialEq)]
22pub enum ExternalDeclaration {
23 FunctionDefinition(FunctionDefinition),
25 Declaration(Declaration),
27}
28
29#[derive(Debug, Clone, PartialEq)]
31pub struct FunctionDefinition {
32 pub declaration_specifiers: Vec<DeclarationSpecifier>,
33 pub declarator: Declarator,
34 pub compound_statement: CompoundStatement,
35 pub span: SourceSpan,
36}
37
38#[derive(Debug, Clone, PartialEq)]
40pub struct Declaration {
41 pub declaration_specifiers: Vec<DeclarationSpecifier>,
42 pub init_declarators: Vec<InitDeclarator>,
43 pub span: SourceSpan,
44}
45
46#[derive(Debug, Clone, PartialEq)]
48pub enum DeclarationSpecifier {
49 StorageClassSpecifier(StorageClassSpecifier),
51 TypeSpecifier(TypeSpecifier),
53 TypeQualifier(TypeQualifier),
55 FunctionSpecifier(FunctionSpecifier),
57}
58
59#[derive(Debug, Clone, PartialEq)]
61pub enum StorageClassSpecifier {
62 Typedef,
63 Extern,
64 Static,
65 Auto,
66 Register,
67}
68
69#[derive(Debug, Clone, PartialEq)]
71pub enum TypeSpecifier {
72 Void,
73 Char,
74 Short,
75 Int,
76 Long,
77 Float,
78 Double,
79 Signed,
80 Unsigned,
81 Bool,
82 Complex,
83 Imaginary,
84 StructOrUnion(StructOrUnionSpecifier),
85 Enum(EnumSpecifier),
86 TypedefName(String),
87}
88
89#[derive(Debug, Clone, PartialEq)]
91pub enum TypeQualifier {
92 Const,
93 Restrict,
94 Volatile,
95}
96
97#[derive(Debug, Clone, PartialEq)]
99pub enum FunctionSpecifier {
100 Inline,
101 Noreturn,
102}
103
104#[derive(Debug, Clone, PartialEq)]
106pub struct StructOrUnionSpecifier {
107 pub struct_or_union: StructOrUnion,
108 pub identifier: Option<String>,
109 pub struct_declarations: Option<Vec<StructDeclaration>>,
110 pub span: SourceSpan,
111}
112
113#[derive(Debug, Clone, PartialEq)]
115pub enum StructOrUnion {
116 Struct,
117 Union,
118}
119
120#[derive(Debug, Clone, PartialEq)]
122pub struct StructDeclaration {
123 pub specifier_qualifiers: Vec<SpecifierQualifier>,
124 pub struct_declarators: Vec<StructDeclarator>,
125 pub span: SourceSpan,
126}
127
128#[derive(Debug, Clone, PartialEq)]
130pub enum SpecifierQualifier {
131 TypeSpecifier(TypeSpecifier),
132 TypeQualifier(TypeQualifier),
133}
134
135#[derive(Debug, Clone, PartialEq)]
137pub struct StructDeclarator {
138 pub declarator: Option<Declarator>,
139 pub constant_expression: Option<Expression>,
140 pub span: SourceSpan,
141}
142
143#[derive(Debug, Clone, PartialEq)]
145pub struct EnumSpecifier {
146 pub identifier: Option<String>,
147 pub enumerators: Option<Vec<Enumerator>>,
148 pub span: SourceSpan,
149}
150
151#[derive(Debug, Clone, PartialEq)]
153pub struct Enumerator {
154 pub identifier: String,
155 pub constant_expression: Option<Expression>,
156 pub span: SourceSpan,
157}
158
159#[derive(Debug, Clone, PartialEq)]
161pub struct InitDeclarator {
162 pub declarator: Declarator,
163 pub initializer: Option<Initializer>,
164 pub span: SourceSpan,
165}
166
167#[derive(Debug, Clone, PartialEq)]
169pub struct Declarator {
170 pub pointer: Option<Pointer>,
171 pub direct_declarator: DirectDeclarator,
172 pub span: SourceSpan,
173}
174
175#[derive(Debug, Clone, PartialEq)]
177pub struct Pointer {
178 pub type_qualifiers: Vec<TypeQualifier>,
179 pub pointer: Option<Box<Pointer>>,
180 pub span: SourceSpan,
181}
182
183#[derive(Debug, Clone, PartialEq)]
185pub enum DirectDeclarator {
186 Identifier(String),
187 Declarator(Box<Declarator>),
188 Array {
189 declarator: Box<DirectDeclarator>,
190 assignment_expression: Option<Expression>,
191 },
192 Function {
193 declarator: Box<DirectDeclarator>,
194 parameter_type_list: Option<ParameterTypeList>,
195 identifier_list: Option<Vec<String>>,
196 },
197}
198
199#[derive(Debug, Clone, PartialEq)]
201pub struct ParameterTypeList {
202 pub parameter_list: Vec<ParameterDeclaration>,
203 pub variadic: bool,
204 pub span: SourceSpan,
205}
206
207#[derive(Debug, Clone, PartialEq)]
209pub struct ParameterDeclaration {
210 pub declaration_specifiers: Vec<DeclarationSpecifier>,
211 pub declarator: Option<Declarator>,
212 pub abstract_declarator: Option<AbstractDeclarator>,
213 pub span: SourceSpan,
214}
215
216#[derive(Debug, Clone, PartialEq)]
218pub struct AbstractDeclarator {
219 pub pointer: Option<Pointer>,
220 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
221 pub span: Range<usize>,
222}
223
224#[derive(Debug, Clone, PartialEq)]
226pub enum DirectAbstractDeclarator {
227 AbstractDeclarator(Box<AbstractDeclarator>),
228 Array { declarator: Option<Box<DirectAbstractDeclarator>>, assignment_expression: Option<Box<Expression>> },
229 Function { declarator: Option<Box<DirectAbstractDeclarator>>, parameter_type_list: Option<ParameterTypeList> },
230}
231
232#[derive(Debug, Clone, PartialEq)]
234pub enum Initializer {
235 AssignmentExpression(Expression),
236 InitializerList(Vec<Initializer>),
237}
238
239#[derive(Debug, Clone, PartialEq)]
241pub enum Statement {
242 Labeled(LabeledStatement),
244 Compound(CompoundStatement),
246 Expression(ExpressionStatement),
248 Selection(SelectionStatement),
250 Iteration(IterationStatement),
252 Jump(JumpStatement),
254}
255
256#[derive(Debug, Clone, PartialEq)]
258pub enum LabeledStatement {
259 Label { identifier: String, statement: Box<Statement> },
260 Case { constant_expression: Expression, statement: Box<Statement> },
261 Default { statement: Box<Statement> },
262}
263
264#[derive(Debug, Clone, PartialEq)]
266pub struct CompoundStatement {
267 pub block_items: Vec<BlockItem>,
268 pub span: SourceSpan,
269}
270
271#[derive(Debug, Clone, PartialEq)]
273pub enum BlockItem {
274 Declaration(Declaration),
275 Statement(Statement),
276}
277
278#[derive(Debug, Clone, PartialEq)]
280pub struct ExpressionStatement {
281 pub expression: Option<Expression>,
282 pub span: SourceSpan,
283}
284
285#[derive(Debug, Clone, PartialEq)]
287pub enum SelectionStatement {
288 If { condition: Expression, then_statement: Box<Statement>, else_statement: Option<Box<Statement>> },
289 Switch { expression: Expression, statement: Box<Statement> },
290}
291
292#[derive(Debug, Clone, PartialEq)]
294pub enum IterationStatement {
295 While { condition: Expression, statement: Box<Statement> },
296 DoWhile { statement: Box<Statement>, condition: Expression },
297 For { init: Option<Expression>, condition: Option<Expression>, update: Option<Expression>, statement: Box<Statement> },
298}
299
300#[derive(Debug, Clone, PartialEq)]
302pub enum JumpStatement {
303 Goto(String),
304 Continue,
305 Break,
306 Return(Option<Expression>),
307}
308
309#[derive(Debug, Clone, PartialEq)]
311pub struct Expression {
312 pub kind: Box<ExpressionKind>,
313 pub span: Range<usize>,
314}
315
316#[derive(Debug, Clone, PartialEq)]
318pub enum ExpressionKind {
319 Identifier(String),
321 Constant(Constant),
323 StringLiteral(String),
325 ArraySubscript { array: Box<Expression>, index: Box<Expression> },
327 FunctionCall { function: Box<Expression>, arguments: Vec<Expression> },
329 MemberAccess {
331 object: Box<Expression>,
332 member: String,
333 is_pointer: bool, },
335 PostfixIncDec { operand: Box<Expression>, is_increment: bool },
337 PrefixIncDec { operand: Box<Expression>, is_increment: bool },
339 Unary { operator: UnaryOperator, operand: Box<Expression> },
341 Cast { type_name: Box<TypeName>, expression: Box<Expression> },
343 Binary { left: Box<Expression>, operator: BinaryOperator, right: Box<Expression> },
345 Conditional { condition: Box<Expression>, then_expr: Box<Expression>, else_expr: Box<Expression> },
347 Assignment { left: Box<Expression>, operator: AssignmentOperator, right: Box<Expression> },
349 Comma { expressions: Vec<Expression> },
351}
352
353#[derive(Debug, Clone, PartialEq)]
355pub enum Constant {
356 Integer(i64),
357 Float(f64),
358 Character(char),
359}
360
361#[derive(Debug, Clone, PartialEq)]
363pub enum UnaryOperator {
364 AddressOf, Dereference, Plus, Minus, BitwiseNot, LogicalNot, Sizeof, }
372
373#[derive(Debug, Clone, PartialEq)]
375pub enum BinaryOperator {
376 Add, Subtract, Multiply, Divide, Modulo, BitwiseAnd, BitwiseOr, BitwiseXor, LeftShift, RightShift, Equal, NotEqual, Less, Greater, LessEqual, GreaterEqual, LogicalAnd, LogicalOr, }
402
403#[derive(Debug, Clone, PartialEq)]
405pub enum AssignmentOperator {
406 Assign, AddAssign, SubAssign, MulAssign, DivAssign, ModAssign, AndAssign, OrAssign, XorAssign, LeftShiftAssign, RightShiftAssign, }
418
419#[derive(Debug, Clone, PartialEq)]
421pub struct TypeName {
422 pub specifier_qualifiers: Vec<SpecifierQualifier>,
423 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
424 pub span: Range<usize>,
425}
426
427impl TypeName {
428 pub fn new(
430 specifier_qualifiers: Vec<SpecifierQualifier>,
431 abstract_declarator: Option<Box<AbstractDeclarator>>,
432 span: Range<usize>,
433 ) -> Self {
434 Self { specifier_qualifiers, abstract_declarator, span }
435 }
436}
437
438impl CppRoot {
439 pub fn new(translation_unit: TranslationUnit) -> Self {
441 Self { translation_unit }
442 }
443}
444
445impl TranslationUnit {
446 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: Range<usize>) -> Self {
448 Self { external_declarations, span }
449 }
450}