1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

expr: fix builtin functions precedence

This commit is contained in:
Tomasz Guz 2025-06-12 15:44:20 +02:00
parent de68c27f31
commit b5e0304ea7
2 changed files with 37 additions and 7 deletions

View file

@ -676,8 +676,8 @@ impl<'a, S: AsRef<str>> Parser<'a, S> {
let first = self.next()?; let first = self.next()?;
let inner = match first { let inner = match first {
"match" => { "match" => {
let left = self.parse_expression()?; let left = self.parse_simple_expression()?;
let right = self.parse_expression()?; let right = self.parse_simple_expression()?;
AstNodeInner::BinOp { AstNodeInner::BinOp {
op_type: BinOp::String(StringOp::Match), op_type: BinOp::String(StringOp::Match),
left: Box::new(left), left: Box::new(left),
@ -695,8 +695,8 @@ impl<'a, S: AsRef<str>> Parser<'a, S> {
} }
} }
"index" => { "index" => {
let left = self.parse_expression()?; let left = self.parse_simple_expression()?;
let right = self.parse_expression()?; let right = self.parse_simple_expression()?;
AstNodeInner::BinOp { AstNodeInner::BinOp {
op_type: BinOp::String(StringOp::Index), op_type: BinOp::String(StringOp::Index),
left: Box::new(left), left: Box::new(left),
@ -704,7 +704,7 @@ impl<'a, S: AsRef<str>> Parser<'a, S> {
} }
} }
"length" => { "length" => {
let string = self.parse_expression()?; let string = self.parse_simple_expression()?;
AstNodeInner::Length { AstNodeInner::Length {
string: Box::new(string), string: Box::new(string),
} }

View file

@ -508,14 +508,44 @@ fn test_substr() {
} }
#[test] #[test]
fn test_substr_precedence() { fn test_builtin_functions_precedence() {
new_ucmd!() new_ucmd!()
.args(&["substr", "ab cd", "3", "1", "!=", " "]) .args(&["substr", "ab cd", "3", "1", "!=", " "])
.fails_with_code(1) .fails_with_code(1)
.stdout_only("0\n"); .stdout_only("0\n");
new_ucmd!() 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() .succeeds()
.stdout_only("1\n"); .stdout_only("1\n");
} }