From d2ede927367d87a79901cf45e4fee2dfa1c8f7dc Mon Sep 17 00:00:00 2001 From: ALXD Date: Mon, 20 Nov 2023 14:19:20 +0100 Subject: [PATCH 1/2] expr: make error messages align with GNU expr --- src/uu/expr/src/syntax_tree.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index c55fb0bdc..b19c13c0a 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -13,6 +13,7 @@ use num_bigint::BigInt; use num_traits::Zero; use onig::{Regex, RegexOptions, Syntax}; +use uucore::display::Quotable; use crate::tokens::Token; @@ -214,7 +215,7 @@ pub fn tokens_to_ast( assert!(op_stack.is_empty()); maybe_dump_rpn(&out_stack); - let result = ast_from_rpn(&mut out_stack); + let result = ast_from_rpn(&mut out_stack, None); if out_stack.is_empty() { maybe_dump_ast(&result); result @@ -253,9 +254,12 @@ fn maybe_dump_rpn(rpn: &TokenStack) { } } -fn ast_from_rpn(rpn: &mut TokenStack) -> Result, String> { +fn ast_from_rpn(rpn: &mut TokenStack, op_type: Option<&str>) -> Result, String> { match rpn.pop() { - None => Err("syntax error (premature end of expression)".to_owned()), + None => Err(match op_type { + Some(value) => format!("syntax error: unexpected argument {}", value.quote()), + None => "missing operand".to_owned(), + }), Some((token_idx, Token::Value { value })) => Ok(AstNode::new_leaf(token_idx, &value)), @@ -281,7 +285,7 @@ fn maybe_ast_node( ) -> Result, String> { let mut operands = Vec::with_capacity(arity); for _ in 0..arity { - let operand = ast_from_rpn(rpn)?; + let operand = ast_from_rpn(rpn, Some(op_type))?; operands.push(operand); } operands.reverse(); From 8b650a7a9b5c6356425c37fa0ef49c28c49aea76 Mon Sep 17 00:00:00 2001 From: ALXD Date: Mon, 20 Nov 2023 14:29:06 +0100 Subject: [PATCH 2/2] expr: add tests for precise error messages --- tests/by-util/test_expr.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index 28cfcf0ec..18125fe99 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -6,6 +6,14 @@ use crate::common::util::TestScenario; +#[test] +fn test_no_arguments() { + new_ucmd!() + .fails() + .code_is(2) + .stderr_only("expr: missing operand\n"); +} + #[test] fn test_simple_values() { // null or 0 => EXIT_VALUE == 1 @@ -275,6 +283,12 @@ fn test_substr() { #[test] fn test_invalid_substr() { + new_ucmd!() + .args(&["56", "substr"]) + .fails() + .code_is(2) + .stderr_only("expr: syntax error: unexpected argument 'substr'\n"); + new_ucmd!() .args(&["substr", "abc", "0", "1"]) .fails()