| ... | ... | @@ -1,5 +1,4 @@ |
| 1 | | use ast::Associativity::*; |
| 2 | | use ast::{BinaryOperator, Expr, ExprData, OperatorLevel}; |
| 1 | use ast::{Associativity, BinaryOperator, Expr, ExprData, OperatorLevel}; |
| 3 | 2 | use log::Range; |
| 4 | 3 | use miette::Result; |
| 5 | 4 | |
| ... | ... | @@ -19,25 +18,8 @@ pub fn parse_expr(p: &mut Parser) -> Result<Expr> { |
| 19 | 18 | if let Some(token) = p.peek() { |
| 20 | 19 | if let Some(level) = BinaryOperator::from_token(&token).map(|o| o.level()) { |
| 21 | 20 | _ = p.next(); |
| 22 | | match level.associativity() { |
| 23 | | RightToLeft => { |
| 24 | | expr = parse_expr_binary( |
| 25 | | p, |
| 26 | | BinaryOperator::from_token(&token).unwrap(), |
| 27 | | expr, |
| 28 | | level, |
| 29 | | )?; |
| 30 | | } |
| 31 | | LeftToRight => { |
| 32 | | // TODO(@paperdave): TODO |
| 33 | | expr = parse_expr_binary( |
| 34 | | p, |
| 35 | | BinaryOperator::from_token(&token).unwrap(), |
| 36 | | expr, |
| 37 | | level, |
| 38 | | )?; |
| 39 | | } |
| 40 | | } |
| 21 | expr = |
| 22 | parse_expr_binary(p, BinaryOperator::from_token(&token).unwrap(), expr, level)?; |
| 41 | 23 | continue; |
| 42 | 24 | } |
| 43 | 25 | } |
| ... | ... | @@ -60,27 +42,16 @@ fn parse_expr_binary( |
| 60 | 42 | loop { |
| 61 | 43 | if let Some(token) = p.peek() { |
| 62 | 44 | if let Some(new_level) = BinaryOperator::from_token(&token).map(|o| o.level()) { |
| 63 | | if new_level <= level { |
| 45 | if (level.associativity() == Associativity::LeftToRight && new_level < level) |
| 46 | || (level.associativity() == Associativity::RightToLeft && new_level <= level) |
| 47 | { |
| 64 | 48 | _ = p.next(); |
| 65 | | match new_level.associativity() { |
| 66 | | RightToLeft => { |
| 67 | | right = parse_expr_binary( |
| 68 | | p, |
| 69 | | BinaryOperator::from_token(&token).unwrap(), |
| 70 | | right, |
| 71 | | new_level, |
| 72 | | )?; |
| 73 | | } |
| 74 | | LeftToRight => { |
| 75 | | // TODO(@paperdave): TODO |
| 76 | | right = parse_expr_binary( |
| 77 | | p, |
| 78 | | BinaryOperator::from_token(&token).unwrap(), |
| 79 | | right, |
| 80 | | new_level, |
| 81 | | )?; |
| 82 | | } |
| 83 | | } |
| 49 | right = parse_expr_binary( |
| 50 | p, |
| 51 | BinaryOperator::from_token(&token).unwrap(), |
| 52 | right, |
| 53 | new_level, |
| 54 | )?; |
| 84 | 55 | continue; |
| 85 | 56 | } |
| 86 | 57 | } |