Struct pest::prec_climber::PrecClimber
source · [−]pub struct PrecClimber<R: RuleType> { /* 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
sourceimpl<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<'i, P, F, G, T>(&self, pairs: P, primary: F, infix: G) -> T where
P: Iterator<Item = Pair<'i, R>>,
F: FnMut(Pair<'i, R>) -> T,
G: FnMut(T, Pair<'i, R>, T) -> T,
pub fn climb<'i, P, F, G, T>(&self, pairs: P, primary: F, infix: G) -> T where
P: Iterator<Item = Pair<'i, R>>,
F: FnMut(Pair<'i, R>) -> T,
G: FnMut(T, Pair<'i, R>, T) -> 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> RefUnwindSafe for PrecClimber<R> where
R: RefUnwindSafe,
impl<R> Send for PrecClimber<R> where
R: Send,
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: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more