Skip to content

Commit ee5fb5b

Browse files
committed
ExprJump WIP
1 parent 3997a72 commit ee5fb5b

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

rust/rustell/src/encode.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,34 @@ use std::iter::{IntoIterator, once};
33
use std::vec::IntoIter;
44

55
pub fn expr<'a>(
6-
ast: &'a [Expr<'a>],
6+
xs: &'a [Expr<'a>],
77
) -> impl Iterator<Item = &'a str> + 'a {
8-
ast.iter().flat_map(expr_one)
8+
xs.iter()
9+
.enumerate()
10+
.flat_map(|(i, x)| expr_ast(i + 1 == xs.len(), x))
911
}
1012

11-
fn expr_one<'a>(ast: &'a Expr<'a>) -> IntoIter<&'a str> {
13+
fn expr_ast<'a>(
14+
last: bool,
15+
ast: &'a Expr<'a>,
16+
) -> IntoIter<&'a str> {
17+
let end = if last { vec![] } else { vec![";"] };
1218
match ast {
13-
Expr::Mod(x) => vec!["mod ", x, ";"].into_iter(),
19+
Expr::Mod(x) => vec!["mod ", x, ";"],
1420
Expr::Use(x) => expr_use(true, x)
1521
.chain(once(";"))
16-
.collect::<Vec<_>>()
17-
.into_iter(),
18-
Expr::Raw(x) => vec![*x].into_iter(),
22+
.collect::<Vec<_>>(),
23+
Expr::Jump(x) => {
24+
expr_jump(x).chain(end).collect::<Vec<_>>()
25+
}
26+
Expr::Block(xs) => once("{")
27+
.chain(expr(xs))
28+
.chain(once("}"))
29+
.chain(end)
30+
.collect::<Vec<_>>(),
31+
Expr::Raw(x) => vec![*x],
1932
}
33+
.into_iter()
2034
}
2135

2236
fn expr_use<'a>(
@@ -42,6 +56,19 @@ fn expr_use<'a>(
4256
x0.into_iter().chain(x1).collect::<Vec<_>>().into_iter()
4357
}
4458

59+
fn expr_jump<'a>(
60+
ast: &'a ExprJump<'a>,
61+
) -> IntoIter<&'a str> {
62+
match ast {
63+
ExprJump::Break => vec!["break"],
64+
ExprJump::Continue => vec!["continue"],
65+
ExprJump::Return(x) => once("return ")
66+
.chain(expr_ast(true, x))
67+
.collect::<Vec<_>>(),
68+
}
69+
.into_iter()
70+
}
71+
4572
fn expr_use_item<'a>(
4673
module: &'a str,
4774
rename: Option<&'a str>,

rust/rustell/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ pub use chumsky::prelude::Parser;
66
pub enum Expr<'a> {
77
Mod(&'a str),
88
Use(ExprUse<'a>),
9+
Jump(ExprJump<'a>),
10+
Block(Vec<Expr<'a>>),
911
Raw(&'a str),
1012
}
1113

@@ -19,3 +21,10 @@ pub enum ExprUse<'a> {
1921
Many(Vec<ExprUse<'a>>),
2022
Glob,
2123
}
24+
25+
#[derive(Eq, PartialEq, Debug, Clone)]
26+
pub enum ExprJump<'a> {
27+
Break,
28+
Continue,
29+
Return(Box<Expr<'a>>),
30+
}

0 commit comments

Comments
 (0)