Skip to content

Commit 904b010

Browse files
committed
Reverse the Repeat expressions
Railroad renders these in reverse order, but our grammar isn't written that way.
1 parent 07cb674 commit 904b010

File tree

1 file changed

+22
-13
lines changed

1 file changed

+22
-13
lines changed

mdbook-spec/src/grammar/render_railroad.rs

+22-13
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl Production {
6868
stack: bool,
6969
link_map: &HashMap<String, String>,
7070
) -> Diagram<Box<dyn Node>> {
71-
let n = self.expression.render_railroad(stack, link_map);
71+
let n = self.expression.render_railroad(stack, link_map, false);
7272
let seq: Sequence<Box<dyn Node>> =
7373
Sequence::new(vec![Box::new(SimpleStart), n.unwrap(), Box::new(SimpleEnd)]);
7474
let vert = VerticalGrid::<Box<dyn Node>>::new(vec![
@@ -85,28 +85,34 @@ impl Expression {
8585
&self,
8686
stack: bool,
8787
link_map: &HashMap<String, String>,
88+
reverse: bool,
8889
) -> Option<Box<dyn Node>> {
8990
let n: Box<dyn Node> = match &self.kind {
9091
ExpressionKind::Grouped(e) => {
9192
// I don't think this needs anything special. The grouped
9293
// expression is usually an Alt or Optional or something like
9394
// that which ends up as a distinct railroad node. But I'm not
9495
// sure.
95-
e.render_railroad(stack, link_map)?
96+
e.render_railroad(stack, link_map, reverse)?
9697
}
9798
ExpressionKind::Alt(es) => {
9899
let choices: Vec<_> = es
99100
.iter()
100-
.map(|e| e.render_railroad(stack, link_map))
101+
.map(|e| e.render_railroad(stack, link_map, reverse))
101102
.filter_map(|n| n)
102103
.collect();
103104
Box::new(Choice::<Box<dyn Node>>::new(choices))
104105
}
105106
ExpressionKind::Sequence(es) => {
106-
let make_seq = |es: &[Expression]| {
107+
let mut es: Vec<_> = es.iter().collect();
108+
// For reversing, see ::Repeat for an explanation.
109+
if reverse {
110+
es.reverse();
111+
}
112+
let make_seq = |es: &[&Expression]| {
107113
let seq: Vec<_> = es
108114
.iter()
109-
.map(|e| e.render_railroad(stack, link_map))
115+
.map(|e| e.render_railroad(stack, link_map, reverse))
110116
.filter_map(|n| n)
111117
.collect();
112118
let seq: Sequence<Box<dyn Node>> = Sequence::new(seq);
@@ -142,35 +148,38 @@ impl Expression {
142148
Box::new(Stack::new(breaks))
143149
}
144150
} else {
145-
make_seq(es)
151+
make_seq(&es)
146152
}
147153
}
148154
ExpressionKind::Optional(e) => {
149-
let n = e.render_railroad(stack, link_map)?;
155+
let n = e.render_railroad(stack, link_map, reverse)?;
150156
Box::new(Optional::new(n))
151157
}
152158
ExpressionKind::Repeat(e) => {
153-
let n = e.render_railroad(stack, link_map)?;
159+
// Railroad renders everything in the opposite order. However,
160+
// our grammar is not written that way, so we need to undo the
161+
// reversal.
162+
let n = e.render_railroad(stack, link_map, !reverse)?;
154163
Box::new(Repeat::new(railroad::Empty, n))
155164
}
156165
ExpressionKind::RepeatNonGreedy(e) => {
157-
let n = e.render_railroad(stack, link_map)?;
166+
let n = e.render_railroad(stack, link_map, !reverse)?;
158167
let r = Box::new(Repeat::new(railroad::Empty, n));
159168
let lbox = LabeledBox::new(r, Comment::new("non-greedy".to_string()));
160169
Box::new(lbox)
161170
}
162171
ExpressionKind::RepeatPlus(e) => {
163-
let n = e.render_railroad(stack, link_map)?;
172+
let n = e.render_railroad(stack, link_map, reverse)?;
164173
Box::new(Repeat::new(n, railroad::Empty))
165174
}
166175
ExpressionKind::RepeatPlusNonGreedy(e) => {
167-
let n = e.render_railroad(stack, link_map)?;
176+
let n = e.render_railroad(stack, link_map, reverse)?;
168177
let r = Repeat::new(n, railroad::Empty);
169178
let lbox = LabeledBox::new(r, Comment::new("non-greedy".to_string()));
170179
Box::new(lbox)
171180
}
172181
ExpressionKind::RepeatRange(e, a, b) => {
173-
let n = e.render_railroad(stack, link_map)?;
182+
let n = e.render_railroad(stack, link_map, reverse)?;
174183
let cmt = match (a, b) {
175184
(Some(a), Some(b)) => format!("repeat between {a} and {b} times"),
176185
(None, Some(b)) => format!("repeat at most {b} times"),
@@ -189,7 +198,7 @@ impl Expression {
189198
Box::new(Choice::<Box<dyn Node>>::new(ns))
190199
}
191200
ExpressionKind::NegExpression(e) => {
192-
let n = e.render_railroad(stack, link_map)?;
201+
let n = e.render_railroad(stack, link_map, reverse)?;
193202
let lbox = LabeledBox::new(n, Comment::new("any character except".to_string()));
194203
Box::new(lbox)
195204
}

0 commit comments

Comments
 (0)