From b5e0304ea789a12ce4a9b314df0b30b07eb2063c Mon Sep 17 00:00:00 2001 From: Tomasz Guz Date: Thu, 12 Jun 2025 15:44:20 +0200 Subject: [PATCH] expr: fix builtin functions precedence --- src/uu/expr/src/syntax_tree.rs | 10 +++++----- tests/by-util/test_expr.rs | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index d41ef90e2..673f3b43e 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -676,8 +676,8 @@ impl<'a, S: AsRef> Parser<'a, S> { let first = self.next()?; let inner = match first { "match" => { - let left = self.parse_expression()?; - let right = self.parse_expression()?; + let left = self.parse_simple_expression()?; + let right = self.parse_simple_expression()?; AstNodeInner::BinOp { op_type: BinOp::String(StringOp::Match), left: Box::new(left), @@ -695,8 +695,8 @@ impl<'a, S: AsRef> Parser<'a, S> { } } "index" => { - let left = self.parse_expression()?; - let right = self.parse_expression()?; + let left = self.parse_simple_expression()?; + let right = self.parse_simple_expression()?; AstNodeInner::BinOp { op_type: BinOp::String(StringOp::Index), left: Box::new(left), @@ -704,7 +704,7 @@ impl<'a, S: AsRef> Parser<'a, S> { } } "length" => { - let string = self.parse_expression()?; + let string = self.parse_simple_expression()?; AstNodeInner::Length { string: Box::new(string), } diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index fdf68ed73..ac602cb28 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -508,14 +508,44 @@ fn test_substr() { } #[test] -fn test_substr_precedence() { +fn test_builtin_functions_precedence() { new_ucmd!() .args(&["substr", "ab cd", "3", "1", "!=", " "]) .fails_with_code(1) .stdout_only("0\n"); new_ucmd!() - .args(&["substr", "ab cd", "2", "1", "!=", " "]) + .args(&["substr", "ab cd", "3", "1", "=", " "]) + .succeeds() + .stdout_only("1\n"); + + new_ucmd!() + .args(&["length", "abcd", "!=", "4"]) + .fails_with_code(1) + .stdout_only("0\n"); + + new_ucmd!() + .args(&["length", "abcd", "=", "4"]) + .succeeds() + .stdout_only("1\n"); + + new_ucmd!() + .args(&["index", "abcd", "c", "!=", "3"]) + .fails_with_code(1) + .stdout_only("0\n"); + + new_ucmd!() + .args(&["index", "abcd", "c", "=", "3"]) + .succeeds() + .stdout_only("1\n"); + + new_ucmd!() + .args(&["match", "abcd", "ab\\(.*\\)", "!=", "cd"]) + .fails_with_code(1) + .stdout_only("0\n"); + + new_ucmd!() + .args(&["match", "abcd", "ab\\(.*\\)", "=", "cd"]) .succeeds() .stdout_only("1\n"); }