ojas11

Untitled

Aug 20th, 2021
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. fn parse_rev_recursive(tokens: &mut std::iter::Peekable<std::slice::Iter<(Token, Span)>>) -> Expr {
  2. // .a.b
  3. // a..b
  4. // a.(b..a)
  5. // )a(
  6. // .....a
  7.  
  8. match tokens.next().unwrap() {
  9. (Token::Operator, span) => {
  10. let expr = Box::new(parse_rev_recursive(tokens));
  11. Expr::Unop {
  12. expr, op: span.clone()
  13. }
  14. }
  15. (Token::Identifier, span) => {
  16. match tokens.peek() {
  17. Some((Token::Operator, op_span)) => {
  18. tokens.next();
  19. let rhs = Box::new(Expr::Ident(span.clone()));
  20. let lhs = Box::new(parse_rev_recursive(tokens));
  21. Expr::Binop {
  22. rhs, op: op_span.clone(), lhs
  23. }
  24. }
  25. Some((Token::ParenLeft, _)) | None => Expr::Ident(span.clone()),
  26. _ => panic!("bruh moment"),
  27. }
  28. }
  29. (Token::ParenRight, span) => {
  30. let expr = Box::new(parse_rev_recursive(tokens));
  31. let (l_token, l_span) = tokens.next().unwrap();
  32. assert_eq!(*l_token, Token::ParenLeft);
  33. Expr::Paren {
  34. r: span.clone(), expr, l: l_span.clone(),
  35. }
  36. }
  37. _ => panic!("wtf"),
  38. }
  39. }
  40.  
  41. fn parse_expr_reverse(tokens: &[(Token, Span)]) -> Option<Expr> {
  42. if tokens.is_empty() {
  43. return None;
  44. }
  45. let mut tokens = tokens.iter().peekable();
  46.  
  47. Some(parse_rev_recursive(&mut tokens))
  48. }
Add Comment
Please, Sign In to add comment