mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2026-01-21 12:41:13 +00:00
cargo fmt
This commit is contained in:
parent
15722e3ace
commit
5af8503a5e
119 changed files with 1270 additions and 923 deletions
|
|
@ -12,8 +12,8 @@
|
|||
//! * https://en.wikipedia.org/wiki/Shunting-yard_algorithm
|
||||
//!
|
||||
|
||||
use tokens::Token;
|
||||
use onig::{Regex, RegexOptions, Syntax};
|
||||
use tokens::Token;
|
||||
|
||||
type TokenStack = Vec<(usize, Token)>;
|
||||
pub type OperandsList = Vec<Box<ASTNode>>;
|
||||
|
|
@ -85,25 +85,27 @@ impl ASTNode {
|
|||
ASTNode::Node { ref op_type, .. } => match self.operand_values() {
|
||||
Err(reason) => Err(reason),
|
||||
Ok(operand_values) => match op_type.as_ref() {
|
||||
"+" => infix_operator_two_ints(|a: i64, b: i64| {
|
||||
checked_binop(|| a.checked_add(b), "+")
|
||||
}, &operand_values
|
||||
"+" => infix_operator_two_ints(
|
||||
|a: i64, b: i64| checked_binop(|| a.checked_add(b), "+"),
|
||||
&operand_values,
|
||||
),
|
||||
"-" => infix_operator_two_ints(|a: i64, b: i64| {
|
||||
checked_binop(|| a.checked_sub(b), "-")
|
||||
}, &operand_values
|
||||
"-" => infix_operator_two_ints(
|
||||
|a: i64, b: i64| checked_binop(|| a.checked_sub(b), "-"),
|
||||
&operand_values,
|
||||
),
|
||||
"*" => infix_operator_two_ints(|a: i64, b: i64| {
|
||||
checked_binop(|| a.checked_mul(b), "*")
|
||||
}, &operand_values
|
||||
"*" => infix_operator_two_ints(
|
||||
|a: i64, b: i64| checked_binop(|| a.checked_mul(b), "*"),
|
||||
&operand_values,
|
||||
),
|
||||
"/" => infix_operator_two_ints(|a: i64, b: i64| {
|
||||
"/" => infix_operator_two_ints(
|
||||
|a: i64, b: i64| {
|
||||
if b == 0 {
|
||||
Err("division by zero".to_owned())
|
||||
} else {
|
||||
checked_binop(|| a.checked_div(b), "/")
|
||||
}
|
||||
}, &operand_values
|
||||
},
|
||||
&operand_values,
|
||||
),
|
||||
"%" => infix_operator_two_ints(
|
||||
|a: i64, b: i64| {
|
||||
|
|
@ -299,18 +301,29 @@ fn push_token_to_either_stack(
|
|||
op_stack: &mut TokenStack,
|
||||
) -> Result<(), String> {
|
||||
let result = match *token {
|
||||
Token::Value { .. } => { out_stack.push((token_idx, token.clone())); Ok(()) },
|
||||
Token::Value { .. } => {
|
||||
out_stack.push((token_idx, token.clone()));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Token::InfixOp { .. } => if op_stack.is_empty() {
|
||||
Token::InfixOp { .. } => {
|
||||
if op_stack.is_empty() {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
Ok(())
|
||||
} else {
|
||||
push_op_to_stack(token_idx, token, out_stack, op_stack)
|
||||
}
|
||||
}
|
||||
|
||||
Token::PrefixOp { .. } => {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
Ok(())
|
||||
} else {
|
||||
push_op_to_stack(token_idx, token, out_stack, op_stack)
|
||||
},
|
||||
}
|
||||
|
||||
Token::PrefixOp { .. } => { op_stack.push((token_idx, token.clone())); Ok(()) },
|
||||
|
||||
Token::ParOpen => { op_stack.push((token_idx, token.clone())); Ok(()) },
|
||||
Token::ParOpen => {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Token::ParClose => move_till_match_paren(out_stack, op_stack),
|
||||
};
|
||||
|
|
@ -352,7 +365,10 @@ fn push_op_to_stack(
|
|||
{
|
||||
loop {
|
||||
match op_stack.last() {
|
||||
None => { op_stack.push((token_idx, token.clone())); return Ok(()) },
|
||||
None => {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
Some(&(_, Token::ParOpen)) => {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
|
|
@ -365,12 +381,14 @@ fn push_op_to_stack(
|
|||
precedence: prev_prec,
|
||||
..
|
||||
},
|
||||
)) => if la && prev_prec >= prec || !la && prev_prec > prec {
|
||||
out_stack.push(op_stack.pop().unwrap())
|
||||
} else {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
return Ok(());
|
||||
},
|
||||
)) => {
|
||||
if la && prev_prec >= prec || !la && prev_prec > prec {
|
||||
out_stack.push(op_stack.pop().unwrap())
|
||||
} else {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
Some(&(_, Token::PrefixOp { .. })) => {
|
||||
op_stack.push((token_idx, token.clone()));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue