| ... | @@ -1,5 +1,4 @@ | ... | @@ -1,5 +1,4 @@ |
| 1 | use ast::Associativity::*; | 1 | use ast::{Associativity, BinaryOperator, Expr, ExprData, OperatorLevel}; |
| 2 | use ast::{BinaryOperator, Expr, ExprData, OperatorLevel}; | | |
| 3 | use log::Range; | 2 | use log::Range; |
| 4 | use miette::Result; | 3 | use miette::Result; |
| 5 | | 4 | |
| ... | @@ -19,25 +18,8 @@ pub fn parse_expr(p: &mut Parser) -> Result<Expr> { | ... | @@ -19,25 +18,8 @@ pub fn parse_expr(p: &mut Parser) -> Result<Expr> { |
| 19 | if let Some(token) = p.peek() { | 18 | if let Some(token) = p.peek() { |
| 20 | if let Some(level) = BinaryOperator::from_token(&token).map(|o| o.level()) { | 19 | if let Some(level) = BinaryOperator::from_token(&token).map(|o| o.level()) { |
| 21 | _ = p.next(); | 20 | _ = p.next(); |
| 22 | match level.associativity() { | 21 | expr = |
| 23 | RightToLeft => { | 22 | parse_expr_binary(p, BinaryOperator::from_token(&token).unwrap(), expr, level)?; |
| 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 | } | | |
| 41 | continue; | 23 | continue; |
| 42 | } | 24 | } |
| 43 | } | 25 | } |
| ... | @@ -60,27 +42,16 @@ fn parse_expr_binary( | ... | @@ -60,27 +42,16 @@ fn parse_expr_binary( |
| 60 | loop { | 42 | loop { |
| 61 | if let Some(token) = p.peek() { | 43 | if let Some(token) = p.peek() { |
| 62 | if let Some(new_level) = BinaryOperator::from_token(&token).map(|o| o.level()) { | 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 | _ = p.next(); | 48 | _ = p.next(); |
| 65 | match new_level.associativity() { | 49 | right = parse_expr_binary( |
| 66 | RightToLeft => { | 50 | p, |
| 67 | right = parse_expr_binary( | 51 | BinaryOperator::from_token(&token).unwrap(), |
| 68 | p, | 52 | right, |
| 69 | BinaryOperator::from_token(&token).unwrap(), | 53 | new_level, |
| 70 | right, | 54 | )?; |
| 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 | } | | |
| 84 | continue; | 55 | continue; |
| 85 | } | 56 | } |
| 86 | } | 57 | } |