From 74df7f8a7c436a4911c207cc8604f9f226ead2b3 Mon Sep 17 00:00:00 2001 From: rvcas Date: Wed, 8 Jun 2022 22:21:22 -0400 Subject: [PATCH] fix: potential fix for left recursion --- crates/uplc/src/parser.rs | 42 ++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/crates/uplc/src/parser.rs b/crates/uplc/src/parser.rs index 8412c053..38d7120c 100644 --- a/crates/uplc/src/parser.rs +++ b/crates/uplc/src/parser.rs @@ -74,31 +74,45 @@ fn term() -> impl Parser, Error = Simple> { let delay = keyword("delay") .ignore_then(term.clone().padded()) .delimited_by(just('(').padded(), just(')').padded()) - .map(|t| Term::Delay(Box::new(t))); + .map(|t| dbg!(Term::Delay(Box::new(t)))); let force = keyword("force") .ignore_then(term.clone().padded()) .delimited_by(just('(').padded(), just(')').padded()) - .map(|t| Term::Force(Box::new(t))); + .map(|t| dbg!(Term::Force(Box::new(t)))); let lambda = keyword("lam") .ignore_then(name().padded()) .then(term.clone()) .delimited_by(just('(').padded(), just(')').padded()) - .map(|(parameter_name, t)| Term::Lambda { - parameter_name, - body: Box::new(t), + .map(|(parameter_name, t)| { + dbg!(Term::Lambda { + parameter_name, + body: Box::new(t), + }) }); - let apply = term - .clone() - .padded() - .then(term) - .delimited_by(just('[').padded(), just(']').padded()) - .map(|(function, argument)| Term::Apply { - function: Box::new(function), - argument: Box::new(argument), - }); + let apply = recursive(|a| { + let lambda = keyword("lam") + .ignore_then(name().padded()) + .then(term.clone()) + .delimited_by(just('(').padded(), just(')').padded()) + .map(|(parameter_name, t)| Term::Lambda { + parameter_name, + body: Box::new(t), + }); + + var() + .or(lambda) + .or(a.delimited_by(just('[').padded(), just(']').padded())) + .padded() + .then(term) + .delimited_by(just('[').padded(), just(']').padded()) + .map(|(function, argument)| Term::Apply { + function: Box::new(function), + argument: Box::new(argument), + }) + }); constant() .or(builtin())