diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index c55fb0bdc6a..119f325a3d1 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -332,8 +332,12 @@ fn push_token_to_either_stack( } Token::PrefixOp { .. } | Token::ParOpen => { - op_stack.push((token_idx, token.clone())); - Ok(()) + if out_stack.is_empty() { + op_stack.push((token_idx, token.clone())); + Ok(()) + } else { + Err(String::from("syntax error (operation should be prefix)")) + } } Token::ParClose => move_till_match_paren(out_stack, op_stack), diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index 28cfcf0ec90..8582082c483 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -100,6 +100,11 @@ fn test_parenthesis() { .args(&["(", "1", "+", "1", ")", "*", "2"]) .succeeds() .stdout_only("4\n"); + + new_ucmd!() + .args(&["1", "(", ")"]) + .fails() + .stderr_only("expr: syntax error (operation should be prefix)\n"); } #[test] @@ -221,6 +226,11 @@ fn test_index() { .args(&["index", "αbcdef_f", "f"]) .succeeds() .stdout_only("6\n"); + + new_ucmd!() + .args(&["αbcdef", "index", "α"]) + .fails() + .stderr_only("expr: syntax error (operation should be prefix)\n"); } #[test] @@ -234,6 +244,11 @@ fn test_length() { .args(&["length", "abcdef"]) .succeeds() .stdout_only("6\n"); + + new_ucmd!() + .args(&["abcdef", "length"]) + .fails() + .stderr_only("expr: syntax error (operation should be prefix)\n"); } #[test] @@ -271,6 +286,11 @@ fn test_substr() { .args(&["substr", "abc", "1", "1"]) .succeeds() .stdout_only("a\n"); + + new_ucmd!() + .args(&["abc", "substr", "1", "1"]) + .fails() + .stderr_only("expr: syntax error (operation should be prefix)\n"); } #[test]