diff --git a/kalk/src/analysis.rs b/kalk/src/analysis.rs index 7b73bac..58883ed 100644 --- a/kalk/src/analysis.rs +++ b/kalk/src/analysis.rs @@ -122,11 +122,7 @@ fn build_fn_decl( // Check if all the expressions in the parameter_expr are // variables. If not, it can't be turned into a function declaration. let all_are_vars = match ¶meter_expr { - Expr::Vector(exprs) => { - exprs - .iter() - .any(|x| matches!(x, Expr::Var(_))) - } + Expr::Vector(exprs) => exprs.iter().any(|x| matches!(x, Expr::Var(_))), Expr::Group(expr) => { matches!(&**expr, Expr::Var(_)) } @@ -610,7 +606,7 @@ fn build_fn_call( context.sum_variable_names = Some(Vec::new()); } } - + // Don't perform equation solving on special functions if is_integral || is_sum_prod { context.in_equation = false; @@ -775,7 +771,13 @@ fn build_var(context: &mut Context, name: &str) -> Expr { } } - if context.in_sum_prod && context.sum_variable_names.as_ref().unwrap().contains(&name.to_string()) { + if context.in_sum_prod + && context + .sum_variable_names + .as_ref() + .unwrap() + .contains(&name.to_string()) + { return Expr::Var(Identifier::from_full_name(name)); } diff --git a/kalk/src/parser.rs b/kalk/src/parser.rs index f1aa1db..063ecdb 100644 --- a/kalk/src/parser.rs +++ b/kalk/src/parser.rs @@ -433,7 +433,7 @@ fn parse_sum(context: &mut Context) -> Result { while match_token(context, TokenKind::Plus) || match_token(context, TokenKind::Minus) { let op = peek(context).kind; advance(context); - let right = parse_factor(context)?; + let right = parse_sum(context)?; left = Expr::Binary(Box::new(left), op, Box::new(right)); } @@ -447,11 +447,7 @@ fn parse_factor(context: &mut Context) -> Result { if let Expr::Unary(TokenKind::Percent, percent_left) = left.clone() { let try_parse = parse_factor(context); if try_parse.is_ok() { - left = Expr::Binary( - percent_left, - TokenKind::Percent, - Box::new(try_parse?), - ); + left = Expr::Binary(percent_left, TokenKind::Percent, Box::new(try_parse?)); } } @@ -477,7 +473,7 @@ fn parse_factor(context: &mut Context) -> Result { _ => advance(context).kind, }; - let right = parse_unit(context)?; + let right = parse_factor(context)?; left = Expr::Binary(Box::new(left), op, Box::new(right)); } diff --git a/tests/basics.kalker b/tests/basics.kalker index b152313..8921502 100644 --- a/tests/basics.kalker +++ b/tests/basics.kalker @@ -2,4 +2,4 @@ x = 2 y = 3 f(x) = 2x(x - 3)(y + 2) -f(f(x) + y) = 3400 \ No newline at end of file +2f(f(x) + y) = 6800 \ No newline at end of file