Skip to content

Commit f72c90b

Browse files
committed
Started implementing address-of and dereference operators
1 parent 4b8fe61 commit f72c90b

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

src/ast/expr/unary.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ pub enum UnaryOperator {
1313
BitComplement,
1414
Negate,
1515
IsNonZero,
16+
AddressOf,
17+
Dereference,
1618
}
1719

1820
impl Display for UnaryOperator {
@@ -22,6 +24,8 @@ impl Display for UnaryOperator {
2224
Self::BitComplement => "~",
2325
Self::Negate => "-",
2426
Self::IsNonZero => "bool()",
27+
Self::AddressOf => "(address of) &",
28+
Self::Dereference => "(dereference) *",
2529
})
2630
}
2731
}

src/lower/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,11 +736,21 @@ fn lower_expr(
736736
resolved_ast,
737737
)?;
738738

739+
let inner_type = lower_type(
740+
ir_module.target,
741+
&unary_operation.inner.resolved_type,
742+
resolved_ast,
743+
)?;
744+
739745
Ok(builder.push(match unary_operation.operator {
740746
resolved::UnaryOperator::Not => ir::Instruction::IsZero(inner),
741747
resolved::UnaryOperator::BitComplement => ir::Instruction::BitComplement(inner),
742748
resolved::UnaryOperator::Negate => ir::Instruction::Negate(inner),
743749
resolved::UnaryOperator::IsNonZero => ir::Instruction::IsNonZero(inner),
750+
resolved::UnaryOperator::AddressOf => {
751+
unimplemented!("address of operator");
752+
}
753+
resolved::UnaryOperator::Dereference => ir::Instruction::Load((inner, inner_type)),
744754
}))
745755
}
746756
ExprKind::Conditional(conditional) => {

src/parser/parse_expr/primary/mod.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,18 +122,24 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
122122
}
123123
}
124124
}
125-
TokenKind::Not | TokenKind::BitComplement | TokenKind::Subtract => {
125+
TokenKind::Not
126+
| TokenKind::BitComplement
127+
| TokenKind::Subtract
128+
| TokenKind::AddressOf
129+
| TokenKind::Dereference => {
126130
let operator = match kind {
127131
TokenKind::Not => UnaryOperator::Not,
128132
TokenKind::BitComplement => UnaryOperator::BitComplement,
129133
TokenKind::Subtract => UnaryOperator::Negate,
134+
TokenKind::AddressOf => UnaryOperator::AddressOf,
135+
TokenKind::Dereference => UnaryOperator::Dereference,
130136
_ => unreachable!(),
131137
};
132138

133139
// Eat unary operator
134140
self.input.advance();
135141

136-
let inner = self.parse_expr()?;
142+
let inner = self.parse_expr_primary()?;
137143

138144
Ok(Expr::new(
139145
ExprKind::UnaryOperation(Box::new(UnaryOperation { operator, inner })),

src/parser/parse_stmt/mod.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,23 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
2222
return self.parse_declaration();
2323
}
2424

25-
let lhs = self.parse_expr()?;
25+
()
26+
}
27+
TokenKind::ReturnKeyword => return self.parse_return(),
28+
TokenKind::EndOfFile => return Err(self.unexpected_token_is_next()),
29+
_ => (),
30+
}
2631

27-
if self.input.peek().is_assignment_like() {
28-
// Assignment-Like Statement
29-
return self.parse_assignment(lhs);
30-
}
32+
let lhs = self.parse_expr_primary()?;
3133

32-
// Plain Expression Statement
33-
Ok(StmtKind::Expr(lhs).at(source))
34-
}
35-
TokenKind::ReturnKeyword => self.parse_return(),
36-
TokenKind::EndOfFile => Err(self.unexpected_token_is_next()),
37-
_ => Ok(Stmt::new(StmtKind::Expr(self.parse_expr()?), source)),
34+
if self.input.peek().is_assignment_like() {
35+
// Assignment-Like Statement
36+
return self.parse_assignment(lhs);
3837
}
38+
39+
let lhs = self.parse_operator_expr(0, lhs)?;
40+
41+
// Plain Expression Statement
42+
Ok(StmtKind::Expr(lhs).at(source))
3943
}
4044
}

src/resolve/expr/unary_operation.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ pub fn resolve_unary_operation_expr(
4141
let result_type = match unary_operation.operator {
4242
UnaryOperator::Not | UnaryOperator::IsNonZero => TypeKind::Boolean.at(source),
4343
UnaryOperator::BitComplement | UnaryOperator::Negate => resolved_expr.resolved_type.clone(),
44+
UnaryOperator::AddressOf => {
45+
TypeKind::Pointer(Box::new(resolved_expr.resolved_type.clone())).at(source)
46+
}
47+
UnaryOperator::Dereference => resolved_expr.resolved_type.clone(),
4448
};
4549

4650
let expr = Expr::new(

0 commit comments

Comments
 (0)