2 releases
new 0.1.1 | Apr 11, 2025 |
---|---|
0.1.0 | Apr 10, 2025 |
#666 in Algorithms
163 downloads per month
23KB
424 lines
Generic Shunting Yard
The gyard crate is a generic implementation of the shunting yard algorythm with support for funtions. Not more not less.
use gyard::{InputToken, OutputToken, op::Math, to_postfix};
// 5 + 2 * sin(123)
let infix = [
InputToken::Value(5),
InputToken::Operator(Math::Add),
InputToken::Value(2),
InputToken::Operator(Math::Mul),
InputToken::Function("sin"),
InputToken::LeftParen,
InputToken::Value(123),
InputToken::RightParen,
];
let postfix = to_postfix(infix);
assert_eq!(postfix, Ok(vec![
OutputToken::Value(5),
OutputToken::Value(2),
OutputToken::Value(123),
OutputToken::Function("sin"),
OutputToken::Operator(Math::Mul),
OutputToken::Operator(Math::Add),
]));
You can define your own operators using the gyard::Operator
trait.
pub struct MyOp;
impl gyard::Operator for MyOp {
fn precedence(&self) -> usize {
10
}
fn is_left_associative(&self) -> bool {
true
}
}
The default operator implementations use the precedence defined in JavaScript.
Values and functions do not require any special traits.