Skip to main content

oak_c/ast/
expression_nodes.rs

1use super::*;
2
3/// Expression.
4#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[derive(Debug, Clone, PartialEq)]
6pub struct Expression {
7    /// Expression kind.
8    pub kind: Box<ExpressionKind>,
9    /// Source span.
10    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
11    pub span: core::range::Range<usize>,
12}
13
14/// Expression kind.
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[derive(Debug, Clone, PartialEq)]
17pub enum ExpressionKind {
18    /// Identifier.
19    Identifier(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
20    /// Constant (literal).
21    Constant(Constant, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
22    /// String literal.
23    StringLiteral(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
24    /// Array subscript `array[index]`.
25    ArraySubscript {
26        /// The array expression.
27        array: Box<Expression>,
28        /// The index expression.
29        index: Box<Expression>,
30        /// Source span.
31        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
32        span: core::range::Range<usize>,
33    },
34    /// Function call `function(arguments)`.
35    FunctionCall {
36        /// The function expression.
37        function: Box<Expression>,
38        /// List of arguments.
39        arguments: Vec<Expression>,
40        /// Source span.
41        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
42        span: core::range::Range<usize>,
43    },
44    /// Member access `object.member` or `object->member`.
45    MemberAccess {
46        /// The object expression.
47        object: Box<Expression>,
48        /// Member name.
49        member: String,
50        /// Whether it's a pointer access (`->`).
51        is_pointer: bool,
52        /// Source span.
53        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
54        span: core::range::Range<usize>,
55    },
56    /// Postfix increment or decrement (`++`, `--`).
57    PostfixIncDec {
58        /// The operand.
59        operand: Box<Expression>,
60        /// Whether it's an increment.
61        is_increment: bool,
62        /// Source span.
63        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
64        span: core::range::Range<usize>,
65    },
66    /// Prefix increment or decrement (`++`, `--`).
67    PrefixIncDec {
68        /// The operand.
69        operand: Box<Expression>,
70        /// Whether it's an increment.
71        is_increment: bool,
72        /// Source span.
73        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
74        span: core::range::Range<usize>,
75    },
76    /// Unary operation.
77    Unary {
78        /// Unary operator.
79        operator: UnaryOperator,
80        /// The operand.
81        operand: Box<Expression>,
82        /// Source span.
83        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
84        span: core::range::Range<usize>,
85    },
86    /// Type cast `(type_name) expression`.
87    Cast {
88        /// Target type.
89        type_name: Box<TypeName>,
90        /// The expression to cast.
91        expression: Box<Expression>,
92        /// Source span.
93        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
94        span: core::range::Range<usize>,
95    },
96    /// Binary operation.
97    Binary {
98        /// Left operand.
99        left: Box<Expression>,
100        /// Binary operator.
101        operator: BinaryOperator,
102        /// Right operand.
103        right: Box<Expression>,
104        /// Source span.
105        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
106        span: core::range::Range<usize>,
107    },
108    /// Conditional expression `condition ? then_expr : else_expr`.
109    Conditional {
110        /// Condition.
111        condition: Box<Expression>,
112        /// Then expression.
113        then_expr: Box<Expression>,
114        /// Else expression.
115        else_expr: Box<Expression>,
116        /// Source span.
117        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118        span: core::range::Range<usize>,
119    },
120    /// Assignment expression.
121    Assignment {
122        /// Left side of assignment.
123        left: Box<Expression>,
124        /// Assignment operator.
125        operator: AssignmentOperator,
126        /// Right side of assignment.
127        right: Box<Expression>,
128        /// Source span.
129        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
130        span: core::range::Range<usize>,
131    },
132    /// Comma expression `expr1, expr2, ...`.
133    Comma {
134        /// List of expressions.
135        expressions: Vec<Expression>,
136        /// Source span.
137        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138        span: core::range::Range<usize>,
139    },
140}
141
142impl ExpressionKind {
143    /// Returns the source span of the expression kind.
144    pub fn span(&self) -> core::range::Range<usize> {
145        match self {
146            Self::Identifier(_, span) => span.clone(),
147            Self::Constant(_, span) => span.clone(),
148            Self::StringLiteral(_, span) => span.clone(),
149            Self::ArraySubscript { span, .. } => span.clone(),
150            Self::FunctionCall { span, .. } => span.clone(),
151            Self::MemberAccess { span, .. } => span.clone(),
152            Self::PostfixIncDec { span, .. } => span.clone(),
153            Self::PrefixIncDec { span, .. } => span.clone(),
154            Self::Unary { span, .. } => span.clone(),
155            Self::Cast { span, .. } => span.clone(),
156            Self::Binary { span, .. } => span.clone(),
157            Self::Conditional { span, .. } => span.clone(),
158            Self::Assignment { span, .. } => span.clone(),
159            Self::Comma { span, .. } => span.clone(),
160        }
161    }
162}
163
164/// Constant (literal).
165#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
166#[derive(Debug, Clone, PartialEq)]
167pub enum Constant {
168    /// Integer constant.
169    Integer(i64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
170    /// Floating-point constant.
171    Float(f64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
172    /// Character constant.
173    Character(char, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
174}
175
176impl Constant {
177    /// Returns the source span of the constant.
178    pub fn span(&self) -> core::range::Range<usize> {
179        match self {
180            Self::Integer(_, span) => span.clone(),
181            Self::Float(_, span) => span.clone(),
182            Self::Character(_, span) => span.clone(),
183        }
184    }
185}
186
187/// Unary operator.
188#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
189#[derive(Debug, Clone, Copy, PartialEq, Eq)]
190pub enum UnaryOperator {
191    /// `&`
192    AddressOf,
193    /// `*`
194    Indirection,
195    /// `+`
196    Plus,
197    /// `-`
198    Minus,
199    /// `~`
200    BitNot,
201    /// `!`
202    LogicalNot,
203    /// `sizeof`
204    Sizeof,
205}
206
207/// Binary operator.
208#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
209#[derive(Debug, Clone, Copy, PartialEq, Eq)]
210pub enum BinaryOperator {
211    /// `*`
212    Multiply,
213    /// `/`
214    Divide,
215    /// `%`
216    Modulo,
217    /// `+`
218    Add,
219    /// `-`
220    Subtract,
221    /// `<<`
222    ShiftLeft,
223    /// `>>`
224    ShiftRight,
225    /// `<`
226    Less,
227    /// `>`
228    Greater,
229    /// `<=`
230    LessEqual,
231    /// `>=`
232    GreaterEqual,
233    /// `==`
234    Equal,
235    /// `!=`
236    NotEqual,
237    /// `&`
238    BitAnd,
239    /// `^`
240    BitXor,
241    /// `|`
242    BitOr,
243    /// `&&`
244    LogicalAnd,
245    /// `||`
246    LogicalOr,
247}
248
249/// Assignment operator.
250#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
251#[derive(Debug, Clone, Copy, PartialEq, Eq)]
252pub enum AssignmentOperator {
253    /// `=`
254    Assign,
255    /// `*=`
256    MulAssign,
257    /// `/=`
258    DivAssign,
259    /// `%=`
260    ModAssign,
261    /// `+=`
262    AddAssign,
263    /// `-=`
264    SubAssign,
265    /// `<<=`
266    ShlAssign,
267    /// `>>=`
268    ShrAssign,
269    /// `&=`
270    AndAssign,
271    /// `^=`
272    XorAssign,
273    /// `|=`
274    OrAssign,
275}
276
277/// Type name.
278#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
279#[derive(Debug, Clone, PartialEq)]
280pub struct TypeName {
281    /// List of specifiers and qualifiers.
282    pub specifier_qualifiers: Vec<SpecifierQualifier>,
283    /// Optional abstract declarator.
284    pub abstract_declarator: Option<Box<AbstractDeclarator>>,
285    /// Source span.
286    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
287    pub span: core::range::Range<usize>,
288}
289
290impl TypeName {
291    /// Returns the source span of the type name.
292    pub fn span(&self) -> core::range::Range<usize> {
293        self.span.clone()
294    }
295}