summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud.bailly@iohk.io>2024-09-25 15:35:25 +0200
committerArnaud Bailly <arnaud.bailly@iohk.io>2024-09-25 15:35:25 +0200
commit56678d54123426d7975cb5786b10c82af5bc0472 (patch)
treef462e33f1048127ba79415c520b2764fa5e0c8de
parentccbec05210dfd810a950b483db0e0c60ce83859d (diff)
downloadlambda-nantes-56678d54123426d7975cb5786b10c82af5bc0472.tar.gz
Desugar application of more than 2 values
-rw-r--r--rust/src/parser.rs26
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![Lam(