Struct pest::prec_climber::PrecClimber
source · pub struct PrecClimber<R: Clone + 'static> { /* private fields */ }
👎Deprecated since 2.4.0: Use
pest::pratt_parser
instead (it is an equivalent which also supports unary prefix/suffix operators).
While prec_climber is going to be kept in 2.x minor and patch releases, it may be removed in a future major release.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>
👎Deprecated since 2.4.0: Use pest::pratt_parser
instead (it is an equivalent which also supports unary prefix/suffix operators).
While prec_climber is going to be kept in 2.x minor and patch releases, it may be removed in a future major release.
pub fn new(ops: Vec<Operator<R>>) -> PrecClimber<R>
pest::pratt_parser
instead (it is an equivalent which also supports unary prefix/suffix operators).
While prec_climber is going to be kept in 2.x minor and patch releases, it may be removed in a future major release.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) -> Twhere
P: Iterator<Item = Pair<'i, R>>,
F: FnMut(Pair<'i, R>) -> T,
G: FnMut(T, Pair<'i, R>, T) -> T,
👎Deprecated since 2.4.0: Use pest::pratt_parser
instead (it is an equivalent which also supports unary prefix/suffix operators).
While prec_climber is going to be kept in 2.x minor and patch releases, it may be removed in a future major release.
pub fn climb<'i, P, F, G, T>(&self, pairs: P, primary: F, infix: G) -> Twhere P: Iterator<Item = Pair<'i, R>>, F: FnMut(Pair<'i, R>) -> T, G: FnMut(T, Pair<'i, R>, T) -> T,
pest::pratt_parser
instead (it is an equivalent which also supports unary prefix/suffix operators).
While prec_climber is going to be kept in 2.x minor and patch releases, it may be removed in a future major release.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);