Skip to content

Instantly share code, notes, and snippets.

@shanemikel
Created April 11, 2019 03:09
Show Gist options
  • Save shanemikel/72e4a71452a7663749c6cb030136b855 to your computer and use it in GitHub Desktop.
Save shanemikel/72e4a71452a7663749c6cb030136b855 to your computer and use it in GitHub Desktop.
pretty parse tree output (ala pest.rs)
pub fn pretty_parse_tree(pairs: Pairs<Rule>) -> String {
#[derive(Clone)]
struct State {
depth: usize,
prefix: String,
};
fn go(pairs: Pairs<Rule>, lines: &mut Vec<String>, mut state: State) {
if state.prefix.is_empty() {
let indent: String = iter::repeat(" ").take(state.depth).collect();
state.prefix = format!("{}- ", indent);
}
for pair in pairs.into_iter() {
let rule = format!("{:?}", pair.as_rule());
let repr = String::from(pair.as_str());
let pairs = pair.into_inner();
if pairs.peek().is_some() {
mem::drop(repr);
let children: Vec<_> = pairs.clone().into_iter().collect();
let child_count = children.len();
if child_count == 1 {
let mut state = state.clone();
state.prefix = format!("{}{} > ", state.prefix, rule);
go(pairs, lines, state);
} else {
lines.push(format!("{}{}", state.prefix, rule));
let mut state = state.clone();
state.depth += 1;
state.prefix = String::new();
go(pairs, lines, state);
}
} else {
lines.push(format!("{}{}: {:?}", state.prefix, rule, repr));
}
}
}
let mut lines = vec![];
go(pairs, &mut lines, State {
depth: 0,
prefix: String::new(),
});
lines.join("\n")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment