@@ -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