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:
parent
de68c27f31
commit
b5e0304ea7
2 changed files with 37 additions and 7 deletions
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue