summaryrefslogtreecommitdiff
path: root/src/nibble
diff options
context:
space:
mode:
authorGreg Brown <gmb60@cam.ac.uk>2020-11-25 12:23:34 +0000
committerGreg Brown <gmb60@cam.ac.uk>2020-11-25 12:23:34 +0000
commitd3da0a832f3fda143d3722b59ff42b6ccb3ac953 (patch)
treefd4ec752d941636fd9ece0988a0df2e131de4fa5 /src/nibble
parent3bb6bb3d6f0e8f3918d3543dceeeafa32b896371 (diff)
Change associativity of cat and alt
Diffstat (limited to 'src/nibble')
-rw-r--r--src/nibble/mod.rs48
1 files changed, 31 insertions, 17 deletions
diff --git a/src/nibble/mod.rs b/src/nibble/mod.rs
index 478580a..3fad97b 100644
--- a/src/nibble/mod.rs
+++ b/src/nibble/mod.rs
@@ -267,14 +267,21 @@ impl Convert for Cat {
fn convert(self, context: &Context) -> ast::Term {
use ast::Term;
let mut iter = self.terms.into_pairs();
- let init = match iter.next_back().unwrap() {
- Pair::Punctuated(_, _) => unreachable!(),
- Pair::End(t) => t.convert(context),
+ let init = match iter.next().unwrap() {
+ Pair::Punctuated(t, p) => Ok((t.convert(context), p)),
+ Pair::End(t) => Err(t.convert(context)),
};
- iter.rfold(init, |term, pair| match pair {
- Pair::Punctuated(t, p) => Term::Cat(ast::Cat::new(t.convert(context), p, term)),
- Pair::End(_) => unreachable!(),
- })
+ iter.fold(init, |term, pair|{
+ let (fst, punct) = term.unwrap();
+ match pair {
+ Pair::Punctuated(t, p) => {
+ Ok((Term::Cat(ast::Cat::new(fst, punct, t.convert(context))), p))
+ }
+ Pair::End(t) => {
+ Err(Term::Cat(ast::Cat::new(fst, punct, t.convert(context))))
+ }
+ }
+ }).unwrap_err()
}
}
@@ -312,16 +319,23 @@ impl Parse for Alt {
impl Convert for Alt {
fn convert(self, context: &Context) -> ast::Term {
- use ast::Term;
- let mut iter = self.cats.into_pairs();
- let init = match iter.next_back().unwrap() {
- Pair::Punctuated(_, _) => unreachable!(),
- Pair::End(t) => t.convert(context),
- };
- iter.rfold(init, |term, pair| match pair {
- Pair::Punctuated(t, p) => Term::Alt(ast::Alt::new(t.convert(context), p, term)),
- Pair::End(_) => unreachable!(),
- })
+ use ast::Term;
+ let mut iter = self.cats.into_pairs();
+ let init = match iter.next().unwrap() {
+ Pair::Punctuated(t, p) => Ok((t.convert(context), p)),
+ Pair::End(t) => Err(t.convert(context)),
+ };
+ iter.fold(init, |cat, pair|{
+ let (left, punct) = cat.unwrap();
+ match pair {
+ Pair::Punctuated(t, p) => {
+ Ok((Term::Alt(ast::Alt::new(left, punct, t.convert(context))), p))
+ }
+ Pair::End(t) => {
+ Err(Term::Alt(ast::Alt::new(left, punct, t.convert(context))))
+ }
+ }
+ }).unwrap_err()
}
}