Skip to content

Commit 96a37d6

Browse files
committed
add else-if construct
1 parent 67afea2 commit 96a37d6

File tree

4 files changed

+61
-44
lines changed

4 files changed

+61
-44
lines changed

crates/lean_compiler/src/grammar.pest

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ single_assignment = { identifier ~ "=" ~ expression ~ ";" }
4242

4343
array_assign = { identifier ~ "[" ~ expression ~ "]" ~ "=" ~ expression ~ ";" }
4444

45-
if_statement = { "if" ~ condition ~ "{" ~ statement* ~ "}" ~ else_clause? }
45+
if_statement = { "if" ~ condition ~ "{" ~ statement* ~ "}" ~ else_if_clause* ~ else_clause? }
4646

4747
condition = { expression | assumed_bool_expr }
4848

4949
assumed_bool_expr = { "!!assume_bool" ~ "(" ~ expression ~ ")" }
5050

51+
else_if_clause = { "else" ~ "if" ~ condition ~ "{" ~ statement* ~ "}" }
52+
5153
else_clause = { "else" ~ "{" ~ statement* ~ "}" }
5254

5355
for_statement = { "for" ~ identifier ~ "in" ~ rev_clause? ~ expression ~ ".." ~ expression ~ unroll_clause? ~ "{" ~ statement* ~ "}" }

crates/lean_compiler/src/parser/parsers/statement.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::function::{FunctionCallParser, TupleExpressionParser};
33
use super::literal::ConstExprParser;
44
use super::{Parse, ParseContext, next_inner_pair};
55
use crate::{
6+
SourceLineNumber,
67
ir::HighLevelOperation,
78
lang::{AssumeBoolean, Boolean, Condition, Expression, Line},
89
parser::{
@@ -88,14 +89,26 @@ impl Parse<Line> for IfStatementParser {
8889
let mut inner = pair.into_inner();
8990
let condition = ConditionParser::parse(next_inner_pair(&mut inner, "if condition")?, ctx)?;
9091

91-
let mut then_branch = Vec::new();
92-
let mut else_branch = Vec::new();
92+
let mut then_branch: Vec<Line> = Vec::new();
93+
let mut else_if_branches: Vec<(Condition, Vec<Line>, SourceLineNumber)> = Vec::new();
94+
let mut else_branch: Vec<Line> = Vec::new();
9395

9496
for item in inner {
9597
match item.as_rule() {
9698
Rule::statement => {
9799
Self::add_statement_with_location(&mut then_branch, item, ctx)?;
98100
}
101+
Rule::else_if_clause => {
102+
let line_number = item.line_col().0;
103+
let mut inner = item.into_inner();
104+
let else_if_condition =
105+
ConditionParser::parse(next_inner_pair(&mut inner, "else if condition")?, ctx)?;
106+
let mut else_if_branch = Vec::new();
107+
for else_if_item in inner {
108+
Self::add_statement_with_location(&mut else_if_branch, else_if_item, ctx)?;
109+
}
110+
else_if_branches.push((else_if_condition, else_if_branch, line_number));
111+
}
99112
Rule::else_clause => {
100113
for else_item in item.into_inner() {
101114
if else_item.as_rule() == Rule::statement {
@@ -107,10 +120,28 @@ impl Parse<Line> for IfStatementParser {
107120
}
108121
}
109122

123+
let mut outer_else_branch = Vec::new();
124+
let mut inner_else_branch = &mut outer_else_branch;
125+
126+
for (else_if_condition, else_if_branch, line_number) in else_if_branches.into_iter() {
127+
inner_else_branch.push(Line::IfCondition {
128+
condition: else_if_condition,
129+
then_branch: else_if_branch,
130+
else_branch: Vec::new(),
131+
line_number,
132+
});
133+
inner_else_branch = match &mut inner_else_branch[0] {
134+
Line::IfCondition { else_branch, .. } => else_branch,
135+
_ => unreachable!("Expected Line::IfCondition"),
136+
};
137+
}
138+
139+
inner_else_branch.extend(else_branch);
140+
110141
Ok(Line::IfCondition {
111142
condition,
112143
then_branch,
113-
else_branch,
144+
else_branch: outer_else_branch,
114145
line_number,
115146
})
116147
}

crates/lean_compiler/tests/test_compiler.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,13 @@ fn test_mini_program_1() {
259259
for i in 0..N {
260260
if i == 0 {
261261
arr[i] = 10;
262+
} else if i == 1 {
263+
arr[i] = 20;
264+
} else if i == 2 {
265+
arr[i] = 30;
262266
} else {
263-
if i == 1 {
264-
arr[i] = 20;
265-
} else {
266-
if i == 2 {
267-
arr[i] = 30;
268-
} else {
269-
i_plus_one = i + 1;
270-
arr[i] = i_plus_one;
271-
}
272-
}
267+
i_plus_one = i + 1;
268+
arr[i] = i_plus_one;
273269
}
274270
}
275271
return;

crates/rec_aggregation/recursion_program.lean_lang

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -377,21 +377,15 @@ fn merkle_verif_batch_dynamic(n_paths, leaves_digests, leave_positions, root, he
377377
if height == MERKLE_HEIGHT_0 {
378378
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_0);
379379
return;
380-
} else {
381-
if height == MERKLE_HEIGHT_1 {
382-
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_1);
383-
return;
384-
} else {
385-
if height == MERKLE_HEIGHT_2 {
386-
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_2);
387-
return;
388-
} else {
389-
if height == MERKLE_HEIGHT_3 {
390-
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_3);
391-
return;
392-
}
393-
}
394-
}
380+
} else if height == MERKLE_HEIGHT_1 {
381+
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_1);
382+
return;
383+
} else if height == MERKLE_HEIGHT_2 {
384+
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_2);
385+
return;
386+
} else if height == MERKLE_HEIGHT_3 {
387+
merkle_verif_batch_const(n_paths, leaves_digests, leave_positions, root, MERKLE_HEIGHT_3);
388+
return;
395389
}
396390

397391
print(12345555);
@@ -725,21 +719,15 @@ fn sample_bits_dynamic(fs_state, n_samples, K) -> 2 {
725719
if n_samples == NUM_QUERIES_0 {
726720
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_0, K);
727721
return new_fs_state, sampled_bits;
728-
} else {
729-
if n_samples == NUM_QUERIES_1 {
730-
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_1, K);
731-
return new_fs_state, sampled_bits;
732-
} else {
733-
if n_samples == NUM_QUERIES_2 {
734-
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_2, K);
735-
return new_fs_state, sampled_bits;
736-
} else {
737-
if n_samples == NUM_QUERIES_3 {
738-
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_3, K);
739-
return new_fs_state, sampled_bits;
740-
}
741-
}
742-
}
722+
} else if n_samples == NUM_QUERIES_1 {
723+
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_1, K);
724+
return new_fs_state, sampled_bits;
725+
} else if n_samples == NUM_QUERIES_2 {
726+
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_2, K);
727+
return new_fs_state, sampled_bits;
728+
} else if n_samples == NUM_QUERIES_3 {
729+
new_fs_state, sampled_bits = sample_bits_const(fs_state, NUM_QUERIES_3, K);
730+
return new_fs_state, sampled_bits;
743731
}
744732
print(n_samples);
745733
print(999333);

0 commit comments

Comments
 (0)