From 5935839881b5437eec4ea3915acbe887782d68d3 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Wed, 20 Mar 2019 22:53:18 +0100 Subject: Reimplement shortcutting --- dhall_core/src/parser.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'dhall_core/src/parser.rs') diff --git a/dhall_core/src/parser.rs b/dhall_core/src/parser.rs index 34809b5..ef7fcc9 100644 --- a/dhall_core/src/parser.rs +++ b/dhall_core/src/parser.rs @@ -188,11 +188,19 @@ macro_rules! make_parser { let mut values_stack: Vec = vec![]; while let Some(p) = pairs_stack.pop() { match p { - Unprocessed(pair) => { - let mut pairs: Vec<_> = pair.clone().into_inner().map(StackFrame::Unprocessed).collect(); - let n_children = pairs.len(); - pairs_stack.push(Processed(pair, n_children)); - pairs_stack.append(&mut pairs); + Unprocessed(mut pair) => { + loop { + let mut pairs: Vec<_> = pair.clone().into_inner().collect(); + let n_children = pairs.len(); + if n_children == 1 && can_be_shortcutted(pair.as_rule()) { + pair = pairs.pop().unwrap(); + continue + } else { + pairs_stack.push(Processed(pair, n_children)); + pairs_stack.extend(pairs.into_iter().map(StackFrame::Unprocessed)); + break + } + } } Processed(pair, n) => { let mut parsed: Vec<_> = values_stack.split_off(values_stack.len() - n); -- cgit v1.2.3