pub struct PrecClimber<R: Clone + 'static> { /* private fields */ }
Expand description
List of operators and precedences, which can perform precedence climbing on infix
expressions contained in a Pairs
. The token pairs contained in the Pairs
should start
with a primary pair and then alternate between an operator and a primary.
Implementations§
Source§impl<R: RuleType> PrecClimber<R>
impl<R: RuleType> PrecClimber<R>
Sourcepub fn new(ops: Vec<Operator<R>>) -> PrecClimber<R>
pub fn new(ops: Vec<Operator<R>>) -> PrecClimber<R>
Creates a new PrecClimber
from the Operator
s contained in ops
. Every entry in the
Vec
has precedence index + 1. In order to have operators with same precedence, they need
to be chained with |
between them.
§Examples
PrecClimber::new(vec![
Operator::new(Rule::plus, Assoc::Left) | Operator::new(Rule::minus, Assoc::Left),
Operator::new(Rule::times, Assoc::Left) | Operator::new(Rule::divide, Assoc::Left),
Operator::new(Rule::power, Assoc::Right)
]);
Sourcepub fn climb<P, F, G, T>(&self, pairs: P, primary: F, infix: G) -> T
pub fn climb<P, F, G, T>(&self, pairs: P, primary: F, infix: G) -> T
Performs the precedence climbing algorithm on the pairs
in a similar manner to map-reduce.
Primary pairs are mapped with primary
and then reduced to one single result with
infix
.
§Panics
Panics will occur when pairs
is empty or when the alternating primary, operator,
primary order is not respected.
§Examples
ⓘ
let primary = |pair| {
consume(pair, climber)
};
let infix = |lhs: i32, op: Pair<Rule>, rhs: i32| {
match op.rule() {
Rule::plus => lhs + rhs,
Rule::minus => lhs - rhs,
Rule::times => lhs * rhs,
Rule::divide => lhs / rhs,
Rule::power => lhs.pow(rhs as u32),
_ => unreachable!()
}
};
let result = climber.climb(pairs, primary, infix);
Trait Implementations§
Auto Trait Implementations§
impl<R> Freeze for PrecClimber<R>
impl<R> RefUnwindSafe for PrecClimber<R>where
R: RefUnwindSafe,
impl<R> Send for PrecClimber<R>
impl<R> Sync for PrecClimber<R>where
R: Sync,
impl<R> Unpin for PrecClimber<R>where
R: Unpin,
impl<R> UnwindSafe for PrecClimber<R>where
R: RefUnwindSafe + UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more