diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 15:35:25 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-09-25 15:35:25 +0200 |
| commit | 56678d54123426d7975cb5786b10c82af5bc0472 (patch) | |
| tree | f462e33f1048127ba79415c520b2764fa5e0c8de | |
| parent | ccbec05210dfd810a950b483db0e0c60ce83859d (diff) | |
| download | lambda-nantes-56678d54123426d7975cb5786b10c82af5bc0472.tar.gz | |
Desugar application of more than 2 values
| -rw-r--r-- | rust/src/parser.rs | 26 |
1 files changed, 23 insertions, 3 deletions
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<Value, String> { fn parse_application(parser: &mut Parser) -> Result<Value, String> { 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<Value, String> { @@ -296,6 +302,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!( vec