From 56678d54123426d7975cb5786b10c82af5bc0472 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Wed, 25 Sep 2024 15:35:25 +0200 Subject: Desugar application of more than 2 values --- rust/src/parser.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'rust/src/parser.rs') diff --git a/rust/src/parser.rs b/rust/src/parser.rs index 874b893..3ac01ef 100644 --- a/rust/src/parser.rs +++ b/rust/src/parser.rs @@ -143,10 +143,16 @@ fn parse_let(parser: &mut Parser) -> Result { fn parse_application(parser: &mut Parser) -> Result { parser.expect(Token::LParen)?; - let left = parse_expression(parser)?; - let right = parse_expression(parser)?; + let init = parse_expression(parser)?; + let mut exprs = Vec::new(); + while let Ok(expr) = parse_expression(parser) { + exprs.push(expr); + } parser.expect(Token::RParen)?; - Ok(Value::App(Box::new(left), Box::new(right))) + let app: Value = exprs.iter().fold(init, |acc, expr| { + Value::App(Box::new(acc.clone()), Box::new(expr.clone())) + }); + Ok(app.to_owned()) } fn parse_value(parser: &mut Parser) -> Result { @@ -295,6 +301,20 @@ mod tests { ); } + #[test] + fn desugar_application_of_more_than_two_values() { + assert_eq!( + vec![App( + Box::new(App( + Box::new(App(Box::new(Sym("foo".to_string())), Box::new(Num(42)))), + Box::new(Bool(true)) + )), + Box::new(Sym("f".to_string())) + )], + parse("(foo 42 true f)") + ); + } + #[test] fn parse_abstraction() { assert_eq!( -- cgit v1.2.3