#yard #rpn #shunting #true #to-postfix

gyard

A generic shunting yard algorithm implementation

2 releases

new 0.1.1 Apr 11, 2025
0.1.0 Apr 10, 2025

#666 in Algorithms

Download history 160/week @ 2025-04-05

163 downloads per month

MIT/Apache

23KB
424 lines

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.

No runtime deps