Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.29 KB | None | 0 0
  1. #[derive(Debug)]
  2. enum Lex {
  3. LeftParen,
  4. Symbol(String),
  5. RightParen,
  6. }
  7.  
  8. #[derive(Debug)]
  9.  
  10. enum Ast {
  11. Leaf(String),
  12. List(Vec<Ast>),
  13. }
  14.  
  15. use Lex::*;
  16. fn parse(lexemes: Box<Iterator<Item = Lex>>) -> (Option<(Ast, Box<Iterator<Item = Lex>>)>) {
  17. println!("parse");
  18. let mut result = Vec::new();
  19. let mut lexemes = lexemes;
  20. while let Some(l) = lexemes.next() {
  21. println!("l = {:?}", l);
  22. match l {
  23. LeftParen => {
  24. let rest = parse(lexemes).unwrap();
  25. result.push(rest.0);
  26. lexemes = rest.1
  27. }
  28. Symbol(x) => {
  29. result.push(Ast::Leaf(x));
  30. }
  31. RightParen => {
  32. return Some((Ast::List(result), lexemes));
  33. }
  34. }
  35. }
  36. if result.len() == 1 {
  37. Some((result.pop().unwrap(), lexemes))
  38. } else {
  39. None
  40. }
  41. }
  42.  
  43. fn main() {
  44. //(sresh 1 (+ 1 2) 3 7)
  45. let x = vec![
  46. LeftParen,
  47. Symbol("sresh".to_string()),
  48. LeftParen,
  49. Symbol("+".to_string()),
  50. Symbol("1".to_string()),
  51. Symbol("2".to_string()),
  52. RightParen,
  53. Symbol("3".to_string()),
  54. Symbol("7".to_string()),
  55. RightParen,
  56. ];
  57. println!("new: {:?}", parse(Box::new(x.into_iter())).unwrap().0)
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement