Skip to content

Commit b5e0304

Browse files
committed
expr: fix builtin functions precedence
1 parent de68c27 commit b5e0304

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

src/uu/expr/src/syntax_tree.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,8 @@ impl<'a, S: AsRef<str>> Parser<'a, S> {
676676
let first = self.next()?;
677677
let inner = match first {
678678
"match" => {
679-
let left = self.parse_expression()?;
680-
let right = self.parse_expression()?;
679+
let left = self.parse_simple_expression()?;
680+
let right = self.parse_simple_expression()?;
681681
AstNodeInner::BinOp {
682682
op_type: BinOp::String(StringOp::Match),
683683
left: Box::new(left),
@@ -695,16 +695,16 @@ impl<'a, S: AsRef<str>> Parser<'a, S> {
695695
}
696696
}
697697
"index" => {
698-
let left = self.parse_expression()?;
699-
let right = self.parse_expression()?;
698+
let left = self.parse_simple_expression()?;
699+
let right = self.parse_simple_expression()?;
700700
AstNodeInner::BinOp {
701701
op_type: BinOp::String(StringOp::Index),
702702
left: Box::new(left),
703703
right: Box::new(right),
704704
}
705705
}
706706
"length" => {
707-
let string = self.parse_expression()?;
707+
let string = self.parse_simple_expression()?;
708708
AstNodeInner::Length {
709709
string: Box::new(string),
710710
}

tests/by-util/test_expr.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,14 +508,44 @@ fn test_substr() {
508508
}
509509

510510
#[test]
511-
fn test_substr_precedence() {
511+
fn test_builtin_functions_precedence() {
512512
new_ucmd!()
513513
.args(&["substr", "ab cd", "3", "1", "!=", " "])
514514
.fails_with_code(1)
515515
.stdout_only("0\n");
516516

517517
new_ucmd!()
518-
.args(&["substr", "ab cd", "2", "1", "!=", " "])
518+
.args(&["substr", "ab cd", "3", "1", "=", " "])
519+
.succeeds()
520+
.stdout_only("1\n");
521+
522+
new_ucmd!()
523+
.args(&["length", "abcd", "!=", "4"])
524+
.fails_with_code(1)
525+
.stdout_only("0\n");
526+
527+
new_ucmd!()
528+
.args(&["length", "abcd", "=", "4"])
529+
.succeeds()
530+
.stdout_only("1\n");
531+
532+
new_ucmd!()
533+
.args(&["index", "abcd", "c", "!=", "3"])
534+
.fails_with_code(1)
535+
.stdout_only("0\n");
536+
537+
new_ucmd!()
538+
.args(&["index", "abcd", "c", "=", "3"])
539+
.succeeds()
540+
.stdout_only("1\n");
541+
542+
new_ucmd!()
543+
.args(&["match", "abcd", "ab\\(.*\\)", "!=", "cd"])
544+
.fails_with_code(1)
545+
.stdout_only("0\n");
546+
547+
new_ucmd!()
548+
.args(&["match", "abcd", "ab\\(.*\\)", "=", "cd"])
519549
.succeeds()
520550
.stdout_only("1\n");
521551
}

0 commit comments

Comments
 (0)