Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. use std::cmp::Ordering;
  2.  
  3. #[derive(Debug)]
  4. struct Node {
  5. name: String,
  6. children: Vec<Node>,
  7. }
  8.  
  9. impl Node {
  10. fn new(name: &str) -> Node {
  11. Node {
  12. name: name.to_string(),
  13. children: Vec::new(),
  14. }
  15. }
  16. }
  17.  
  18. #[derive(Debug)]
  19. pub enum Token {
  20. Indent,
  21. Dedent,
  22. Node(String),
  23. }
  24.  
  25. const TEST_STRING:&str=r#"alpha
  26. beta
  27. gamma
  28. delta
  29. epsilon
  30. theta
  31. iota
  32. kappa"#;
  33.  
  34. fn parse(input: &str) -> Node {
  35. //lex
  36. let lines = input.split("\n");
  37. let mut indent_stack = vec![0];
  38.  
  39. let mut tokens = Vec::new();
  40.  
  41. for s in lines {
  42. let indent = s.chars().take_while(|c| *c == ' ').count();
  43. match indent.cmp(indent_stack.last().unwrap()) {
  44. Ordering::Equal => {
  45. // do nothing
  46. },
  47. Ordering::Greater => {
  48. indent_stack.push(indent);
  49. tokens.push(Token::Indent);
  50. },
  51. Ordering::Less => {
  52. while indent_stack.pop().unwrap() > indent {
  53. tokens.push(Token::Dedent);
  54. }
  55. }
  56. }
  57. if s.trim() == "" {
  58. continue;
  59. }
  60. tokens.push(Token::Node(s.trim().to_string()));
  61. }
  62.  
  63. fn parse_node(tokens: &[Token]) -> Result<(&[Token], Node), ()> {
  64. let mut new_node;
  65. if let Some(Token::Node(ref name_ref)) = tokens.get(0) {
  66. new_node = Node::new(name_ref);
  67. } else { // not headed by `Token::Node`
  68. return Err(())
  69. }
  70. // advance
  71. let tokens = &tokens[1..];
  72. if let Some(Token::Indent) = tokens.get(0) {
  73. // children
  74. let mut tokens = &tokens[1..];
  75. while let Ok((remainder, child)) = parse_node(tokens) {
  76. tokens = remainder;
  77. new_node.children.push(child);
  78. }
  79. return match tokens.get(0) {
  80. Some(Token::Dedent) => Ok((&tokens[1..], new_node)),
  81. None => Ok((tokens, new_node)),
  82. _ => Err(())
  83. }
  84. }
  85. Ok((tokens, new_node))
  86. }
  87.  
  88. parse_node(&tokens).unwrap().1
  89.  
  90. /*
  91. // parse
  92. let mut indent_level = 0;
  93. let mut root_node = Node::new("<root>");
  94. let mut node_ref_stack: Vec<&mut Node> = Vec::new();
  95.  
  96. node_ref_stack.push(&mut root_node);
  97.  
  98. for token in &tokens {
  99. match token {
  100. Token::Indent => {
  101. let new_indent = indent_level + 1;
  102.  
  103. node_ref_stack.push(node_ref_stack.last_mut().unwrap().children.last_mut().unwrap());
  104.  
  105. indent_level = new_indent;
  106. },
  107. Token::Dedent => {
  108. indent_level = indent_level - 1;
  109. },
  110. Token::Node(name) => {
  111. &mut node_ref_stack.last_mut().unwrap().children.push(Node::new(name));
  112. },
  113. }
  114. }
  115. root_node
  116. */
  117. }
  118.  
  119. fn main() {
  120. let tree = parse(TEST_STRING);
  121.  
  122. println!("{:#?}", tree);
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement