protospec_build/parser/expression/
shift.rs

1use super::*;
2
3pub fn parse_shift_expression(t: &mut TokenIter) -> ParseResult<Expression> {
4    let mut expr = parse_add_expression(t)?;
5    while let Some(SpannedToken { token: op, .. }) =
6        t.eat_any(&[Token::Shl, Token::Shr, Token::ShrSigned])
7    {
8        let right = parse_add_expression(t)?;
9        expr = Expression::Binary(BinaryExpression {
10            span: *expr.span() + *right.span(),
11            op: match op {
12                Token::Shl => BinaryOp::Shl,
13                Token::Shr => BinaryOp::Shr,
14                Token::ShrSigned => BinaryOp::ShrSigned,
15                _ => unimplemented!(),
16            },
17            left: Box::new(expr),
18            right: Box::new(right),
19        })
20    }
21    Ok(expr)
22}