gyard

Crates.iogyard
lib.rsgyard
version0.1.2
created_at2025-04-10 10:17:36.633915+00
updated_at2025-04-24 11:04:16.141396+00
descriptionA generic shunting yard algorithm implementation
homepage
repositoryhttps://github.com/Julian-Alberts/generic_shunting_yard
max_upload_size
id1628005
size42,097
Julian Alberts (Julian-Alberts)

documentation

README

Generic Shunting Yard

Crates.io Crates.io GitHub Workflow Status (with branch)

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.

Commit count: 33

cargo fmt