protospec_build/parser/expression/
shift.rs1use 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}