From ebc02e09dc5edb2001d714c5f9b2ff27be9eaa13 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 8 May 2021 11:50:22 +0200 Subject: [PATCH] Fix #7 panic on too few function arguments Signed-off-by: trivernis --- src/elements/mod.rs | 1 + src/format/mathml.rs | 1 + src/parsing/tree_parser.rs | 22 +++++++++++++++------- src/tests/parsing.rs | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/elements/mod.rs b/src/elements/mod.rs index cc1d152..4304ff0 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -15,6 +15,7 @@ pub enum Element { Special(Special), Group(Group), Accent(ExpressionAccent), + Null, } impl Boxed for Element {} diff --git a/src/format/mathml.rs b/src/format/mathml.rs index 35d4108..74b4228 100644 --- a/src/format/mathml.rs +++ b/src/format/mathml.rs @@ -696,6 +696,7 @@ impl ToMathML for Element { Element::Literal(l) => l.to_mathml(), Element::Group(g) => g.to_mathml(), Element::Accent(a) => a.to_mathml(), + Element::Null => "".to_string(), } } } diff --git a/src/parsing/tree_parser.rs b/src/parsing/tree_parser.rs index 9ca0b25..a2d18b5 100644 --- a/src/parsing/tree_parser.rs +++ b/src/parsing/tree_parser.rs @@ -228,21 +228,21 @@ impl TreeParser { Misc::LatexFrac => { self.step(); Element::Special(Special::Frac(Frac { - top: self.parse_element().unwrap().boxed(), - bottom: self.parse_element().unwrap().boxed(), + top: self.parse_element().unwrap_or(Element::Null).boxed(), + bottom: self.parse_element().unwrap_or(Element::Null).boxed(), })) } Misc::Sqrt => { self.step(); Element::Special(Special::Sqrt(Sqrt { - inner: self.parse_element().unwrap().boxed(), + inner: self.parse_element().unwrap_or(Element::Null).boxed(), })) } Misc::Root => { self.step(); - let base = self.parse_element().unwrap().boxed(); + let base = self.parse_element().unwrap_or(Element::Null).boxed(); self.step(); - let inner = self.parse_element().unwrap().boxed(); + let inner = self.parse_element().unwrap_or(Element::Null).boxed(); Element::Special(Special::Root(Root { inner, base })) } Misc::Int => Element::Special(Special::Integral(Integral { @@ -432,7 +432,11 @@ impl TreeParser { self.step(); Some(Pow { base: previous.clone().boxed(), - exp: self.parse_element().unwrap().to_non_enclosed().boxed(), + exp: self + .parse_element() + .unwrap_or(Element::Null) + .to_non_enclosed() + .boxed(), }) } else { None @@ -446,7 +450,11 @@ impl TreeParser { self.step(); Some(Sub { base: previous.clone().boxed(), - lower: self.parse_element().unwrap().to_non_enclosed().boxed(), + lower: self + .parse_element() + .unwrap_or(Element::Null) + .to_non_enclosed() + .boxed(), }) } else { None diff --git a/src/tests/parsing.rs b/src/tests/parsing.rs index e73990d..ee8e892 100644 --- a/src/tests/parsing.rs +++ b/src/tests/parsing.rs @@ -228,5 +228,23 @@ fn it_parses_roots() { .boxed(), }))] } + ); + // test no fail + parse("root 3".to_string()); +} + +#[test] +fn it_parses_functions() { + let expr = parse("sin 10".to_string()); + assert_eq!( + expr, + Expression { + children: vec![ + Element::Literal(Literal::Function(Function::Sin)), + Element::Literal(Literal::Number(Number { + number: "10".to_string() + })) + ] + } ) }