| Crates.io | gyard |
| lib.rs | gyard |
| version | 0.1.2 |
| created_at | 2025-04-10 10:17:36.633915+00 |
| updated_at | 2025-04-24 11:04:16.141396+00 |
| description | A generic shunting yard algorithm implementation |
| homepage | |
| repository | https://github.com/Julian-Alberts/generic_shunting_yard |
| max_upload_size | |
| id | 1628005 |
| size | 42,097 |
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.