Skip to content
This repository was archived by the owner on Sep 16, 2021. It is now read-only.

Commit 2beff09

Browse files
committed
Fixes for conditional statements
1 parent 2d905db commit 2beff09

File tree

3 files changed

+12
-21
lines changed

3 files changed

+12
-21
lines changed

compiler/src/ast/expression.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ pub struct CastExpression {
3030

3131
#[derive(Debug)]
3232
pub struct ConditionalExpression {
33-
pub condition: SubExpression,
34-
pub consequence: SubExpression,
35-
pub alternative: SubExpression,
33+
pub condition: Block,
34+
pub consequence: Block,
35+
pub alternative: Block,
3636
}
3737

3838
#[derive(Debug)]

compiler/src/codegen/block/gen_conditional.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use inkwell::{FloatPredicate};
44

55
pub fn gen_conditional_statement(
66
index: usize,
7-
condition: &usize,
8-
consequence: &usize,
9-
alternative: &usize,
7+
condition: usize,
8+
consequence: usize,
9+
alternative: usize,
1010
node: &mut BlockContext,
1111
) -> PointerValue {
1212

@@ -17,7 +17,8 @@ pub fn gen_conditional_statement(
1717
// From https://github.com/TheDan64/inkwell/blob/master/examples/kaleidoscope/main.rs#L999
1818
// TODO Why is float created here?
1919
// TODO Find a way to invoke a compile_expr function
20-
let condition = self.compile_expr(condition)?;
20+
//let condition = self.compile_expr(condition)?;
21+
let condition = node.get_statement(condition);
2122
let condition = builder.build_float_compare(FloatPredicate::ONE, condition, zero_const, "ifcond");
2223

2324
let then_bb = node
@@ -38,14 +39,14 @@ pub fn gen_conditional_statement(
3839

3940
// build then block
4041
builder.position_at_end(&then_bb);
41-
let then_val = self.compile_expr(consequence)?;
42+
let then_val = node.get_statement(consequence);
4243
builder.build_unconditional_branch(&cont_bb);
4344

4445
let then_bb = builder.get_insert_block().unwrap();
4546

4647
// build else block
4748
builder.position_at_end(&else_bb);
48-
let else_val = self.compile_expr(alternative)?;
49+
let else_val = node.get_statement(alternative);
4950
builder.build_unconditional_branch(&cont_bb);
5051

5152
let else_bb = builder.get_insert_block().unwrap();
@@ -60,6 +61,5 @@ pub fn gen_conditional_statement(
6061
(&else_val, &else_bb)
6162
]);
6263

63-
// TODO This should return inkwell::values::PointerValue but instead returns std::result::Result
64-
Ok(phi.as_basic_value().into_float_value())
64+
phi.as_basic_value().into_pointer_value()
6565
}

compiler/src/parser/mod.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -670,12 +670,7 @@ impl Parser {
670670
fn parse_conditional_expr(stream: &mut TokenStream) -> ExprResult {
671671
let if_token = Parser::expect_token(TokenType::If, stream.next())?;
672672

673-
let token_type = match stream.peek() {
674-
Some(token) => token.token_type,
675-
None => return Err(CompileError::UnexpectedEnd),
676-
};
677-
678-
let cond = Parser::parse_expression(stream, Parser::get_operator_precedence(token_type))?;
673+
let cond = Parser::parse_expression(stream, PRECEDENCE_ALL)?;
679674

680675
Parser::expect_token(TokenType::Then, stream.next())?;
681676

@@ -693,10 +688,6 @@ impl Parser {
693688
};
694689
let alternative = Parser::parse_expression(stream, Parser::get_operator_precedence(alternative_token_type))?;
695690

696-
let end_pos = Parser::expect_token(TokenType::CloseBracket, stream.next())?
697-
.pos
698-
.1;
699-
700691
Ok(Expression::new_conditional(
701692
SourceRange(if_token.pos.0, end_pos),
702693
Box::new(cond),

0 commit comments

Comments
 (0)