Crates.io | fixit |
lib.rs | fixit |
version | 0.1.1 |
source | src |
created_at | 2022-12-20 15:12:08.283984 |
updated_at | 2022-12-21 13:05:34.955156 |
description | Converts infix (human-readable) expression tokens into postfix (Reverse Polish Notation) order |
homepage | |
repository | https://github.com/dsmo7206/fixit |
max_upload_size | |
id | 742397 |
size | 18,436 |
Converts infix tokens to postfix tokens, otherwise known as https://en.wikipedia.org/wiki/Reverse_Polish_notation.
This library does not do parsing or execution of expressions, but only filters/reorders tokens to allow stack-based execution. The (possibly less efficient) alternative to stack-based execution usually involves walking an expression tree.
use fixit::{BinaryOperator, InfixToken, convert};
// Define your own operand: it could be anything.
type MyOperand = f32;
// Define your own operator.
enum MyBinaryOp {
Add,
Sub,
Mul,
Div,
}
// Assign a precedence to each operator
impl BinaryOperator for MyBinaryOp {
fn precedence(&self) -> u8 {
match self {
MyBinaryOp::Add => 1,
MyBinaryOp::Sub => 1,
MyBinaryOp::Mul => 2,
MyBinaryOp::Div => 2,
}
}
}
type MyInfixToken = InfixToken<MyOperand, MyBinaryOp>;
// The incoming `expr` tokens could have been parsed from a string via a crate like `nom` or `pest`.
// Parsing an expression like "a + b * c + d" should give:
// vec![
// InfixToken::Operand("a"), InfixToken::BinaryOp(MyBinaryOp::Add), InfixToken::Operand("b"),
// InfixToken::BinaryOp(MyBinaryOp::Mul),
// InfixToken::Operand("c"), InfixToken::BinaryOp(MyBinaryOp::Add), InfixToken::Operand("d")
// ]
fn example(expr: Vec<MyInfixToken>) {
// Convert to postfix. The result will contain:
// vec![
// PostfixToken::Operand("a"),
// PostfixToken::Operand("b"),
// PostfixToken::Operand("c"),
// PostfixToken::BinaryOp(MyBinaryOp::Mul),
// PostfixToken::BinaryOp(MyBinaryOp::Add),
// PostfixToken::Operand("d"),
// PostfixToken::BinaryOp(MyBinaryOp::Add)
// ]
let postfix_tokens = convert(expr);
// We don't aim to provide a full explanation of postfix expressions here, but
// the expression can now be evaluated by iterating over postfix tokens,
// pushing and popping values off a stack.
}
License: MIT OR Apache-2.0