Advertisement
Guest User

Untitled

a guest
May 23rd, 2025
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. Here is some rust code for how i did it (its part of a larger program so won't compile on its own)
  2. its initally called with precedence_level=0
  3. :
  4. let precedence: BTreeMap<&'static str, i16> = [
  5. ("=~", 1), ("-=", 1), ("+=", 1), ("*=", 1), ("/=", 1), ("=", 1),
  6. ("^=", 1), ("**=", 13), ("|=", 1), ("&=", 1), ("%=", 1),
  7. ("<<=", 1), (">>=", 1), ("||", 2), ("&&", 3), ("|", 4), ("^", 5),
  8. ("&", 6), ("==", 7), ("!=", 7), ("<", 8), (">", 8), ("<=", 8),
  9. (">=", 8), ("<<", 9), (">>", 9), ("+", 10), ("-", 10),
  10. ("*", 11), ("/", 11), ("%", 11), ("**", 12), ("..", 15),
  11. ]
  12. .into_iter()
  13. .collect();
  14. let right_associative: BTreeMap<&'static str, bool> = [
  15. ("=", true), ("**", true), ("**=", true), ("=~", true),
  16. ("+=", true), ("-=", true), ("*=", true), ("/=", true),
  17. ("^=", true), ("|=", true), ("&=", true), ("%=", true),
  18. ("<<=", true), (">>=", true),
  19. ]
  20. .into_iter()
  21. .collect();let precedence: BTreeMap<&'static str, i16> = [
  22. ("=~", 1), ("-=", 1), ("+=", 1), ("*=", 1), ("/=", 1), ("=", 1),
  23. ("^=", 1), ("**=", 13), ("|=", 1), ("&=", 1), ("%=", 1),
  24. ("<<=", 1), (">>=", 1), ("||", 2), ("&&", 3), ("|", 4), ("^", 5),
  25. ("&", 6), ("==", 7), ("!=", 7), ("<", 8), (">", 8), ("<=", 8),
  26. (">=", 8), ("<<", 9), (">>", 9), ("+", 10), ("-", 10),
  27. ("*", 11), ("/", 11), ("%", 11), ("**", 12), ("..", 15),
  28. ]
  29. .into_iter()
  30. .collect();
  31. let right_associative: BTreeMap<&'static str, bool> = [
  32. ("=", true), ("**", true), ("**=", true), ("=~", true),
  33. ("+=", true), ("-=", true), ("*=", true), ("/=", true),
  34. ("^=", true), ("|=", true), ("&=", true), ("%=", true),
  35. ("<<=", true), (">>=", true),
  36. ]
  37. .into_iter()
  38. .collect();
  39.  
  40.  
  41. async fn parse_expression(&mut self, precedence_level:i16) -> Object {
  42. // Scope parse_primary call to release mutable borrow of self before the loop
  43. let mut left = self.parse_primary().await;
  44. while self.pos<self.tokens.len() &&
  45. self.tokens[self.pos].name != TokenType::Eol &&
  46. self.tokens[self.pos].name != TokenType::BracketOpen &&
  47. self.tokens[self.pos].name != TokenType::BracketClose &&
  48. self.tokens[self.pos].name != TokenType::ParClose {
  49. let op=self.tokens[self.pos].value.clone();
  50. let mut prec=-1;
  51. if self.precedence.contains_key(op.clone().as_str()){
  52. prec=self.precedence[op.clone().as_str()];
  53. }
  54.  
  55. if prec < precedence_level {
  56. break;
  57. }
  58. let mut is_right=false;
  59. if self.right_associative.contains_key(op.clone().as_str()){
  60. is_right=self.right_associative[op.clone().as_str()];
  61. }
  62. let next_precedence_level=if is_right {prec} else {prec+1};
  63. self.pos+=1;
  64. let right=self.parse_expression(next_precedence_level).await;
  65. let op_node =AST::new("operator", op.clone()).await;
  66. AST::add_child(&op_node, left).await;
  67. AST::add_child(&op_node, right).await;
  68. left= Arc::clone(&op_node);
  69. }
  70. return left;
  71. }
  72.  
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement